數(shù)據(jù)結構和算法
以weiss的數(shù)據(jù)結構和算法帆阳,以及算法導論為綱荆隘,另外參考July和左程云的書籍和代碼扯躺。
https://github.com/julycoding/The-Art-Of-Programming-By-July
數(shù)據(jù)結構
數(shù)組
鏈表
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
可分為:單鏈表,雙向鏈表藕畔,雙端鏈表马僻,循環(huán)鏈表。
雙向和雙端區(qū)別:https://blog.csdn.net/qq_29606255/article/details/76408285
數(shù)據(jù)結構 | 實現(xiàn)方式 |
---|---|
棧 | 數(shù)組/單鏈表 |
隊列 | 數(shù)組/雙端鏈表 |
優(yōu)先級隊列 | 數(shù)組/堆/有序鏈表 |
雙端隊列 | 雙向鏈表 |
棧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的實現(xiàn)
沒有實現(xiàn)的阻塞接口的LinkedList: 實現(xiàn)了java.util.Queue接口和java.util.AbstractQueue接口
內置的不阻塞隊列: PriorityQueue 和 ConcurrentLinkedQueue
PriorityQueue 和 ConcurrentLinkedQueue 類在 Collection Framework 中加入兩個具體集合實現(xiàn)。
PriorityQueue 類實質上維護了一個有序列表溶弟。加入到 Queue 中的元素根據(jù)它們的天然排序(通過其 java.util.Comparable 實現(xiàn))或者根據(jù)傳遞給構造函數(shù)的 java.util.Comparator 實現(xiàn)來定位女淑。
ConcurrentLinkedQueue 是基于鏈接節(jié)點的、線程安全的隊列辜御。并發(fā)訪問不需要同步鸭你。因為它在隊列的尾部添加元素并從頭部刪除它們,所以只要不需要知道隊列的大 小擒权, ConcurrentLinkedQueue 對公共集合的共享訪問就可以工作得很好袱巨。收集關于隊列大小的信息會很慢,需要遍歷隊列碳抄。實現(xiàn)阻塞接口的:
java.util.concurrent 中加入了 BlockingQueue 接口和五個阻塞隊列類愉老。它實質上就是一種帶有一點扭曲的 FIFO 數(shù)據(jù)結構。不是立即從隊列中添加或者刪除元素剖效,線程執(zhí)行操作阻塞嫉入,直到有空間或者元素可用。
五個隊列所提供的各有不同:
* ArrayBlockingQueue :一個由數(shù)組支持的有界隊列璧尸。
* LinkedBlockingQueue :一個由鏈接節(jié)點支持的可選有界隊列咒林。
* PriorityBlockingQueue :一個由優(yōu)先級堆支持的無界優(yōu)先級隊列。
* DelayQueue :一個由優(yōu)先級堆支持的爷光、基于時間的調度隊列垫竞。
* SynchronousQueue :一個利用 BlockingQueue 接口的簡單聚集(rendezvous)機制。
優(yōu)先隊列(堆)
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
**后綴樹** 基數(shù)樹 三叉查找樹 X-快速前綴樹 Y-快速前綴樹
以上標黑的為重點關注項
AVL樹:https://zh.wikipedia.org/wiki/AVL%E6%A0%91
伸展樹Splay:
Treap樹:
SBTree樹
RBTree樹
B樹
R樹
區(qū)間樹
二叉堆
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算法
無環(huán)加權有向圖的最短路徑算法
關鍵路徑
計算無向圖中連通分量的Kosaraju算法
有向圖中含必經點的最短路徑問題
TSP問題
還有A*算法
散列
算法
查找算法
http://www.cnblogs.com/wangyingli/p/5994282.html
排序算法
http://www.cnblogs.com/wangyingli/p/5994256.html
分治算法
貪心算法
動態(tài)規(guī)劃
搜索算法
回溯算法,隨機化算法
方案設計
1.分治法:
將問題分成單獨的階段引有,每個階段互相不干擾很獨立瓣颅,如10米長的木棍,切成10段譬正,每段去解決每一段的問題宫补。(階段沒有關系)
2.貪心法
站在全局的角度,也是將問題堪稱分為多個階段曾我,只不過階段和階段之間有一定的遞進關系粉怕,如從5毛,1元抒巢,2毛贫贝,1毛,2元中蛉谜,去找最少的錢幣構成10塊錢稚晚。首先是站在全局的角度,先從中取其最大值型诚,為第一階段客燕,然后在從剩余的當中在找最大值,構成第二階段狰贯。也搓。。涵紊。傍妒。。如此往復摸柄,這就是貪心法拍顷。
3.動態(tài)規(guī)劃
是階段和階段之間有重復,舉例說明:求一個數(shù)組的最長遞增子序列塘幅。假設數(shù)組有10個元素,那么如何求解呢尿贫?將10個元素劃分成10個階段电媳,第一個階段,從第一個元素中求解庆亡,第二個階段在第一個階段求其解匾乓,第三個階段在第一個,第二個階段綜合的基礎上求解又谋,第四個階段在第1,2,3個階段求其解拼缝,最后娱局。。咧七。衰齐。第k個階段在第1,2....k-1個階段求其最優(yōu)解。
4.遞歸算法
個人感覺和動態(tài)規(guī)劃反著來的樣子继阻,有點像耻涛,問題規(guī)模為10,轉化為問題規(guī)模為9的問題瘟檩,抹缕,問題規(guī)模為9的問題,轉化為8.墨辛。卓研。。睹簇。奏赘。
5.回溯法和分支限界法
都屬于組合優(yōu)化問題,就是按照過程向下面去尋找最優(yōu)解带膀,在尋找最優(yōu)解的過程志珍,不斷的剪取枝條,來減少搜索情況垛叨。不行就換思路伦糯。
遞推,搜索嗽元,貪心和動態(tài)規(guī)劃的思想都是通過拆分問題敛纲,定義狀態(tài)和狀態(tài)之間的關系,從而最初階段的狀態(tài)到達最終狀態(tài)的方式解決問題剂癌。
每個階段只有一個狀態(tài)->遞推
每個階段的所有狀態(tài)都計算出來淤翔,從中選取最優(yōu)的->搜索
每個階段的最優(yōu)狀態(tài)都是由上一個階段的最優(yōu)狀態(tài)得到的->貪心
每個階段的最優(yōu)狀態(tài)可以從之前的某個階段的某個(或某些)狀態(tài)直接得到->動態(tài)規(guī)劃
一個問題會有多種狀態(tài)的定義和階段的劃分,某一種定義有后效性不代表該問題不適合用哪種方法佩谷。
貪心旁壮,動歸這類的問題本質都是對搜索的剪枝
適用于哪種方法來解決,在于你怎么看待這個世界~