Python數(shù)據(jù)結(jié)構(gòu)與算法 Python常見數(shù)據(jù)結(jié)構(gòu)實現(xiàn)方式

python內(nèi)置數(shù)據(jù)結(jié)構(gòu)包括列表、字典、集合,樹和圖需手動實現(xiàn)或借助庫。1. 列表是動態(tài)數(shù)組,適合順序和隨機訪問,但頻繁在頭部插入元素建議用collections.deque;2. 字典基于哈希表,平均時間復雜度為o(1),支持鍵值對存儲,可保持插入順序;3. 集合用于去重和集合運算,判斷元素是否存在效率高;4. 樹和圖需自定義類或使用第三方庫如networkx實現(xiàn),常見遍歷方式有深度優(yōu)先和廣度優(yōu)先。掌握這些結(jié)構(gòu)的實現(xiàn)有助于提升代碼效率。

Python數(shù)據(jù)結(jié)構(gòu)與算法 Python常見數(shù)據(jù)結(jié)構(gòu)實現(xiàn)方式

python 作為一門高級編程語言,內(nèi)置了很多常用的數(shù)據(jù)結(jié)構(gòu),并且支持靈活的自定義實現(xiàn)。掌握這些數(shù)據(jù)結(jié)構(gòu)的實現(xiàn)方式,對理解算法、提升代碼效率很有幫助。


列表(List):動態(tài)數(shù)組的實現(xiàn)

Python 的列表是動態(tài)數(shù)組的一種實現(xiàn),可以自動擴容。它在內(nèi)存中是連續(xù)存儲的,所以訪問元素很快,時間復雜度為 O(1)。但插入和刪除操作可能需要移動大量元素,最壞情況下時間復雜度為 O(n)。

  • 如果你在頻繁地往列表頭部插入元素,建議考慮使用 collections.deque。
  • 使用列表模擬(stack)時,用 append() 和 pop() 效率很高。
  • 模擬隊列(queue)時,用 pop(0) 性能較差,推薦用雙端隊列 deque.popleft()。

列表非常適合順序訪問和隨機訪問,但在頻繁修改中間或開頭位置時性能一般。

立即學習Python免費學習筆記(深入)”;


字典(Dict):哈希表的實現(xiàn)

字典是基于哈希表實現(xiàn)的,鍵值對存儲,查找、插入和刪除的時間復雜度平均為 O(1),非常高效。每個鍵必須是可哈希的類型,比如整數(shù)、字符串、元組等。

  • 字典底層通過哈希函數(shù)計算鍵的位置,如果發(fā)生沖突(不同鍵算出同一個索引),會采用開放尋址法或鏈式存儲來解決。
  • 如果你希望保持插入順序,在 Python 3.7 及以上版本中,字典默認就是有序的。
  • 自定義對象作為鍵時,要確保其實現(xiàn)了 __hash__() 和 __eq__() 方法。

如果你需要一個默認值返回機制,可以用 dict.get(key, default) 或者 collections.defaultdict。


集合(Set):無序不重復集合

集合是基于哈希表實現(xiàn)的,內(nèi)部只保存鍵,沒有值。它適合用來去重或者進行集合運算(交集、并集、差集等)。

  • 判斷某個元素是否在集合中,比列表快得多,平均時間復雜度是 O(1)。
  • 集合本身是不可哈希的,但有不可變版本 frozenset。
  • 常見操作包括:add(), remove(), union(), intersection() 等。

舉個例子:你想快速判斷兩個列表是否有共同元素,可以把它們轉(zhuǎn)成集合后求交集。


樹和圖:需要手動實現(xiàn)或借助庫

Python 標準庫并沒有直接提供樹(Tree)或圖(Graph)這類結(jié)構(gòu),通常需要自己構(gòu)建類或者使用第三方庫如 networkx。

  • 實現(xiàn)二叉樹時,通常定義節(jié)點類,包含值、左子節(jié)點和右子節(jié)點。
  • 圖可以用鄰接表(字典+列表)或鄰接矩陣(二維數(shù)組)表示。
  • 常見遍歷方式:深度優(yōu)先(DFS)、廣度優(yōu)先(BFS)。

例如,用字典表示圖:

graph = {     'A': ['B', 'C'],     'B': ['A', 'D'],     'C': ['A', 'E'],     'D': ['B'],     'E': ['C'] }

這種結(jié)構(gòu)清晰又容易操作,適合處理圖相關的搜索和路徑問題。


基本上就這些。Python 提供了很豐富的基礎數(shù)據(jù)結(jié)構(gòu),同時也很靈活,可以根據(jù)需要擴展實現(xiàn)更復雜的結(jié)構(gòu)。了解它們的底層實現(xiàn)方式,有助于寫出更高效的代碼。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點贊13 分享