![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
常见数据结构和算法
数据结构和算法
笙南
这个作者很懒,什么都没留下…
展开
-
字符串匹配算法( BF 和 RK )
BF算法(Brute Force)- 暴力匹配算法先了解两个概念,主串和模式串,比如在字符串 A 中查找字符串 B,那么 A 就是主串,长度是 n,B 就是模式串,长度是 m。在匹配的过程中,假设 n = 10,m = 3,将主串拆分成【012、123、234、345、456、567、678、789】这些子串,然后将模式串分别和以上子串逐个对比,每次对比 3 个字符,一共对比 8 次(8个子串...原创 2019-05-07 22:57:02 · 262 阅读 · 0 评论 -
数组是什么(ArrayList)
数组是一种线性表数据结构,它用一组连续的内存空间,来存储一组具有相同类型的数据。一 访问数组适合查找操作,排好序的数组,用二分法查找,时间复杂度是O(logn)。数组支持随机访问,根据下标随机访问的时间复杂度是O(1)。二 插入如果在数组末尾插入,不需要移动数据,时间复杂度是O(1),如果在数组的开头插入元素,那么所有的数据都要一次往后移动一位,最坏时间复杂度是O(n)。如果数组中的数据...原创 2019-03-26 17:34:49 · 286 阅读 · 0 评论 -
链表是什么(循环链表、双向链表)
链表链表不需要一块连续的内存空间,它通过指针将一组零散的内存块串联起来使用。其中每个内存块叫做链表的结点,记录下个结点地址的指针叫做后继指针。一 单链表链表的插入和删除是非常快速的,因为不需要做数据搬移,但是链表想要随机访问第k个元素就没有数组那么高效了,因为链表的数据不是连续的,没办法将首地址和下标带入寻址公式直接计算出对应的内存地址,而是需要根据指针一个结点一个结点的一次遍历,直到找到相...原创 2019-03-28 13:13:40 · 2709 阅读 · 0 评论 -
栈是什么(支持动态扩容的顺序栈、链式栈)
栈是一种’操作受限’的线性表,只允许在一端插入和删除数据,并且满足后进先出,先进后出的特性。实际上,栈既可以用数组来实现,也可以用链表来实现,分别叫做顺序栈和链式栈。一、如何用数组来实现一个栈 ?/** 用数组实现一个栈,又称顺序栈*/public class ArrayStack { private String[] items;//数组 private int c...原创 2019-04-02 00:02:59 · 1251 阅读 · 1 评论 -
队列是什么(顺序队列、链式队列、循环队列、阻塞队列、并发队列)
一、了解线程池我们知道,CPU资源是有限的,任务的处理速度与线程个数并不是线性正相关。相反,过多的线程反而会导致CPU频繁切换,处理性能下降。所以,线程池的大小一般都是综合考虑要处理任务的特点和硬件环境,来事先设置的。另外,当线程池没有空闲线程时,新的任务请求线程资源时,我们一般有两种处理策略,第一种是非阻塞的处理方式,直接拒绝任务请求;另一种是阻塞的处理方式,将请求排队,等到有空闲线程时...原创 2019-04-17 22:09:25 · 797 阅读 · 0 评论 -
递归是什么,看完这篇文章保证你能理解递归!
一、递归对于我个人而言有人说,递归是一种优雅的问题解决办法,有人说,递归是一种算法或者一种编程技巧,其实无论别人怎么说,我相信大多数人初学 “递” “归” 的时候纠结去的过程叫“递”,回来的过程叫“归”,那么问题来了,去的时候做了什么,什么时候回来,回来的时候又做了什么?那我们带着问题继续阅读吧!二、正确姿势理解递归每个递归函数都有基线条件和递归条件两个部分:基线条件又可以理解成是终止条件,...原创 2019-04-18 00:45:34 · 4666 阅读 · 1 评论 -
散列表是什么(散列函数、散列冲突、HashMap、LinkedHashMap)
一、什么是散列表 ?散列表用的是数组支持下标随机访问数据的特性,所以散列表其实就是数组的一种扩展,由数组演化而来。举个例子,我们将参赛选手设置一个编号,比如051167,表示 5 年级 11 班 67 号选手,然后在数组索引下标对应 67 的位置存储该选手,这就是典型的散列思想,我们将参赛选手的编号叫做键(key)或者关键字,用它来标识一个选手,把参赛编号转化为数组下标的映射方法就叫作散列函数...原创 2019-04-24 22:28:15 · 8015 阅读 · 6 评论