初學紀錄 - Stack and Queue and Hashtable
抽象的一種資料類型
可以用任何方式來做出 Stack 或是 Queue
- 可以用 array 或是 linked list 做出來
undo / redo button 會使用到 Stack 的資料結構
想像 Stack → 洋芋片罐
- 移除的話從最上面移除
想像 Queue → 排隊
Hash Function
密碼做加密
javascript 的 objectsa and arrays 已經被 hashed 過
理解: 把一個值換成另外一個值
Hash Function I :Division Method
m= hashtable size
n= # of elements to store into hashtable
公式 Index = Key mod m
衝突叫做 collison(有可能會發生)
優點是速度很快,跟 Multiplication Method 比起來
缺點 m 一定要 >= n
- 大小不能是 2 的 p 次方
Collision and Load Factor
Collison:兩個或更多的 objects 被 hashed 成相同的 index
Load Factor:n/m
通常介於 0 ~ 1
m 太小就容易出現 Collison
如過這個值小的話: many empty spots
如果這個值大的話:not too many collisions
Hash Function II: Multiplication Method
m= hashtable size
n= # of elements to store into hashtable
公式 Index = [m(keyA % 1)}
A 是 根號 5 - 1 /2 ( 黃金比例? )
Handling Collisions
處理 Collisions 的方法 → Chaining
首先要知道不管用什麼 hash function 的方法都還是會有 collisions
遇到其實就有所有 element 都放進 array 就好
- hashtable → array of arrays
Stack
LIFO
- Last in first out
沒有 index number
移除跟新增都只能從最上面
Queue
加進去從後面,移除從前面
- 想像排隊,後面來的人排隊伍後面
FIFO
- Frist in first out
沒有 index number
新增 → Enqueue
移除 → Dequeue
Hashtable
Key → 經過 Hash Function 轉成索引
Value → 存在對應位置
沒有 index number(用 Key 取值)
插入、查詢、刪除 → 平均 O(1)
可能發生 Collision(碰撞)
Chaining:用 Linked List 存同一格
Open Addressing:往下一個空位找
不保證順序
小結
Stack 跟 Queue 概念比較想像中單純,需要注意的地方是如何用程式語言去實作出來,意外困難的是 Hashtable 的部分,比我想像的還要複雜,之前對它的概念僅僅只有 key value 的資料結構,可以拿 key 取出 value 這樣,但其實背後還有很多原理再運行著,這塊還得多研究。
