数据结构小总结
差不多把數(shù)據(jù)結(jié)構(gòu)里面的主要算法都寫了,寫一個概要吧。
1,數(shù)組
有序數(shù)組與無序數(shù)組的刪除,插入,查找操作,時間復雜度,很簡單:
2,簡單排序
時間復雜度在O(n^2)級別的,雖然都是平方級別的,但也有快慢之分:
一般來說: 插入?? >??? 選擇??? >? 冒泡
冒泡:
不變性:在排序過程中,已排好的那部分(即冒泡到的最終位置就是排序好的最終位置)保持不變,不參與后來的排序
效率:要進行(N-1) + (N-2) +,,,+1? =? N(N-1)/2??? ,約在N^2 / 2? 的比較,假設有一半情況需要交換,則需要N^2 / 4次的交換
選擇:
不變性:已選擇好的那一段不參與排序,位置選好后就不變
效率:和冒泡一樣,進行N(N-1)/2次比較,但它無疑比冒泡快,因為它進行的交換要少得多(想想為什么!因為選擇排序只在一趟結(jié)束的時候才交換1次)
插入:
不變性:已插入部分局部有序(但不是位置保持不變,跟上面的有區(qū)別)
效率:最壞情況下,才1 + 2 + (N-1)? =? N(N-1)/2? 次比較(逆序的時候),平均是N(N-1)/ 4.? 元素的移動次數(shù)跟比較次數(shù)一樣。
插入排序是從局部有序向全局有序擴展的過程。
3,棧和隊列
棧和隊列作為一種工具,就是提供了受限訪問的功能。
入棧出棧,進隊出隊時間復雜度均為O(1)
循環(huán)隊列--已經(jīng)寫過
雙端隊列---在兩頭進行刪除和插入
優(yōu)先級隊列---優(yōu)先級隊列是指在普通隊列的基礎上,給隊列中的元素增加了優(yōu)先級屬性(也可以看做是有序?qū)傩?#xff09;的隊列,顯然,進隊就要插入到適合的位置,而不是隊尾,出隊永遠是出對頭最小(可以說是優(yōu)先級最高)的元素。用數(shù)組或者鏈式實現(xiàn)插入需要O(N)時間,刪除O(1)時間。
在學了堆以后,可以用堆來實現(xiàn)優(yōu)先級隊列,堆排序等等。
4,鏈表
單鏈表:只在表頭記錄first指針
雙端鏈表:在表尾再記錄一個last指針。
用鏈表實現(xiàn)棧,用鏈表實現(xiàn)隊列。---數(shù)據(jù)類型和抽象!!!
有序鏈表(也可以用來實現(xiàn)優(yōu)先級隊列)
雙向鏈表
實現(xiàn)都復雜度分析都不難,不一一列舉
5,遞歸
任何一個使用遞歸的程序都可以轉(zhuǎn)化成一個使用棧的程序,然而,在實踐中,人們往往從一開始就思考基于棧的算法,而不是從遞歸轉(zhuǎn)化。
通常情況下,遞歸的方法,或是使用棧,或者是一個循環(huán),哪個更有效就使用哪個
6,高級排序
shell排序:
對插入排序的改進,插入排序復制的次數(shù)太多(元素往后移動)
n-增量排序,shell排序通過增加插入排序時候的間隔,來進行插入排序,
減小間隔,知道間隔為1,完成shell排序,每次間隔的關系可以通過h = 3 * h + 1來變化,當然也可以選擇其他的變化方式
效率:除了在一些特殊的情況下,目前還沒有人能在理論上去分析shell排序的復雜度,有各種基于實驗的評估估計在O(N^1.5)左右。
快速排序:
目前發(fā)現(xiàn)的最快的排序方法,可以遞歸實現(xiàn)
效率:O(N*logN),對逆序數(shù)組排序,會降到O(N^2)
歸并排序:
O(N*logN)? 可以遞歸實現(xiàn)
基數(shù)排序(桶排序),一個很有意思的排序方法,還沒有去寫,有時間寫一下
7,二叉樹
二叉查找樹里的查找,刪除,插入都是log(n)級別的,easy
用二叉排序樹來實現(xiàn)有序鏈表
8,堆
效率分析:
插入:logn
刪除最小值:logn,注意刪除只要一下,這個logn是后續(xù)的調(diào)整
堆排序:刪除一個是logn,連續(xù)刪除n個(對n個數(shù)排序)為nlogn
9,圖
最近寫的
鄰接矩陣? 鄰接表? 拓撲排序 最小生成樹 等等
總結(jié)
- 上一篇: vsftpd设置与使用总结
- 下一篇: 10个经典而简单的jQuery特效设计在