資料結構:
陣列
插入快,查詢、刪除慢,大小固定
棧
後進先出(入棧和出棧的時間複雜度都為o(1))
佇列
先進先出(可分為單向佇列,雙向佇列,優先順序佇列)
【棧和佇列均可以通過陣列實現,也可以通過鍊錶、堆等資料結構實現】
鍊錶
可以充分利用計算機記憶體空間,實現靈活的記憶體動態管理。但是鍊錶失去了陣列隨機讀取的優點,同時鍊錶由於增加了結點的指標域,空間開銷比較大。(可分單向鍊錶,雙端鍊錶、雙向鍊錶)
二叉樹
同時具備陣列查詢快的優點以及鍊錶插入和刪除快的優點
二叉搜尋樹(二叉排序樹)
若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值; 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值; 它的左、右子樹也分別為二叉排序樹。
(缺點:若二叉搜尋樹是排好序的,那麼查詢的時間複雜度為o(n),而不是o(logn))
紅黑樹
特點:紅黑樹是一種平衡的二叉搜尋樹。通過引入顏色,進而左旋右旋,以達到平衡的效果。
優點:紅黑樹的查詢、插入和刪除時間複雜度都為o(log2n),額外的開銷是每個節點的儲存空間都稍微增加了一點,因為乙個儲存紅黑樹節點的顏色變數。插入和刪除的時間要增加乙個常數因子,因為要進行旋轉,平均一次插入大約需要一次旋轉,因此插入的時間複雜度還是o(log2n),(時間複雜度的計算要省略常數),但實際上比普通的二叉樹是要慢的。
堆
特點:他是完全二叉樹,通常用陣列來實現,堆中的每乙個節點的關鍵字都大於(或等於)這個節點的子節點的關鍵字【所以相對於二叉搜尋樹,堆是弱序的】。
缺點:由於堆的特性,在查詢的過程中,沒有足夠的資訊來決定選擇通過節點的兩個子節點中的哪乙個來選擇走向下一層,所以也很難在堆中查詢到某個關鍵字。因此,堆這種組織似乎非常接近無序。
優點:對於快速的移除最大(或最小)節點,也就是根節點,以及能快速插入新的節點,這兩個操作就足夠了。由它實現的優先順序佇列的插入和刪除的時間複雜度都為o(logn)。這樣儘管刪除的時間變慢了,但是插入的時間快了很多,當速度非常重要,而且有很多插入操作時,可以選擇用堆來實現優先順序佇列。
雜湊表
雜湊表基於陣列,類似於key-value的儲存形式,關鍵字值通過雜湊函式對映為陣列的下標,如果乙個關鍵字雜湊化到已占用的陣列單元,這種情況稱為衝突。用來解決衝突的有兩種方法:開放位址法和鏈位址法。
在開發位址法中,把衝突的資料項放在陣列的其它位置;
在鏈位址法中,每個單元都包含乙個鍊錶,把所有對映到同一陣列下標的資料項都插入到這個鍊錶中。
圖
圖由 定點 和 邊 組成
圖是由邊連線的頂點組成,圖可以表示許多真實的世界情況,包括飛機航線、電子線路等等。搜尋演算法以一種系統的方式訪問圖中的每個頂點,主要通過深度優先搜尋(dfs)和廣度優先搜尋(bfs),深度優先搜尋通過棧來實現,廣度優先搜尋通過佇列來實現。
最後需要知道最小生成樹是包含連線圖中所有頂點所需要的最少數量的邊。(頂點數 v = 邊數 e + 1)
常用演算法
遞迴氣泡排序
比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。
時間複雜度 o(n2):
則第一輪排序有 n-1 次比較,第二輪有 n-2 次,…(n-1)+(n-2)+…+1 = n*(n-1)/2
交換和比較次數都和n2 成正比。由於常數不算大 o 表示法中,忽略 2 和 4,那麼氣泡排序執行都需要 o(n2)
選擇排序
每一次從待排序的資料元素中選出最小的乙個元素,存放在序列的起始位置,直到全部待排序的資料元素排完。
時間複雜度:o(n2):
但是至多只進行了n次交換。當 n 值很大時,比較次數是主要的,所以和氣泡排序一樣,用大o表示是o(n2) 時間級別。但是由於選擇排序交換的次數少,所以選擇排序無疑是比氣泡排序快的。當 n 值較小時,如果交換時間比選擇時間大的多,那麼選擇排序是相當快的。
插入排序
(直接插入排序)每一步將乙個待排序的記錄,插入到前面已經排好序的有序序列中去,直到插完所有元素為止。
時間複雜度: o(n2):
選擇排序把交換次數降低到最低,但是比較次數還是挺大的。當資料量小,並且交換資料相對於比較資料更加耗時的情況下,可以應用選擇排序。在大多數情況下,假設資料量比較小或基本有序時,插入排序是三種演算法中最好的選擇。
快速排序
分治策略:每次把陣列分成兩部分,一部分資料總比另一部分小(大),以此往復
過程:基準元素選取–>劃分–>遞迴求解–>組合
資料結構與演算法 演算法 演算法和資料結構
資料結構與演算法 演算法 好吧,在這裡,您被優秀或優秀的軟體開發人員所隔開。在這種情況下,我會告訴您一開始或至少在我的情況下,並且我知道大多數時候,對於我認識的大多數人,您會覺得自己是乙個無能的人或白痴。基本上,我怎麼可能不理解這一點,然後您會感到沮喪。在這種情況下,我會告訴您情況並不像您想的那麼糟...
資料結構 資料結構與演算法01
1 求一組整數中的最大值。演算法 基本操作是 比較兩個數的大小 模型 仔細想想 你並不知道這個整數到底是多大?整數過大你該怎麼去表示?2 足協的資料庫管理的程式 演算法 需要管理的專案?如何管理?使用者介面?模型 3 資料與資料結構 資料 所有能被輸入到計算機中,並被計算機處理的符號的集合計算機操作...
資料結構 資料結構與演算法02
1 演算法設計的原則 設計演算法時,通常應考慮達到以下目標 1,正確性 2,可讀性 3,健壯性 4,高效率與低儲存量需求 1,正確性 規格說明 四個層次 a,程式中不含語法錯誤 b,程式對於幾組輸入資料能夠得出滿足要求的結果 c,程式對精心選擇的 典型 苛刻切帶有刁難性的幾組輸入資料能夠得出滿足要求...