數據結構與Python實現

數據結構與Python實現

分類和時空複雜度

分類:html

時間和空間複雜度:python


Array

數組是能夠再內存中連續存儲多個元素的結構,在內存中的分配也是連續的,數組中的元素經過數組下標進行訪問,數組下標從0開始算法

適用場景:數組

  • 頻繁查詢,對存儲空間要求不大,不多增長和刪除的狀況

優勢:數據結構

  • 按照索引查詢元素速度快
  • 按照索引遍歷數組方便

缺點:多線程

  • 數組的大小固定後就沒法擴容了
  • 數組只能存儲一種類型的數據
  • 添加,刪除的操做慢,由於要移動其餘的元素

時間複雜度 O()
Access O(1)
Insert O(n)
Delete O(n)

Python實現與LeetCode--數組

詳見:app


Linked List

Linked List

鏈表是物理存儲單元上非連續的、非順序的存儲結構;spa

數據元素的邏輯順序是經過鏈表的指針地址實現,每一個元素(結點)包含兩個域,一個是存儲元素的數據域 (內存空間),另外一個是指向下一個結點地址的指針域線程

根據指針的指向,鏈表能造成不一樣的結構,例如單鏈表,雙向鏈表,循環鏈表等。3d

鏈表插入Node:

鏈表刪除Node:

時間複雜度 O()
space O(1)
prepend O(1)
append O(1)
lookup O(n)
insert O(1)
delete O(1)

Double Linked List

Circular Linked List

Python實現與LeetCode--鏈表

詳見:


Stack

是一種特殊的線性表;僅能在線性表的一端操做棧頂容許操做,棧底不容許操做。

棧的特色:

  • 後進先出,從棧頂放入元素的操做叫入棧,取出元素叫出棧

Python實現與LeetCode--棧

詳見:


Queue

Queue

隊列與棧同樣,也是一種線性表;隊列能夠在一端添加元素,在另外一端取出元素,也就是「先進先出」;從一端放入元素的操做稱爲入隊,取出元素爲出隊

使用情景:

  • 多線程阻塞隊列管理中很是適用

Double-ended Queue

雙端隊列和普通隊列區別在於:==隊頭和隊尾均可以插入和刪除元素;==

Priority Queue

優先隊列:正常⼊、按照優先級出

Python實現與LeetCode--隊列

詳見:


Tree

Tree

樹是一種數據結構,它是由n(n>=1)個有限節點組成一個具備層次關係的集合。把它叫作 「樹」 是由於它看起來像一棵倒掛的樹,也就是說它是根朝上,而葉朝下的。

樹的特色:

  • 每一個節點有零個或多個子節點
  • 沒有父節點的節點稱爲根節點
  • 每個非根節點有且只有一個父節點
  • 除了根節點外,每一個子節點能夠分爲多個不相交的子樹

Binary Tree

二叉樹:

  • 每一個結點最多有兩顆子樹,結點的度最大爲2
  • ==左子樹和右子樹是有順序的==,次序不能顛倒
  • 即便某結點只有一個子樹,也要區分左右子樹

Binary Search Tree

二叉搜索樹:

  • 若任意節點的左⼦子樹不爲空,則左子樹上全部結點的值均小於它的根結點的值;
  • 若任意節點的右⼦子樹不爲空,則右子樹上全部結點的值均大於它的根結點的值;
  • 任意節點的左、右子樹也分別爲二叉搜索樹

Python實現與LeetCode--樹

詳見:


Heap

堆是一種比較特殊的數據結構,能夠被看作一棵樹的數組對象,具備如下的性質:

  • 堆中某個節點的值老是不大於或不小於其父節點的值
  • 堆老是一棵徹底二叉樹

Mini Heap

小頂堆特色:

  • 任意節點的值小於父節點的值
  • 完整的二叉樹

Max Heap

大頂堆特色:

  • 任意節點的值大於父節點的值
  • 徹底的二叉樹

Python實現與LeetCode--堆

詳見:


Graph

圖是由結點的有窮集合V和邊的集合E組成。其中,爲了與樹形結構加以區別,在圖結構中經常將結點稱爲頂點,邊是頂點的有序偶對;若兩個頂點之間存在一條邊,就表示這兩個頂點具備相鄰關係。

Python實現與LeetCode--圖

詳見:


Hash Table

哈希表,是根據關鍵碼和值 (key和value) 直接進行訪問的數據結構,哈希底層算法是取模(取餘)運算,因此會產生哈希衝突。

哈希衝突解決:拉鍊法

Python實現與LeetCode--哈希表

詳見:

相關文章
相關標籤/搜索