簡單演算法時間複雜度分析:
1.大o描述的是演算法的執行時間與輸入資料的關係
2.漸進時間複雜度,描述的是n趨於無窮時時間複雜度
動態規劃:
最短路徑:
鬆弛操作:
dijkstra單元最短路徑:不能處理圖中帶有負權邊,複雜度o(elogv)
bellman-ford單元最短路徑:不能處理帶有負權環,可以判斷,複雜度o(ev)
擁有負權環的圖,不再擁有最短路徑
floyed演算法處理無負權環的圖,o(v^3)
最長路徑:
最長路徑不能有正權環
無權圖的最長路徑是指數級別的
有權圖,不能使用dijkstra來求最長路徑
可以使用bellmanford
無權圖:
主要針對無向有權圖
lazyprim演算法
kruskal演算法
圖:
有向圖,無向圖
有權圖,無權圖
簡單圖:沒有自環邊和平行邊的圖
圖的表示方法:鄰接矩陣,鄰接表
鄰接表適用於稀疏圖
鄰接矩陣適用於稠密圖或者完全圖
深度遍歷複雜度:
稀疏圖-鄰接表 o(v+e)
稠密圖-鄰接矩陣o(v^2)
並查集:
目的:解決連線問題。網路中的連線狀態,網路是個抽象的概念,使用者之間形成的網路。數學中的集合
時間複雜度:並查集的操作,近乎是o(1)
雜湊表:
1.雜湊表設計充分體現了演算法設計領域的經典思想:空間換時間
2.雜湊表是時間和空間的均衡
3.雜湊函式設計很重要
4.建通過雜湊函式得到的索引分布越均勻越好。
雜湊函式設計:
1.原則:
一致性:a=b,hash(a)=hash(b)
高效性:計算高效
均勻性:分布均勻
查詢表也可以使用平衡樹。
平均每個位址承載的元素多過一定程度,就擴容。
雜湊衝突的辦法:
1.開放位址發
線性探測
平方探測
二次雜湊
結論:擴容的負載率選的合適,時間複雜度也是o(1)
2.鏈位址法
3.colaecsed hashing
綜合了鏈位址法和開放位址法
紅黑樹:
1.概念:
每個節點或者紅色或者黑色
根節點是黑色的
每個葉子節點(最後的空節點)是黑色的
如果乙個節點是紅色的,那麼他的孩子節點都是黑色的
從任意乙個節點到葉子節點(最後的空節點),經過的黑色節點是一樣的
2.性質:
紅黑樹是保持「黑平衡」的二叉樹
嚴格意義上,不是平衡二叉樹
最大高度:2logn,o(logn)
統計效能好,還有伸展樹
字典樹:
線段樹:
使用原因:對於給定區間:更新區間中的乙個元素或者乙個區間的值。查詢區間的最大值,最小值,或者區間的和
是平衡二叉樹
優先佇列:
堆:
二叉堆:是一顆完全二叉樹,也是平衡二叉樹。堆中的某個節點的值總是不大於其父節點的值。最大堆,最小堆。
heapify時間複雜度:
將n個元素插入到空堆中,時間複雜度是logn
heapify時間複雜度是o(n)
集合和對映:
1.集合
(1)應用:客戶統計
詞彙量統計
有序集合的元素具有順序性(基於搜尋樹實現)
無序集合的元素具有無序性(基於雜湊表實現)
多重集合
2.對映
有序對映:鍵具有順序性(基於搜尋樹)
無序對映:鍵具有無序性(基於雜湊表)
多重對映:鍵可以重複
二分搜尋樹:
1.使用樹的原因:天然的組織結構,高效
2.二叉樹:(1)具有唯一根節點
(2)每個節點最多有兩個孩子
(3)每個節點做多有乙個父節點
(4)具有天然的遞迴結構,每個節點的左子樹和右子樹都是二叉樹
(5)乙個節點也是二叉樹,null也是
3.二分搜尋樹:(1)是二叉樹
(2)每個節點大於左子樹所有節點的值,小於右子樹所有節點值
(3)元素具有可比較性
(6)二分搜尋樹中序遍歷是順序的
(7)二分搜尋樹的後序遍歷可以用來釋放記憶體
4.層序遍歷(廣度優先遍歷):可以更快搜尋,用於搜尋策略。也可以用於無權圖的最短路徑
5.二分查詢法:對於有序的數列,才能使用二分查詢法
遞迴:
1.本質上,將大問題轉換為更小同一問題。
2.舉例:陣列求和
3.代價:函式呼叫消耗時間+系統呼叫棧
佇列:1.
鍊錶:
1.優點:真正的動態,不需要處理固定容量的問題。
2.缺點:喪失了隨機訪問的能力。
3.時間複雜度:增刪改查只對頭結點來說是o(1),平均是o(n)。
棧:
1.是一種線性資料結構
2.只能從一端新增元素,也只能從一端取出元素。
3.這一端稱為棧頂。
2.程式呼叫的系統棧
陣列:
1.特點:快速查詢,最好應用於「索引有語義」的情況
2.時間複雜度:
增:o(n)
刪:o(n)
改:已知索引:o(1),未知索引:o(n)
查:已知索引:o(1),未知索引:o(n)
資料結構和演算法
判斷乙個演算法的效率時,函式中的常數和其它次要項常常可以忽略,而更應該關注主項 最高項 的階數。演算法時間複雜度的定義 在進行演算法分析時,語句中的執行次數t n 是關於問題規模n的函式,進而分析t n 隨n的變化情況並確定t n 的數量級。演算法的時間複雜度,也就是演算法的時間量度,記作 t n ...
資料結構和演算法
程式是什麼?好多書上都寫著 程式 資料結構 演算法。可是怎麼去理解呢?好多程式設計人員對資料結構和演算法說不上熟悉,因為在他們所從事的工作中很少用到這些知識點。但並不表示他們不重要。還有一些人是這樣的想法 大公司才會注重這些知識點,小公司可能就不注重了。寫這篇文章之前我也是持這種想法的。但是,此時此...
資料結構和演算法
一 資料結構 1.概念 資料結構就是資料之間的結構關係,或者理解成資料元素之間存在的一種或者多種特定關係的集合,在傳統上資料結構分為邏輯結構與物理結構 1 邏輯結構 只反映資料元素之間的邏輯關係的資料結構,其中的邏輯關係是指資料元素之間的前後關係,而與他們在計算機中的儲存位置無關,有以下四類 集合結...