1. 程式人生 > >Python資料結構(二)

Python資料結構(二)

棧和佇列

  1. 定義:存放資料的線性表
  2. 操作:入棧/佇列、出棧/佇列、判斷滿/空
  3. 空間複雜度:O(n) 單次操作時間複雜度:O(1)
  4. 區別:棧先進後出(FILO)、佇列先進先出(FIFO)

陣列和連結串列(線性表)皆可儲存

  • 指標 (輔助變數):出入元素的同時移動指標
    • 棧頂/底指標(棧頂指標會變,棧底指標不變)
    • 隊頭/尾指標(隊頭隊尾兩個指標都會變)

棧的應用:括號匹配檢測 設計一個演算法,自動檢測輸入的字串中括號、引號等符號是否成對出現,相互匹配

棧的應用:模擬系統棧 用人工棧實現遞迴程式

並查集

  1. 定義:存放資料的集合關係,如{1,2}{3,4}{5}
  2. 均攤時間複雜度近似O(1),空間複雜度O(n)
  3. 支援操作 • 建立新集合 • 查詢某個元素屬於哪個集合 • 合併兩個集合

並查集的實現 • 儲存:使用陣列標記每個元素屬於的子集 • 合併:直接將根節點屬於的子集改變 • 查詢:從待查詢節點倒推到根節點 • 優化:路徑壓縮(合併時不壓縮路徑,查詢時壓縮目標節點)

並查集的應用 假設n個節點,初始時點與點之間沒有連線,給出一系列的連線操作,一次連線操作不產生環,則接受,否則被拋棄

雜湊表

  1. 定義:存放資料的集合(線性表是有序的,集合是無序的不能重複的) 本質:Key的索引
  2. 操作:根據(Key, Value)進行插入,查詢,刪除(可以沒有)
  3. 空間複雜度:O(m) 單次操作時間複雜度:O(1)

雜湊表例題:給出n個[0, m)範圍內的整數,去重

  • 快速排序 期望時間複雜度O(nlogn) 附加空間複雜度O(1)
  • 計數(基數)排序: 建立一m位的陣列,數字出現一次就在陣列相應位置標記,第二次出現丟棄
    • 時間複雜度O(n + m) 超越比較排序下限
    • 附加空間複雜度O(m)
    • 若n << m,計數排序的大量空間被浪費 ——> 空間壓縮 • 將Key區間[0, m) 對映到[0, p):H(key) = key mod p(取模)最簡單 • 多對一的對映方式 ——> 使用連結串列,陣列每一標誌都連結多個數字

雜湊表:實現

處理衝突(Key, Value) • 開雜湊–>開放地址法(陣列):陣列某位置插滿後則往後插,並最後留一個空位置 • 閉雜湊–>拉鍊法(陣列+連結串列)

負載率= 已有元素大小/ 儲存雜湊大小(要保持在50%以下)

雜湊函式設計 –> p一般取質數

硬刪除 vs 軟刪除 軟刪除 –> 將資料標記為已刪除,但不是真正刪除掉(避免開雜湊錯誤) 硬刪除 –> 將原來的雜湊表整理成新的雜湊表,將舊的刪除