資料結構 資料結構與演算法知識梳理(下) 演算法篇

2021-10-23 16:13:57 字數 3142 閱讀 6626

演算法:

輸入: 演算法具有0個或多個輸入

輸出: 演算法至少有1個或多個輸出

有窮性: 演算法在有限的步驟之後會自動結束而不會無限迴圈,並且每乙個步驟可以在可接受的時間內完成

確定性:演算法中的每一步都有確定的含義,不會出現二義性

可行性:演算法的每一步都是可行的,也就是說每一步都能夠執行有限的次數完

如果評價乙個演算法:

時間複雜度:由於計算機的效能不同,無法準確統計出演算法執行所需要的時間。

因此我們用演算法執行的次數來代表演算法的時間複雜度,o(公式),一般忽略常數。

常見的時間複雜度:

// o(1)

printf("%d",i); 

// o(logn)

for(int i=n; i>=0; i=i/2)

// o(n)

for(int i=0; i=0; i=i/2)

}// o(n^2)

for(int i=0; i查詢演算法:

順序查詢:

對待查詢的資料沒有要求,時間複雜度: o(n)

二分查詢:

對待查詢的資料必須有序,時間複雜度: o(logn)

塊查詢:

是一種資料處理的思想,不是特定的演算法,當資料量過多時,可以先把資料進行分塊處理,然後再進行查詢,例如英語詞典。

雜湊查詢:

資料 經過雜湊函式 計算出資料在雜湊表中的位置,然後標記,方便之後的查詢,它的時間複試度最快能達到:o(1)。

但是該演算法有很大侷限性,不適合浮點型、字串型資料,需要額外的儲存空間,空間複雜度高,是一種典型的用空間換取時間的演算法。

雜湊函式設計方法:

直接定址法:把資料直接當作陣列的下標。

數字分析法:分析資料的特點來設計雜湊,常用的方法就是找到最大值與最小值,最大值-最小值+1來確定雜湊表的長度,資料-最小值訪問雜湊表。

排序演算法:

冒泡:資料左右進行比較,把最大的資料交換到最後,特點是該演算法對資料的有序性敏感,在排序過程中可以立即發現已經完成。

時間複雜度:o(n),o(n^2)

穩定選擇:假定最開始的位置是最小值並記錄下標min,然後與後面的資料進行比較,如果有比以min為下標的資料小的則min的更新,最後如果min的如果發生改變,則交換min與最開始位置的資料,雖然時間複雜度挺高的,但資料交換的次數比較小,因此實際執行速度並不慢(資料交換比資料比較耗時)。

時間複雜度:o(n^2)

不穩定插入:把資料看作兩部分,一分部是有序,把剩餘的資料逐個插入進行,適合對已經排序後的資料,新增資料並排序。

時間複雜度:o(n^2)

穩定希爾:是插入排序的增加版,由於插入排序時,資料移動的速度比較發慢,所以增加了增量的概念,以此來提高排序速度。

時間複雜度:o(nlogn)

不穩定快速:找到乙個標桿,一面從左找比標桿大的資料,找到後把放在標桿的右邊,另乙個從右邊找比標桿小的資料,找到後把放在標桿的左邊,最終標桿左邊的資料都比它小,右邊的資料都比它大,這樣就整體有序,然後按同樣的方法排序標桿左邊的資料和標桿右邊的資料。

它的綜合性能最高,因此叫快速排序,筆試時考的最多的排序。

時間複雜度:o(nlogn)

不穩定歸併:先一組把資料拆分成單獨的個體,然後按從小到大的順序進行合併,由於需要使用額外的記憶體空間因此避免的資料交換的耗時,也是一種典型的用空間換取時間的演算法,可遞迴實現也可以迴圈實現。

時間複雜度:o(nlogn)

穩定堆:把資料當作完全二叉樹,然後樹中調整為大根樹,然後把根節點交換到最後,然後數量--,然後再調整為大根樹,直到數量為1時結束,可遞迴實現也可以迴圈實現。

時間複雜度:o(nlogn)

不穩定計數:找出資料中的最大值和最小值,建立雜湊表,把資料-最小值當作陣列中的下標訪問雜湊表並標記數量,然後遍歷雜湊表,當表中的值大於時,把下標+最小值依次放入陣列中,是一種典型的用空間換取時間的演算法。

該排序演算法理論上速度非常快,但有很大侷限性,適合排序整型資料,而且資料的差值不宜過大,否則會非常浪費記憶體,資料越平均、重複數越多,價效比越高。

時間複雜度:o(n+k);

穩定桶:把資料根據值,儲存到不同桶中,然後再呼叫其它排序函式,對桶中的資料進行排序,然後再拷貝到陣列中,以到降低排序規模來提高排序的時間,是一種典型的用空間換取時間的演算法。

時間複雜度:o(n+k);

穩定基數:是桶排序的具體實現,首先建立10個佇列(佇列),然後逆序計算出資料的個十百... 然後壓入到對應的佇列中,然後再從佇列中彈出儲存的陣列中,當下標為0佇列中有len個資料時,排序結束。

時間複雜度:o(n+k);

穩定如何判斷排序演算法是否穩定:

待排序的陣列中,如果有值相同的資料,排序過程中如果不會改它們的前後順序,則認為該排序演算法穩定。

排序    最優    最差    平均     空間複雜度    特點    是否穩定

冒泡    o(n)    o(n^2)    o(n^2)    o(1)               對有序性敏感    穩定

選擇    o(n^2)    o(n^2)    o(n^2)    o(1)               交換次數少    不穩定

直插    o(n^2)    o(n^2)    o(n)    o(1)               適合已經有序    穩定

希爾    o(nlogn)    o(nlogn)    o(nlogn)    o(1)               引入增量以提速 不穩定

快排    o(nlogn)    o(nlogn)    o(n^2)    o(logn)               綜合性能最強    不穩定

歸併    o(nlogn)    o(nlogn)    o(nlogn)    o(n)               空間換時間    穩定

堆    o(nlogn)    o(nlogn)    o(nlogn)    o(1)               利用堆結構    不穩定    

計數    o(n+k)    o(n+k)    o(n+k)    o(k)                空間換時間    穩定

桶    o(n+k)    o(n+k)    o(n^2)    o(n+k)                空間換時間    穩定

基數    o(n*k)    o(n*k)    o(n*k)    o(n+k)                空間換時間    穩定    

資料結構基礎知識梳理

資料結構實際上可以理解為資料在計算機中的儲存和使用結構。如果借助c 容器的概念,資料結構可以認為是以某種特定的布局方式儲存資料的容器。這種 布局方式 決定了資料結構對於某些操作是高效的,而對於其他操作則是低效的。首先我們需要理解各種資料結構,才能在處理實際問題時選取最合適的資料結構。不同的資料結構適...

資料結構 資料結構與演算法01

1 求一組整數中的最大值。演算法 基本操作是 比較兩個數的大小 模型 仔細想想 你並不知道這個整數到底是多大?整數過大你該怎麼去表示?2 足協的資料庫管理的程式 演算法 需要管理的專案?如何管理?使用者介面?模型 3 資料與資料結構 資料 所有能被輸入到計算機中,並被計算機處理的符號的集合計算機操作...

資料結構 資料結構與演算法02

1 演算法設計的原則 設計演算法時,通常應考慮達到以下目標 1,正確性 2,可讀性 3,健壯性 4,高效率與低儲存量需求 1,正確性 規格說明 四個層次 a,程式中不含語法錯誤 b,程式對於幾組輸入資料能夠得出滿足要求的結果 c,程式對精心選擇的 典型 苛刻切帶有刁難性的幾組輸入資料能夠得出滿足要求...