Python資料結構(二)
阿新 • • 發佈:2018-12-10
棧和佇列
- 定義:存放資料的線性表
- 操作:入棧/佇列、出棧/佇列、判斷滿/空
- 空間複雜度:O(n) 單次操作時間複雜度:O(1)
- 區別:棧先進後出(FILO)、佇列先進先出(FIFO)
陣列和連結串列(線性表)皆可儲存
- 指標 (輔助變數):出入元素的同時移動指標
- 棧頂/底指標(棧頂指標會變,棧底指標不變)
- 隊頭/尾指標(隊頭隊尾兩個指標都會變)
棧的應用:括號匹配檢測 設計一個演算法,自動檢測輸入的字串中括號、引號等符號是否成對出現,相互匹配
棧的應用:模擬系統棧 用人工棧實現遞迴程式
並查集
- 定義:存放資料的集合關係,如{1,2}{3,4}{5}
- 均攤時間複雜度近似O(1),空間複雜度O(n)
- 支援操作 • 建立新集合 • 查詢某個元素屬於哪個集合 • 合併兩個集合
並查集的實現 • 儲存:使用陣列標記每個元素屬於的子集 • 合併:直接將根節點屬於的子集改變 • 查詢:從待查詢節點倒推到根節點 • 優化:路徑壓縮(合併時不壓縮路徑,查詢時壓縮目標節點)
並查集的應用 假設n個節點,初始時點與點之間沒有連線,給出一系列的連線操作,一次連線操作不產生環,則接受,否則被拋棄
雜湊表
- 定義:存放資料的集合(線性表是有序的,集合是無序的不能重複的) 本質:Key的索引
- 操作:根據(Key, Value)進行插入,查詢,刪除(可以沒有)
- 空間複雜度: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 軟刪除 軟刪除 –> 將資料標記為已刪除,但不是真正刪除掉(避免開雜湊錯誤) 硬刪除 –> 將原來的雜湊表整理成新的雜湊表,將舊的刪除