圖和深度搜索和廣度搜索

一.What-圖的概念:如下就是一個(gè)圖(非線性表數(shù)據(jù)結(jié)構(gòu))

  1. 圖的分類:無(wú)向圖(微信-不允許單向關(guān)注)、有向圖(微博-允許單向關(guān)注)、帶權(quán)圖(QQ-親密度)

  2. 圖相關(guān)概念:

  • 頂點(diǎn):圖中的元素叫作頂點(diǎn)
  • 邊:一個(gè)頂點(diǎn)可以與任意其他頂點(diǎn)建立連接關(guān)系,這種建立的關(guān)系叫作邊
  • 度:跟頂點(diǎn)相連接的邊的條數(shù)叫做度
  • 入度和出度:有向圖中把度分為入度(表示有多少條邊指向這個(gè)頂點(diǎn))和出度(表示有多少條邊是以這個(gè)頂點(diǎn)為起點(diǎn)指向其他頂點(diǎn))
  • 帶權(quán)圖:在帶權(quán)圖中每條邊都有一個(gè)權(quán)重

二.圖的存儲(chǔ)

  1. 鄰接矩陣
  • 鄰接矩陣的底層依賴一個(gè)二維數(shù)組。
  • 對(duì)于無(wú)向圖來(lái)說(shuō),如果頂點(diǎn) i 與頂點(diǎn) j 之間有邊,我們就將 A[i][j] 和 A[j][i] 標(biāo)記為 1;
  • 對(duì)于有向圖來(lái)說(shuō),如果頂點(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)重
  • 缺點(diǎn):浪費(fèi)存儲(chǔ)空間
  1. 鄰接表存儲(chǔ)方法
  • 無(wú)向圖A[i][j] 等于 1,那 A[j][i] 也肯定等于 1,只需要存儲(chǔ)一個(gè)
  • 稀疏圖-頂點(diǎn)很多,但每個(gè)頂點(diǎn)的邊并不多
  • 優(yōu)點(diǎn):
    存儲(chǔ)方式簡(jiǎn)單、直接,因?yàn)榛跀?shù)組,所以在獲取兩個(gè)頂點(diǎn)的關(guān)系時(shí),就非常高效方便計(jì)算。這是因?yàn)?,用鄰接矩陣的方式存?chǔ)圖,可以將很多圖的運(yùn)算轉(zhuǎn)換成矩陣之間的運(yùn)算
    存儲(chǔ)方式:
  • 每個(gè)頂點(diǎn)對(duì)應(yīng)一條鏈表,鏈表中存儲(chǔ)的是與這個(gè)頂點(diǎn)相連接的其他頂點(diǎn)
  • 有向圖的鄰接表存儲(chǔ)方式,每個(gè)頂點(diǎn)對(duì)應(yīng)的鏈表里面,存儲(chǔ)的是指向的頂點(diǎn)
  • 無(wú)向圖來(lái)說(shuō),每個(gè)頂點(diǎn)的鏈表中存儲(chǔ)的,是跟這個(gè)頂點(diǎn)有邊相連的頂點(diǎn)
  • 優(yōu)點(diǎn):存儲(chǔ)節(jié)省空間
  • 缺點(diǎn):查找比較耗時(shí)間(鄰接表中鏈表的存儲(chǔ)方式對(duì)緩存不友好,所以比起鄰接矩陣,在鄰接表中查詢兩個(gè)頂點(diǎn)之間的關(guān)系就沒(méi)那么高效)
  • 可以將鄰接表中的鏈表改成平衡二叉查找樹(shù)(紅黑樹(shù))等動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu)(跳表、散列表等),這樣就可以更加快速地查找兩個(gè)頂點(diǎn)之間是否存在邊了。
  • 可以將鏈表改成有序動(dòng)態(tài)數(shù)組,可以通過(guò)二分查找的方法來(lái)快速定位兩個(gè)頂點(diǎn)之間否是存在邊
  1. 逆鄰接表:每個(gè)頂點(diǎn)的鏈表中,存儲(chǔ)的是指向這個(gè)頂點(diǎn)的頂點(diǎn)

思考

  1. 如何存儲(chǔ)微博、微信等社交網(wǎng)絡(luò)中的好友關(guān)系?支持如下幾個(gè)操作:
    判斷用戶 A 是否關(guān)注了用戶 B;
    判斷用戶 A 是否是用戶 B 的粉絲;
    用戶 A 關(guān)注用戶 B;用戶 A 取消關(guān)注用戶 B;
    根據(jù)用戶名稱的首字母排序,分頁(yè)獲取用戶的粉絲列表;
    根據(jù)用戶名稱的首字母排序,分頁(yè)獲取用戶的關(guān)注列表

  2. 如何找出社交網(wǎng)絡(luò)中的三度好友關(guān)系?(可能認(rèn)識(shí)的人)

  3. 廣度優(yōu)先搜索(BFS)

  4. 深度優(yōu)先搜索(DFS)

  5. 迷宮可以抽象成圖,走迷宮可以抽象成搜索算法,你能具體講講,如何將迷宮抽象成一個(gè)圖嗎?或者換個(gè)說(shuō)法,如何在計(jì)算機(jī)中存儲(chǔ)一個(gè)迷宮?

  6. A、IDA等搜索算法

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容