數據結構學習筆記

數據結構

hashtable實現

有一個非常大的數組來存放value值, 計算hashtable的value值

hash算法

對16進行取模,然後將值存在list中

index = value % 16

先將數據根據hash算法存放在table中,然後在查找時計算散列值

  • 用數組加鏈表來解決衝突
  • 確定hash函數

鏈表

轉置

1

讓第一個節點指向空,第二個節點指向第一個節點,第三個節點指向第二個節點….

用一個temp來記錄當前節點
讓當前節點指向reverseNode
reverseNode的值初始爲None,
然後當前節點賦值給reverseNode,當前節點後移一位,讓當前節點的下個節點指向reverseNode,也就是當前節點。
完成轉置

while(currentNode)
temp=currentNode
currentNode=currentNode->next
temp.next=ReverseNode
ReverseNode=temp

鏈表轉置的遞歸實現

一直調用反轉函數,直到最後一個節點
NodeList * reverse(NodeList *p){

if p==Null || p .next==NULL
p=head
return p;

else :
p1==reverse(*p)
p=p1.next
p.next=Null
return p;

2

讓第一個節點指向第三個節點,tempNode保存第二個節點,第二個節點指向第一個節點,然後第三個節點再指向第二個節點

依次添加在第一個節點的尾部b

鏈表轉置的方法, 將left right作爲緩衝,將當前節點的下一個元素緩存起來放在right中,將 當前節點指向left,(也就是他的上一個節點)
然後把當前節點放在left中,當前節點往後移一個
重複這個過程,所有節點都會指向他前面的那個節點了,也就是放在left中的
1->2->3->4
right=left=null
current=1
right=2
2->left
left=1

current=2
right=2 left=1
right=3
2->1
left=current=2

current=3
right=4 left=2->1
3->2->1
left=current=3
current=right=4

二叉樹

完全二叉樹
葉子節點只可能在最大的兩層上出現


  • 頂點數等於所有度數+1

二叉搜索樹 binary tree

左子樹節點小於根節點,小於右子樹節點
左右子樹也是二叉搜索樹

從小到大輸出,應該是左中右 中序遍歷

2 .前序遍歷 根左右
中序遍歷 左根右
後序遍歷 左右根

b樹

多路搜索樹,用於數據庫中

通過降低樹的深度來減少查找的頻率

降低深度的方法:

M序b樹:

  • 任何節點最多有M個子節點
  • 任何非葉節點至少含有M/2個節點
  • 根節點至少還有兩個子節點
  • b樹只支持隨機檢索,b+樹既支持隨機檢索也支持順序檢索

N個節點的M序b樹的高度

第2層至少有兩個點,

第3層每個點至少還有M/2個點。 2*M/2

第4次 2*(m/2)^2個點

第5層 2*(M/2)^3

第L層 2*(m/2)^(l-2)

l-1=log(m-2) *(N+1)/2+1

b+樹的讀寫效率更高

霍夫曼樹

根節點最大的堆叫做最大堆

根節點最小的堆爲最小堆

插入 O(logn)

創建O(n)

堆排序

堆排序是完全二叉樹

滿二叉樹:除了最後一層沒有葉子節點外,其他節點都是滿的,節點數達到了最大值

利用堆的性質,最大堆,子節點的值總小於父節點,最小堆相反

dfs 和bfs

判斷圖是否稀疏的方法

  • 動態規劃,動態規劃的原理

dfs 時間複雜度

數據結構 dfs bfs dijkstra Bellman-ford
鄰接矩陣 O(V2) O(V2) O(v2) O(VE)
鄰接鏈表 O(V+E) O(V+E) O(VE)
二叉堆 O(V+E)logv)

算法和基礎知識

中綴表達式

1+((2+3)×4)-5 轉換爲後綴表達式

  • 後綴表達式從左往右
    • 123+4×+5-
  • 前綴表達式從右往左
    • 5432+×

二分查找(根據元素找到下標)

首先是排好序的
根據元素找到下標:
middle=0+size;
if a[index]>a[middle]:
low=middle+1
else:
high=middle-1


鏈表

插入時間複雜度:O(1)
刪除時間複雜度O(n)
刪除尾部元素 需要知道鏈表長度

折半查找的平均次數

每次掃描全數組,找到中間的數,然後把數組分爲兩部分繼續,
平均次數就是每個數掃描的次數全部加起來,然後除以數的總個數,即可

1,2,3,4,5,6,7,8,9,10
第一次找到6,6搜索了一次
1,2,3,4,5 ,7,8,9,10 兩次
12,45, 78,9 10 3次
2 5 , 8 10 4次

計算方法:
將全部數字畫作完全二叉樹,然後每層節點數*書的高度加起來,除數目

kmp算法

排序

冒泡排序

1,2,4,345,546,5686,74,521,32,12,3,2,43,345,5,34,5

從左邊選一個最大的數放在最右邊,然後再從(0,i-1)中選一個最大的數放在最右邊。
左右交換

快速排序

堆排序

  • 堆的插入時間複雜度,堆的數據結構有哪些

逆波蘭數

數據進棧出棧

基礎知識

反碼

正數的反碼等於他本身

負數的反碼等於各項取反,符號位除外,第一位表示符號位

10010->11101

補碼

正數的補碼等於他本身,負數的補碼等於反碼+1

10010->11101->11110

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章