數據結構
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