第三十節(jié)-圖的表示

鄰接矩陣存儲(chǔ)方法

圖最直觀的一種存儲(chǔ)方法就是,鄰接矩陣 (Adjacency Matrix)。鄰接矩陣的底層依賴一個(gè)二維數(shù)組瞎颗。

對(duì)于無(wú)向圖來(lái)說桂躏,如果頂點(diǎn) i 和 j 之間有邊,我們就將 A[i][j] 和 A[j][i] 標(biāo)記為 1亏掀;對(duì)于有向圖來(lái)說,如果頂點(diǎn) i 到頂點(diǎn) j 之間,有一條箭頭從頂點(diǎn) i 指向頂點(diǎn) j 的邊纳寂,我們就將 A[i][j] 標(biāo)記為 1。同理泻拦,如果有一條箭頭從頂點(diǎn) j 指向頂點(diǎn) i 的邊毙芜,我們就將 A[j][i] 標(biāo)記為 1。對(duì)于帶權(quán)圖争拐,數(shù)組中存儲(chǔ)的就是相應(yīng)的權(quán)重腋粥。

鄰接矩陣存儲(chǔ)法的優(yōu)點(diǎn)是,直觀架曹,簡(jiǎn)單隘冲,可以利用 CPU 的緩存機(jī)制。缺點(diǎn)是绑雄,浪費(fèi)空間展辞。

對(duì)于無(wú)向圖來(lái)說,一條邊要重復(fù)存儲(chǔ)兩個(gè)位置万牺,浪費(fèi)了一半空間罗珍。對(duì)于稀疏圖來(lái)說,脚粟,很多頂點(diǎn)之間并沒有聯(lián)系覆旱,他們相關(guān)的邊的標(biāo)記位的空間就浪費(fèi)了。

但鄰接矩陣簡(jiǎn)單的存儲(chǔ)方式也使得在此基礎(chǔ)上的算法都實(shí)現(xiàn)起來(lái)比較簡(jiǎn)單核无。比如:

  • 獲取兩個(gè)頂點(diǎn)間的關(guān)系扣唱,直接按數(shù)組下標(biāo)就可以獲得,非常迅速。
  • 用弗洛伊德算法求最短路徑画舌,只要利用矩陣相乘若干次即可得到結(jié)果堕担。

鄰接表存儲(chǔ)方法

鄰接表 (Adjacency List) 最簡(jiǎn)單的實(shí)現(xiàn)方式如下:

如圖可以看到,每個(gè)頂點(diǎn)對(duì)應(yīng)一條鏈表曲聂,鏈表中存儲(chǔ)的是這個(gè)頂點(diǎn)出發(fā)的邊霹购。

與鄰接矩陣相反,鄰接表存儲(chǔ)起來(lái)比較節(jié)省空間朋腋,但是計(jì)算起來(lái)比較耗時(shí)齐疙。不過有辦法對(duì)鄰接表進(jìn)行優(yōu)化。

常見的鄰接表存儲(chǔ)方式的優(yōu)化操作有:

  • 如果鏈表過長(zhǎng)旭咽,可以進(jìn)行“樹化”贞奋。
  • 如果有按順序查找某一頂點(diǎn)相關(guān)頂點(diǎn)的需求。比如按拼音首字母分頁(yè)查找微博粉絲列表穷绵,就可以選擇將鏈表改裝成跳表轿塔。
  • 也可以將鏈表改裝成動(dòng)態(tài)數(shù)組,這樣就可以合理利用 cpu 的緩存仲墨,也可以應(yīng)用二分查找算法進(jìn)行高效查找勾缭。
  • 還可以將鏈表改裝成哈希表,在常數(shù)時(shí)間內(nèi)獲取是否兩個(gè)頂點(diǎn)之間有相關(guān)關(guān)系目养。

如何存儲(chǔ)微博用戶關(guān)系俩由?

數(shù)據(jù)結(jié)構(gòu)是為特定算法服務(wù)的,具體選擇那種儲(chǔ)存方法癌蚁,與期望支持的操作有關(guān)系幻梯。假設(shè)針對(duì)微博用戶關(guān)系,假設(shè)我們需要支持以下操作:

  • 判斷用戶 A 是否關(guān)注了用戶 B
  • 判斷用戶 A 是否是用戶 B 的粉絲
  • 用戶 A 關(guān)注用戶 B
  • 用戶 A 取消關(guān)注用戶 B
  • 根據(jù)用戶名稱首字母排序努释,分頁(yè)獲取用戶的粉絲列表
  • 根據(jù)用戶名稱首字母排序碘梢,分頁(yè)獲取用戶的關(guān)注列表
  1. 那在存儲(chǔ)方式上,因?yàn)樯缃痪W(wǎng)絡(luò)是一張稀疏圖洽洁,所以我們選擇用鄰接表來(lái)存儲(chǔ)痘系。
  2. 因?yàn)橐樵冇脩舯魂P(guān)注的列表,僅用鄰接圖是非常浪費(fèi)效率的饿自,所以我們?cè)僭黾右粡埬驵徑訄D汰翠,存儲(chǔ)用戶的被關(guān)注關(guān)系。加快獲取粉絲列表的速度昭雌。
  3. 基礎(chǔ)的鄰接表查找一個(gè)用戶是否在另一個(gè)用戶的關(guān)注列表中复唤,速度不夠快,所以我們選擇對(duì)鄰接表進(jìn)行優(yōu)化烛卧。
  4. 因?yàn)橐词鬃帜概判颢@取用戶的關(guān)注列表佛纫,所以我們選擇用跳表來(lái)代替鄰接表中的鏈表妓局。
  5. 假設(shè)用戶規(guī)模比較大,一臺(tái)機(jī)器裝不下一整個(gè)表呈宇,我們可以用哈希分片的方式在不同的機(jī)器上存儲(chǔ)這個(gè)表好爬。
  6. 假設(shè)表的大小需要擴(kuò)容,可以把哈希分片方式升級(jí)為一致性哈希分片甥啄。

假設(shè)數(shù)據(jù)需要持久性保存存炮,可以用關(guān)系數(shù)據(jù)庫(kù)保存。并在表上建立索引蜈漓。

假設(shè)數(shù)據(jù)海量穆桂,可以使用專業(yè)的圖數(shù)據(jù)庫(kù)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末融虽,一起剝皮案震驚了整個(gè)濱河市享完,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌有额,老刑警劉巖般又,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異巍佑,居然都是意外死亡倒源,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門句狼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人热某,你說我怎么就攤上這事腻菇。” “怎么了昔馋?”我有些...
    開封第一講書人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵筹吐,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我秘遏,道長(zhǎng)丘薛,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任邦危,我火速辦了婚禮洋侨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘倦蚪。我一直安慰自己希坚,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開白布陵且。 她就那樣靜靜地躺著裁僧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上聊疲,一...
    開封第一講書人閱讀 52,394評(píng)論 1 310
  • 那天茬底,我揣著相機(jī)與錄音,去河邊找鬼获洲。 笑死阱表,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的昌妹。 我是一名探鬼主播捶枢,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼飞崖!你這毒婦竟也來(lái)了烂叔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤固歪,失蹤者是張志新(化名)和其女友劉穎蒜鸡,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體牢裳,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡逢防,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蒲讯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片忘朝。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖判帮,靈堂內(nèi)的尸體忽然破棺而出局嘁,到底是詐尸還是另有隱情,我是刑警寧澤晦墙,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布悦昵,位于F島的核電站,受9級(jí)特大地震影響晌畅,放射性物質(zhì)發(fā)生泄漏但指。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一抗楔、第九天 我趴在偏房一處隱蔽的房頂上張望棋凳。 院中可真熱鬧,春花似錦谓谦、人聲如沸贫橙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)卢肃。三九已至疲迂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間莫湘,已是汗流浹背尤蒿。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留幅垮,地道東北人腰池。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像忙芒,于是被迫代替她去往敵國(guó)和親示弓。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 圖的定義與術(shù)語(yǔ) 1呵萨、圖按照有無(wú)方向分為無(wú)向圖和有向圖奏属。無(wú)向圖由頂點(diǎn)和邊構(gòu)成,有向圖由頂點(diǎn)和弧構(gòu)成潮峦〈衙螅弧有弧尾和弧頭之...
    unravelW閱讀 411評(píng)論 0 0
  • 1)這本書為什么值得看: Python語(yǔ)言描述,如果學(xué)的Python用這本書學(xué)數(shù)據(jù)結(jié)構(gòu)更合適 2016年出版忱嘹,內(nèi)容...
    孫懷闊閱讀 12,506評(píng)論 0 15
  • 1. 圖的定義和基本術(shù)語(yǔ) 線性結(jié)構(gòu)中嘱腥,元素僅有線性關(guān)系,每個(gè)元素只有一個(gè)直接前驅(qū)和直接后繼拘悦;樹形結(jié)構(gòu)中齿兔,數(shù)據(jù)元素(...
    yinxmm閱讀 5,463評(píng)論 0 3
  • 黃卷青燈 美人遲暮 千古一轍
    糖果罐里的權(quán)權(quán)閱讀 109評(píng)論 0 0
  • 曾看過一篇《狗日的中年》文章,作者喇嘛哥把80前后這一代础米,到了中年的人生剖析得十分透徹愧驱,說中年是個(gè)賣笑的年齡,既要...
    的確良閱讀 629評(píng)論 0 1