常用資料結構介紹
阿新 • • 發佈:2019-01-01
連結串列:連結串列儲存,順序訪問
1.棧
2.佇列
3.串
4.樹
1)二叉樹
2)遍歷二叉樹:
前序(先中間,再左邊,後右邊)
中序(先左邊,再中間,後右邊)
後序(先左邊,再右邊,後中間)
3)線索二叉樹:用二插連結串列實現的二叉樹,將那些沒有使用的左右指標指向前驅和後繼(前驅和後繼就是遍歷後(例如用中序遍歷)的資料序列某一個數據的前面和後面的資料),形成的二叉樹為線索二叉樹。一般用在經常遍歷和利用前驅和後繼查詢結構的情況。
4)赫夫曼樹:用於壓縮
5)二叉排序樹:根節點的左子樹若不為空,則左子樹所有節點都小於根節點。根節點的右子樹若不為空,則右子樹所有節點都大於根結點。根節點的左右子樹不為空,則其都是二叉平衡樹。
6)平衡二叉樹:一顆左右子樹高度差至多等於1的二叉排序樹。
新增節點的時候,根據不平衡子樹左旋右,保證最後的樹是平衡的。
優點:查詢,插入,刪除時間複雜度都是:O(logn)
7)多路查詢樹:結點的孩子不止為兩個,結點存的值補位一個。如2-3樹,2-3-4樹,B樹,B+樹
8)紅黑樹:也是二叉排序樹。利用一個結點的屬性表明這個結點是紅是黑。查詢等同於二叉排序樹。插入和刪除利用這個顏色屬性來保證操作之後樹還是平衡的。所以查詢,插入和刪除的時間複雜度都是:O(logn)。統計效能比平衡二叉樹好
9)堆:二叉樹,分為大頂堆,小頂堆。大頂堆的要求是每個節點的值都不大於其父節點的值,小頂堆放過來。
5.圖
1)五種構造圖的方式
2)遍歷:
深度優先:一個勁的朝一個方向使勁,當重複了就返回
廣度優先:先從一個頂點觸發,拿到這個頂點,再把與這個頂點相關的頂點放入佇列,再從佇列取資料,再把與這個新取的頂點相關的頂點(非重複過的頂點)放入佇列,依次同理操作
3)最小生成樹:
普里姆(Prim)演算法:O(n2)
克魯斯卡爾(Kruskal)演算法:O(e*loge)
4)最短路徑:
迪傑斯特拉(Dijkstra)演算法O(n3)
弗洛伊德(Floyd)演算法O(n3)
5)拓撲排序:AOV網:用頂點表示活動,用弧表示優先關係的有向圖
拓撲排序演算法:O(n+e) n個頂點e條邊
6)關鍵路徑:AOE網:用頂點表示時間,用有向邊表示活動,用邊的權值表示持續的時間的有向圖
關鍵演算法路徑:O(n+e)
6.查詢
1)順序表查詢:從第一個開始順序查詢
2)有序表查詢:
折半查詢,
插值查詢:對於均勻分佈的資料,用差值查詢方便
斐波那契查詢
3)線性索引查詢:
稠密索引(每個記錄有關鍵碼,對關鍵碼排序形成的表),
倒排索引(次關鍵碼,記錄號表),
分塊索引(將記錄分成多少塊,塊間有序,塊內無序,上一個塊的最大關鍵碼小於下一個塊的所有關鍵碼)
4)散列表(Hash表)查詢
處理衝突:
a.開放定址法:一個地址已被入住,再找下一個空的地址
再雜湊:用多個雜湊函式,一個函式查詢重複,再用另一個
鏈地址法:衝突了,在這個位置用連結串列連起來
公共溢位方法:用另一個hash表儲存衝突的資料
7.排序(從小到達):
冒泡:從最後一個數據開始,讓最小一個數據冒泡到第一個位置。然後第二小冒泡到第二位置。O(n2)
選擇:從n-i-1個數據中選擇最小的,找到後將其與i位置調換,重複此操作。O(n2)
插入:先用第一個資料放到給定位置,然後取出第二個資料,與已排序好的資料比較,插入到此有序序列的對應位置。O(n2)
希爾:以某個增量i為基準,先依次將k與k+i位置比較決定是否交換,然後k++。得到一個基本有序的序列,然後減小i,再進行k與k+i位置比較決定是否交換,然後k++。操作完繼續i減少,直到i<=1,並操作一遍後結束。得到的序列就是有序的。O(n3/2)
堆:將序列構成一個堆,然後取走堆頂,讓剩下的資料再構成一個堆,再依次重複操作取走。O(n*logn)
歸併:n個數據分成n個表,肯定每個表有序,然後兩兩合併成n/2個有序表,再兩兩合併成有序,重複操作,直到只有一個表。O(n*logn)
快速:先通過一頓操作,將序列變成前面一部分記錄都比後一部分記錄小,然後分別對這兩部分記錄同理操作,最後,最小的一部分只有兩個數(也有是一個數的,那肯定有序),小的在前面肯定有序,最後,就得知整個序列是有序的。O(n*logn)
8.時間複雜度logn的出現一般是將整體分成各個子部分,然後子部分沒成功,將子部分再分成子部分。複雜度一般出現在遞迴中或迴圈巢狀中
1.棧
2.佇列
3.串
4.樹
1)二叉樹
2)遍歷二叉樹:
前序(先中間,再左邊,後右邊)
中序(先左邊,再中間,後右邊)
後序(先左邊,再右邊,後中間)
3)線索二叉樹:用二插連結串列實現的二叉樹,將那些沒有使用的左右指標指向前驅和後繼(前驅和後繼就是遍歷後(例如用中序遍歷)的資料序列某一個數據的前面和後面的資料),形成的二叉樹為線索二叉樹。一般用在經常遍歷和利用前驅和後繼查詢結構的情況。
4)赫夫曼樹:用於壓縮
5)二叉排序樹:根節點的左子樹若不為空,則左子樹所有節點都小於根節點。根節點的右子樹若不為空,則右子樹所有節點都大於根結點。根節點的左右子樹不為空,則其都是二叉平衡樹。
6)平衡二叉樹:一顆左右子樹高度差至多等於1的二叉排序樹。
新增節點的時候,根據不平衡子樹左旋右,保證最後的樹是平衡的。
優點:查詢,插入,刪除時間複雜度都是:O(logn)
7)多路查詢樹:結點的孩子不止為兩個,結點存的值補位一個。如2-3樹,2-3-4樹,B樹,B+樹
8)紅黑樹:也是二叉排序樹。利用一個結點的屬性表明這個結點是紅是黑。查詢等同於二叉排序樹。插入和刪除利用這個顏色屬性來保證操作之後樹還是平衡的。所以查詢,插入和刪除的時間複雜度都是:O(logn)。統計效能比平衡二叉樹好
9)堆:二叉樹,分為大頂堆,小頂堆。大頂堆的要求是每個節點的值都不大於其父節點的值,小頂堆放過來。
5.圖
1)五種構造圖的方式
2)遍歷:
深度優先:一個勁的朝一個方向使勁,當重複了就返回
廣度優先:先從一個頂點觸發,拿到這個頂點,再把與這個頂點相關的頂點放入佇列,再從佇列取資料,再把與這個新取的頂點相關的頂點(非重複過的頂點)放入佇列,依次同理操作
3)最小生成樹:
普里姆(Prim)演算法:O(n2)
克魯斯卡爾(Kruskal)演算法:O(e*loge)
4)最短路徑:
迪傑斯特拉(Dijkstra)演算法O(n3)
弗洛伊德(Floyd)演算法O(n3)
5)拓撲排序:AOV網:用頂點表示活動,用弧表示優先關係的有向圖
拓撲排序演算法:O(n+e) n個頂點e條邊
6)關鍵路徑:AOE網:用頂點表示時間,用有向邊表示活動,用邊的權值表示持續的時間的有向圖
關鍵演算法路徑:O(n+e)
6.查詢
1)順序表查詢:從第一個開始順序查詢
2)有序表查詢:
折半查詢,
插值查詢:對於均勻分佈的資料,用差值查詢方便
斐波那契查詢
3)線性索引查詢:
稠密索引(每個記錄有關鍵碼,對關鍵碼排序形成的表),
倒排索引(次關鍵碼,記錄號表),
分塊索引(將記錄分成多少塊,塊間有序,塊內無序,上一個塊的最大關鍵碼小於下一個塊的所有關鍵碼)
4)散列表(Hash表)查詢
處理衝突:
a.開放定址法:一個地址已被入住,再找下一個空的地址
再雜湊:用多個雜湊函式,一個函式查詢重複,再用另一個
鏈地址法:衝突了,在這個位置用連結串列連起來
公共溢位方法:用另一個hash表儲存衝突的資料
7.排序(從小到達):
冒泡:從最後一個數據開始,讓最小一個數據冒泡到第一個位置。然後第二小冒泡到第二位置。O(n2)
選擇:從n-i-1個數據中選擇最小的,找到後將其與i位置調換,重複此操作。O(n2)
插入:先用第一個資料放到給定位置,然後取出第二個資料,與已排序好的資料比較,插入到此有序序列的對應位置。O(n2)
希爾:以某個增量i為基準,先依次將k與k+i位置比較決定是否交換,然後k++。得到一個基本有序的序列,然後減小i,再進行k與k+i位置比較決定是否交換,然後k++。操作完繼續i減少,直到i<=1,並操作一遍後結束。得到的序列就是有序的。O(n3/2)
堆:將序列構成一個堆,然後取走堆頂,讓剩下的資料再構成一個堆,再依次重複操作取走。O(n*logn)
歸併:n個數據分成n個表,肯定每個表有序,然後兩兩合併成n/2個有序表,再兩兩合併成有序,重複操作,直到只有一個表。O(n*logn)
快速:先通過一頓操作,將序列變成前面一部分記錄都比後一部分記錄小,然後分別對這兩部分記錄同理操作,最後,最小的一部分只有兩個數(也有是一個數的,那肯定有序),小的在前面肯定有序,最後,就得知整個序列是有序的。O(n*logn)
8.時間複雜度logn的出現一般是將整體分成各個子部分,然後子部分沒成功,將子部分再分成子部分。複雜度一般出現在遞迴中或迴圈巢狀中