数据结构和算法汇总

数据结构和算法
以weiss的数据结构和算法,以及算法导论为纲,另外参考July和左程云的书籍和代码。
https://github.com/julycoding/The-Art-Of-Programming-By-July
数据结构 数组
链表
http://www.cnblogs.com/wangyingli/p/5928258.html
http://www.cnblogs.com/flash610/archive/2013/05/14/3078251.html
https://blog.csdn.net/u010275850/article/details/46011951
https://blog.csdn.net/ajian005/article/details/53196224
https://blog.csdn.net/judyge/article/details/42396079
可分为:单链表,双向链表,双端链表,循环链表。
双向和双端区别:https://blog.csdn.net/qq_29606255/article/details/76408285

数据结构 实现方式
数组/单链表
队列 数组/双端链表
优先级队列 数组/堆/有序链表
双端队列 双向链表
栈Stack、队列Queue
栈比较简单:Stack,LinkedList等
队列几种特殊的:
https://blog.csdn.net/beautiful_face/article/details/76693412
https://blog.csdn.net/u011983531/article/details/78651466
https://www.cnblogs.com/lemon-flm/p/7877898.html
Queue的实现
  1. 没有实现的阻塞接口的LinkedList: 实现了java.util.Queue接口和java.util.AbstractQueue接口
    内置的不阻塞队列: PriorityQueue 和 ConcurrentLinkedQueue
    PriorityQueue 和 ConcurrentLinkedQueue 类在 Collection Framework 中加入两个具体集合实现。
    PriorityQueue 类实质上维护了一个有序列表。加入到 Queue 中的元素根据它们的天然排序(通过其 java.util.Comparable 实现)或者根据传递给构造函数的 java.util.Comparator 实现来定位。
    ConcurrentLinkedQueue 是基于链接节点的、线程安全的队列。并发访问不需要同步。因为它在队列的尾部添加元素并从头部删除它们,所以只要不需要知道队列的大 小,ConcurrentLinkedQueue 对公共集合的共享访问就可以工作得很好。收集关于队列大小的信息会很慢,需要遍历队列。
  2. 实现阻塞接口的:
    java.util.concurrent 中加入了 BlockingQueue 接口和五个阻塞队列类。它实质上就是一种带有一点扭曲的 FIFO 数据结构。不是立即从队列中添加或者删除元素,线程执行操作阻塞,直到有空间或者元素可用。
    五个队列所提供的各有不同:
    * ArrayBlockingQueue :一个由数组支持的有界队列。
    * LinkedBlockingQueue :一个由链接节点支持的可选有界队列。
    * PriorityBlockingQueue :一个由优先级堆支持的无界优先级队列。
    * DelayQueue :一个由优先级堆支持的、基于时间的调度队列。
    * SynchronousQueue :一个利用 BlockingQueue 接口的简单聚集(rendezvous)机制。
优先队列(堆)
https://www.cnblogs.com/wuchanming/p/3809496.html
可分为:二叉堆,d-堆,左式堆,斜堆,二项队列
跳表
https://www.cnblogs.com/a8457013/p/8251967.html

树的分类
https://zh.wikipedia.org/wiki/AVL%E6%A0%91
- 二叉树 **二叉查找树(BST)** 笛卡尔树 MVP树 Top tree T树 - 自平衡二叉查找树 AA树 **AVL树** 左倾红黑树 **红黑树** 替罪羊树 **伸展树** 树堆 加权平衡树 - B树 **B+树** B*树 Bx树 UB树 2-3树 2-3-4树 (a,b)-树 Dancing tree H树 - 堆 **二叉堆** 二项堆 斐波那契堆 左偏树 配对堆 斜堆 Van Emde Boas tree - Trie **后缀树** 基数树 三叉查找树 X-快速前缀树 Y-快速前缀树

【数据结构和算法汇总】以上标黑的为重点关注项
AVL树:https://zh.wikipedia.org/wiki/AVL%E6%A0%91
伸展树Splay:
Treap树:
SBTree树
RBTree树
B树
R树
区间树
二叉堆
Trie树

图的分类
http://www.cnblogs.com/wangyingli/p/5974508.html
https://blog.csdn.net/xujingzhou/article/details/79874835
图算法
https://blog.csdn.net/simanstar/article/details/78906825
https://blog.csdn.net/wsh6759/article/details/7008407
https://blog.csdn.net/gqtcgq/article/details/45618279
最短路径的Floyd算法
拓扑排序
union-find算法
无环加权有向图的最短路径算法
关键路径
计算无向图中连通分量的Kosaraju算法
有向图中含必经点的最短路径问题
TSP问题
还有A*算法
散列
算法 查找算法
http://www.cnblogs.com/wangyingli/p/5994282.html
排序算法
http://www.cnblogs.com/wangyingli/p/5994256.html
分治算法
贪心算法
动态规划
搜索算法
回溯算法,随机化算法
方案设计 1.分治法:
将问题分成单独的阶段,每个阶段互相不干扰很独立,如10米长的木棍,切成10段,每段去解决每一段的问题。(阶段没有关系)
2.贪心法
站在全局的角度,也是将问题堪称分为多个阶段,只不过阶段和阶段之间有一定的递进关系,如从5毛,1元,2毛,1毛,2元中,去找最少的钱币构成10块钱。首先是站在全局的角度,先从中取其最大值,为第一阶段,然后在从剩余的当中在找最大值,构成第二阶段。。。。。。如此往复,这就是贪心法。

3.动态规划
是阶段和阶段之间有重复,举例说明:求一个数组的最长递增子序列。假设数组有10个元素,那么如何求解呢?将10个元素划分成10个阶段,第一个阶段,从第一个元素中求解,第二个阶段在第一个阶段求其解,第三个阶段在第一个,第二个阶段综合的基础上求解,第四个阶段在第1,2,3个阶段求其解,最后。。。。第k个阶段在第1,2....k-1个阶段求其最优解。

4.递归算法
个人感觉和动态规划反着来的样子,有点像,问题规模为10,转化为问题规模为9的问题,,问题规模为9的问题,转化为8.。。。。。

5.回溯法和分支限界法
都属于组合优化问题,就是按照过程向下面去寻找最优解,在寻找最优解的过程,不断的剪取枝条,来减少搜索情况。不行就换思路。
递推,搜索,贪心和动态规划的思想都是通过拆分问题,定义状态和状态之间的关系,从而最初阶段的状态到达最终状态的方式解决问题。
每个阶段只有一个状态->递推
每个阶段的所有状态都计算出来,从中选取最优的->搜索
每个阶段的最优状态都是由上一个阶段的最优状态得到的->贪心
每个阶段的最优状态可以从之前的某个阶段的某个(或某些)状态直接得到->动态规划
一个问题会有多种状态的定义和阶段的划分,某一种定义有后效性不代表该问题不适合用哪种方法。
贪心,动归这类的问题本质都是对搜索的剪枝
适用于哪种方法来解决,在于你怎么看待这个世界~
https://segmentfault.com/a/1190000006022019#articleHeader11

    推荐阅读