2、鍊錶
資料結構
根據關鍵字查詢
根據索引查詢
插入刪除
陣列o(n)
o(1)
o(n)
o(n)
有序陣列
o(logn)
o(1)
o(n)
o(n)
鍊錶o(n)
o(n)
o(1)
o(1)
有序鍊錶
o(n)
o(n)
o(1)
o(1)
雙向鍊錶
o(n)
o(n)
o(1)
o(1)
二叉樹(一般情況)
o(logn)
o(logn)
o(logn)
二叉樹(最壞情況)
o(n)
o(n)
o(n)
平衡樹o(logn)
o(logn)
o(logn)
o(logn)
排序二叉樹
o(logn)~o(n)
o(logn)~o(n)
o(logn)~o(n)
o(logn)~o(n)
雜湊表o(1)
o(1)
o(1)
陣列長度設為n
增改查:
既然知道數值對應的下標,那麼我們要想找到乙個陣列中的數,只需要鎖定其下標,對它進行增改查操作即可.所以這是一步鎖定的操作.
則這種情況下增改查的時間複雜度是 o(1).
刪:
一步鎖定找到想要刪除的數值,進行刪除,然後需要移動刪除部分後面的數值,如果該數值在陣列頭部,則需要移動n次,若在尾部,則無需移動,取乙個平均值則需要n/2次,忽略常數,所以刪操作的時間複雜度是 o(n).
不知道數值的對應下標的陣列,我們簡稱為無下標的陣列,不知道所要操作的數值在陣列的什麼地方,這就需要我們去陣列遍歷尋找,然後進行操作.
增:
陣列是位址連續儲存的,所以對陣列進行增操作,只要在陣列尾部增加即可,一步到位,所以增操作的時間複雜度是 o(1).
刪:
要遍歷找到想要刪除的數值,進行刪除,如果該數值在陣列頭部,則需要遍歷一次,若在尾部,則需要遍歷n次,取乙個平均值則需要遍歷n/2次,忽略常數,所以刪操作的時間複雜度是 o(n).
改:
改操作同刪除操作類似,要遍歷找到想要更改的數值,進行更改,所以改操作的時間複雜度是 o(n).
查:
查操作也同上,時間複雜度是 o(n).
查:
這裡我們先說查操作,計算機在進行操作時,會選擇使用最優的方法解決問題,我們這裡的陣列是有序的,所以使用 二分查詢 比遍歷查詢更快,其平均查詢次數是log2n.
實際上由於所有的對數都和其他對數成比例(從底數字2轉換到底數字10需乘以3.332),我們可以將這個為常數的底數也可忽略。由此不必指定底數:時間複雜度是 log(n).
增:
針對有序無下標的陣列,不能隨意在尾部新增資料,應該找到資料適合新增的位置,平均查詢次數是平均查詢次數是log2n,找到該位置後,還要將插入位置後面的陣列進行後移操作,平均移動次數也是n/2,相加則平均進行n/2+log2n次操作,時間複雜度取最大值,則增操作的時間複雜度是 o(n).
刪:
刪操作同樣針對有序無下標的陣列,要遍歷找到想要刪除的數值,進行刪除,平均查詢次數是log2n,找到該位置後刪除,還要將刪除位置後面的陣列進行前移操作,平均移動次數是n/2,同理刪操作的時間複雜度是 o(n).
改:
改操作同刪除操作類似,要遍歷找到想要更改的數值,進行更改,平均查詢次數是log2n,還要將該更改的數找到合適的位置移動排序,平均查詢次數是n/2,所以改操作的時間複雜度是 o(n).
設煉表長度為n
增:
鍊錶是通過記錄頭部位址來進行尋找後面數值的,所以需要遍歷鍊錶操作,如果在頭部增,只需要查詢一次,時間複雜度是 o(1),在尾部增需要查詢n次,時間複雜度是 o(n).
刪:
要遍歷找到想要刪除的數值,進行刪除,對於鍊錶,我們沒法使用二分查詢,只能遍歷查詢,找到該節點後刪除,平均查詢次數是n/2,時間複雜度是 o(n).
改:
要遍歷找到想要更改的數值,同樣只能遍歷查詢,平均查詢次數是n/2,時間複雜度是 o(n).
查:
要遍歷查詢,同樣只能遍歷查詢,平均查詢次數是n/2,時間複雜度是 o(n).
增:
針對有序鍊錶操作,需要保持其有序的原則,遍歷鍊錶找到該數值所在節點可以增加的位置,平均查詢次數是n/2,時間複雜度是 o(n).
刪:
通過遍歷查詢,找到該節點後刪除,平均查詢次數是n/2,時間複雜度是 o(n).
改:
通過遍歷查詢,找到想要更改的數值,同樣只能遍歷查詢,平均查詢次數是n/2,然後需要根據有序原則,為該節點尋找適合的位置進行移動,平均查詢時間是n/2,時間複雜度是 o(n).
查:
要遍歷查詢,同樣只能遍歷查詢,平均查詢次數是n/2,時間複雜度是 o(n).
二叉排序樹又稱二叉查詢樹,它或是一棵空的二叉樹,或是具有下列性質的二叉樹:
查:
給定值的比較次數等於給定值節點在二叉排序樹中的層數。如果二叉排序樹是平衡的,則n個節點的二叉排序樹的高度為log2n +1,其查詢效率為o(log2n),近似於折半查詢。如果二叉排序樹完全不平衡,則其深度可達到n,查詢效率為o(n),退化為順序查詢。一般的,二叉排序樹的查詢效能在o(log2n)到o(n)之間。因此,為了獲得較好的查詢效能,就要構造一棵平衡的二叉排序樹。
增/刪/改:
同理如查
二叉樹 二叉鍊錶
include using namespace std typedef char elemtype int n 0 typedef struct binode binode class bitree bitree binode getroot void preorder binode root 前序...
二叉鍊錶儲存的二叉樹
樹形結構是一類重要的非線性資料結構,其中以樹和二叉樹最為常用。對於每乙個結點至多只有兩課子樹的一類樹,稱其為二叉樹。二叉樹的鏈式儲存結構是一類重要的資料結構,其形式定義如下 而二叉樹的前序 中序遍歷是非常重要的能夠訪問二叉樹所有結點的演算法,下面分別列出一種先序遍歷和兩種中序遍歷的演算法。第一種中序...
二叉樹的二叉鍊錶建立
按滿二叉樹方式建立 補充 在此補充按滿二叉樹的方式對結點進行編號建立鏈式二叉樹。對每個結點,輸入i ch。i 結點編號,按從小到大的順序輸入 ch 結點內容,假設是字元。在建立過程中借助乙個一維陣列s n 編號為i的結點儲存在s i 中。define max node 50 typedef stru...