iT邦幫忙

2023 iThome 鐵人賽

DAY 7
0
Software Development

Easy to learn Algorithm系列 第 7

「Day7」資料結構-圖形&雜湊

  • 分享至 

  • xImage
  •  

昨天的樹狀結構是描述節點與節點之間,而圖形結構是兩個頂點之間是否相連。在圖形中連接兩點的邊若填上加權值,這類就稱為網路。

圖形簡介

圖形理論最早是18世紀的尤拉提出的,為了解決「肯尼茲堡橋樑」,而想出來的理論,是著名的七橋理論。尤拉當時使用的方法就是圖形理論。

當時東普魯士柯尼斯堡跨普列戈利亞河,和中心有兩個小島。小島與河的兩岸有七條橋連接。在所有橋都能只走一遍的前提下,如何才能把所有的橋都走遍?

尤拉把實際的抽象問題轉化為平面上的點與線組合,每一座橋視為一條線,橋所連接的地區視為點。這樣若從某點出發後再回到這個點,這一點的線數必須是偶數,稱為偶頂點。連有奇數條線的點稱為奇數點。

尤拉的結論是,當所有頂點的分支度皆為偶數時,才能從某頂點出發,經過每一邊一次再回到起點。但在肯尼茲堡每個頂點分支度是奇數,所以思考的問題不可能發生,此理論就是尤拉環(Eulerian cycler)理論。

但如果條件改成從某頂點出發,經過每邊一次,不一定要回到起點,只允許其中兩個頂點的分支度是奇數,其餘則必須是偶數,符合這樣的稱為尤拉鏈(Eulerian chain)。

圖形的定義

圖形是由頂點和邊所組成的集合,用G = (V,E)表示,其中V是所有頂點所成的集合,而E代表所有邊的集合。

圖形有分兩種:無向圖形及有向圖形,無向圖形以(V1,V2)表示,有向圖形以< V1, V2>表示。

🧋 無向圖形(Undirected Graph)

無向圖形是一種具備同邊的兩個頂點沒有次序關係,且邊集合的每一個邊都沒有方向性。

如此範例(V1,V2)與(V2,V1)

V = { A, B, C, D, E}
E = {(A, B), (A, E), (B, D), (B, C), (B, E), (C, E), (D, E)}

🧋 有向圖形(Directed Graph)

有向圖形的邊集合中的每個邊都有方向性

如此範例()

V = {A,B,C,D,E}
E = {<A, B>, <B, C>, <C, D>, <C, E>, <E, D>, <D, B>}

雜湊表

雜湊表是一種儲存記錄的連續記憶體,能透過雜湊函數的應用,快速存取與搜尋資料。透過雜湊函數,計算鍵對應到容器內部的索引位置,而找到對應的值(value)。簡單來說雜湊函數就是將本身的鍵值,經由特定的數學函數運算或用其他方法,轉換成相對應的資料儲存位址。

這邊來介紹有關雜湊的名詞:

🍚 bucket(桶): 雜湊表中儲存資料的位置,每一個位置對應到唯一的一個位址,桶就好比一筆紀錄

🍚 slot(槽): 每一筆紀錄中可能包含好幾個欄位,而slot就是桶中的欄位

🍚 collision(碰撞): 若兩筆不同的資料,經過雜湊函數運算後,對應到相同的位址時就稱為碰撞

🍚 溢位: 如果資料經過雜湊函數運算後,對應到的bucket已滿,就會使bucket溢位

🍚 雜湊表: 儲存記錄的連續記憶體。就像資料表的索引表格,可分為n個bucket,每個bucket又可分為m個slot

index name phone
001 Easyfun 02-123-456
002 Mike 03-123-456
003 EJ 04-123-456

🍚 同義字(synonym): 當兩個識別字I1及I2,經過雜湊函數運算後所得的數值相同,即f(I1) = f(I2),則稱I1與I2對於f這個雜湊函數是同義字

🍚 載入密度(loading factor): 指識別字的使用數目除以雜湊表內槽的總數

α(載入密度) = n(識別字的使用數目) / s(每一個桶內的槽數) * b(桶的數目)

🍚 完美雜湊(perfect hashing): 指沒有碰撞或溢位的雜湊函數

  • 降低碰撞與溢位的產生

  • 雜湊函數不宜過於複雜,越容易計算越佳

  • 盡量把文字的鍵值轉換成數字的鍵值,以利雜湊函數的運用

  • 所設計的雜湊函數計算而得的值,盡量能均勻地分佈在每一桶中,不要太過於集中在某一桶內,以降低碰撞並減少溢位的處理

今天把資料結構的圖形和雜湊介紹完,資料結構大概就到這邊,後面都還會詳細的介紹這些資料結構的演算法。

但你要試著想一下,到底什麼是抽象資料型態(因為抽象所以無法想像🙄),但其實日常就有在用到抽象的資料了,不覺得這些都很平易近人嗎🙆

目前應該不會太難吧🦉🦉!!

要是哪裡理解上還是邏輯上有錯請各位大大指正,感謝 🧙🧙🧙。

資料來源 :
[1]: https://en.wikipedia.org/wiki/Graph_theory
[2]: https://rust-algo.club/collections/hash_map/index.html


上一篇
「Day6」資料結構-樹狀結構
下一篇
「Day8」排序演算法
系列文
Easy to learn Algorithm30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言