日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

图的定义存储和遍历(一级)

發布時間:2024/4/13 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图的定义存储和遍历(一级) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

圖:是一種多對多的關系,圖這一塊我們不進行過多的說明我們這里又一個高德地圖搜索路徑的截圖,我們要搜索起點北京大學的總校區,重點是清華大學,我現在選擇的是駕車而不是公交,如果是公交可能有其他的路徑,如果是火車可能是達到不了的,是不是一下子給我們提供了幾條路徑啊,3條路徑,為什么有3條路徑啊它有不同的依據,比如說紅綠燈最少的,避免頻繁停車,擁堵較少的,可能某些路段比較堵,即使沒有紅綠燈也會有比較長的時間,還有一個距離最短的,理論上距離短的話時間就會比較少,但是也不見得,這是我們見到的一個非常熟悉的功能,但是我們仔細想一下后臺的實現的話,我不由的想出3個問題,哪三個問題啊第一個問題:高德地圖有那么多的地址,那么多的線路,好復雜啊,那采用了什么數據結構?第二個問題:有這么多的地點和線路,他在計算機里面是如何存儲的,也就是存儲的數據結構是什么?第三個問題:高德地圖已經把相關的信息保存起來了,那它是怎么從這么多信息里面找到我們相關的符合各種規則的路徑的呢?并且各種路徑有不同的依據 要回答這三個問題問題1:采用的數據結構叫什么,叫圖,不是線性表,不是樹,是圖,圖是一種多對多的網狀的關系問題2:那這些地點和線路是怎么存儲的,那就涉及到圖的存儲結構,簡單來說,兩種結構,第一個,順序結構,第二個,鏈式存儲結構問題3:怎么找到按照不同的標準提供的路徑的呢,那有紅綠燈少的那就有紅綠燈多的,他肯定是通過比較最后找到紅綠燈少的,這就涉及到了一個最短路徑的問題學完了我們這一章之后呢,大家對這三個問題就明白了,我們這一章的講解也是圍繞這這三個問題來說的先看第一個問題,他采用的是圖的存儲結構,那就是圖的定義,最短路徑,講最短路徑之前,我們先講一下圖的遍歷,現在圖的定義,什么叫圖?簡單來說這就是兩張圖唄,網狀結構,各個節點代表什么含義,比如我們各個公交站,各個地鐵站,各個城市,那連線代表什么含義,表示他們之間是直接相通的,也就是我們這個圖是由什么組成的,圖是一種網狀的數據結構,有頂點,還有描述頂點之間關系組成的有無向圖,也有有方向的,有什么區別嗎,有方向的表示a可以到d,看這個箭頭的方向,a是不是可以到d,d能到a嗎,d直接到a是不可以的,你要想到,deca,可以這么來到,那無向圖是怎么回事,無向圖是雙向通的,其實還是有向的,都是想通的,既可以從a到d,也可以從d到a,無向圖實際上是有向圖,是雙向圖,adbce我們稱之為頂點吧,稱之為圖的頂點,那一個一個的邊我們稱之為弧或邊,這是一個,明確一下你看這個圖好怪啊,這個圖各個連線,都標了不同的數字,那這個數字有什么意義,這個意義可大了,比如這個A代表北京,B代表石家莊,c代表沈陽,那先代表他們是想通的,那數字可以代表他們之間的距離,是可以代表距離的,或者是代表時間,因為一般時間和距離不一定成正比,可能會擁堵,有一個有高速公路,有一個可能沒有高速公路,一個有高鐵,一個沒有高鐵,那距離長度有時候也不能說明問題,可能也代表時間,這叫做加權圖,3,4,7就成為這條邊的權值,這個大家記住:在實際應用中,圖不但需要表示元素之間是否存在某種關系,而且要加一個與實際意義相關的值,那這個值我們稱之為權,代表距離啦,代表時間的消耗啦,這張圖我們就稱之為加權圖,這個我們也能夠理解,關于圖的定義我們就給大家講到這里 什么叫圖,有向圖和無向圖,加權圖,有頂點和很多的邊來組成,這是圖的定義,生活中有沒有這樣的案例,中國的交通網,地鐵圖,都是網狀結構,再往下看,這樣的圖在計算機里面到底該怎么存儲呢,這實際上只是他的邏輯結構,那我們在計算機里面究竟該怎么來存,兩種方式吧1. 鄰接矩陣:就是二維數組,就相當于順序結構,可以認為就是順序結構的,我們來看一下是怎么來存的,先看一下無向圖,頂點中間有邊,怎么辦,我就一個二維的數組,不是有4個頂點嗎,那就4行4列,你這個從a是不是能到b,那我就從a到b寫個1唄,那你從b也能到a,那在這里也寫個1,從c能到d嗎,從c到d無窮大∞,無窮大的,反過來從d到c有沒有,沒有,從d到c也是無窮大,有人說那從a到a呢,從b到b呢,到他自己呢,我們也規定為無窮大,對象線上面的,我們也都給他寫成無窮大,這么來表示,那你發現了沒,如果用二維數組來表示圖像圖的話,你發現這個二維數組有什么特點,它是關于這條對角線對稱的,右上半部分和左下半部分是不是一樣的,是一樣的,這是一個無向圖,有向圖一樣,一共有4個頂點,從a能到b,有我們用1來表示,那從b能到a嗎,不能,所以從b到a我們就認為無窮大∞,從c能不能到d,從c到d無窮大,從d到c,也是無窮大,從d到a呢,從a到d也是可以的,同樣對角線上的還都是無窮大∞,自己到自己我們認為是不可達的,這是我們所說的有向圖,有向圖關于這條對角線對稱嗎,不對稱,因為他不是雙向的,那我們就用鄰接矩陣把這個圖給表示了,但是他這個時候有個缺點,他有個什么缺點,只要路徑想通,就用1來表示,那我們從這個圖我們能看到什么啊,我們只能看到這兩個頂點有沒有路徑,但是這兩個路徑多長花了多少時間,知道嗎,不知道,什么時候知道了,那就要使用加權圖了加權圖我們怎么來表示,我們還是以有向圖來講,a到b有沒有路徑,有路徑,并且權值是3,a到b權值是3,b到a有沒有,沒有,b到a那就是無窮大,c到d是5,d到e無窮大沒有,但是反過來e到d是不是就有了,這個時候他就不是和上面一樣都是1了,1只能表明有這種關聯這個不僅表示有關聯,還表示關聯的值,加權圖我們這么來表示,這是我們使用鄰接矩陣來表示的2. 鄰接表:就是鏈表,鏈式存儲結構,還有一種就是我們采用鏈式存儲結構唄,叫鏈表,我們看他該怎么表示,基本上主體結構是一個數組,每個數組后面引一個鏈表,首先告訴我他又幾個節點,幾個頂點,4個,那好,那我整個數組的長度是幾,是4,abcd存的編號分別是0123,這是不是代表著數組的索引,這只能說明我有4個頂點,能說明他們呢頂點之間的關系嗎,說明不了,怎么才可以說明可以和b相連,可以可以和c相連,也可以和d相連,怎么辦呢,我們這么來做,a和c相連,還帶權值,就在a的后面引入一個鏈表,第一個節點1代表什么含義,1是b的索引,e1是權值,告訴我這個2是什么含義,為什么這里寫個2,是不是c的索引,e2是a到c的權值,3是d,a和d也是相連的,e3是什么意思,e3是這條邊的權值,后面沒有了,與a相連的有三個,他們的索引分別是1,2,3,我想知道c有幾個頂點相連,c只有0,0就是a唄,0代表a,e2就是權值,這是我們所說的鏈式存儲結構,那下面這個圖又有什么區別上面是無向的,下面是有向的,5個頂點怎么辦,有一個數組,這個主結構是一個數組,是不是5個元素,從0一直到4,目前我們可以看到,c可以到1,1是b,權值是e3,然后c還可以到d,d是3,權值是4,而我們只能見到存儲結構的,這是我們所講的圖的存儲結構,主要是這兩種方式,那種方式用的比較多,還是鏈式的用的比較多,這是我們所說的一個內容,有人說數組會占用更多的空間,我們不僅要考慮誰占的空間多,誰占的空間少,還要考慮后續哪個操作簡單,哪個復雜,這就是我們所說的圖的存儲結構,我們掌握到這個程度就可以了 我們再來看一下圖的遍歷,圖的遍歷是怎么回事啊,我們學過樹的遍歷了,有線性遍歷,有樹的遍歷,先序遍歷,中序遍歷,后序遍歷按層次遍歷,這一塊我們已經把它們掌握了,什么叫圖的遍歷,這概念和樹是差不多的,從圖的某個頂點出發,按照某種方法對圖中所有的節點訪問且僅訪問一次,我們遍歷就是把所有的節點走一遍,是后面很多算法的一個基礎,比如我們后面的關鍵路徑,拓撲排序,連通性,這都是圖后面相關的一些問題,他們都是建立在圖的遍歷基礎上的,首先我要把每個頂點走一遍,我在走一遍的過程中要做哪些事情,這個大家要知道,圖的遍歷沒有先根,沒有后根,沒有中根,為什么,因為對于圖來說他有沒有根啊,它是沒有根的,深度優先遍歷,和廣度優先遍歷,他又這么兩種遍歷方式,縮寫是DFS和BFS,告訴我FS是什么含義,FS是first search優先遍歷,B是breadth廣度,D是depth深度,是不是有相應的單詞,這個大家記住了,深度優先遍歷記住,類似于樹的先根遍歷,大家想一下,對于樹的先根遍歷,我們有幾種方式來實現,算法的實現,一種是遞歸的,一種是非遞歸的,非遞歸的我們要應用棧,對于圖的深度優先遍歷可以采用遞歸的方式或者采用棧的非遞歸的方式來實現,當然他比樹的遍歷要復雜了,別的不說,首先存儲就復雜了,存儲就比樹要復雜廣度優先遍歷,相當于樹的層次遍歷,按照層次遍歷,那你好好想一下,樹的層次遍歷是怎么來實現的,有沒有遞歸的方式,樹的層次遍歷有沒有遞歸的,沒有,是借入隊列的方式實現的,我們同樣圖也是,借助隊列的非遞歸方式來實現下面我給大家走一下過程,我們對于這個圖來說,對它進行深度遍歷,舉個列子來說,這是北京,這是石家莊,這是天津,這是沈陽,這是鄭州,這是武漢,這是長沙,比如我從北京開始,所有的城市都走一遍,怎么走啊,這是不是相當于網狀結構啊,鐵路是不是連接到一起了,那我這個時候該怎么走啊,兩種方式,第一種方式一條道走到黑,北京-石家莊-鄭州-武漢-長沙-廣州,一條路下來的,這叫什么,這叫深度優先遍歷,一直找下一個,一直找下一個,是這么來的,相當于先根遍歷,最左邊的一直往下走,就是這么來的,那你覺得廣度優先遍歷是怎么回事啊,我要是如果從北京開始的話,我先訪問廣度,不是深度,先要訪問彼此相鄰的城市,誰和他相鄰,石家莊,天津,沈陽,你這兒不是還有濟南,這邊還有上海,先訪問北京相鄰的這些,然后訪問石家莊相連的,訪問天津相連的,訪問沈陽相連的,一級一級來訪問,按照遠近來訪問,這相當于廣度優先遍歷,不就是按層次嗎,那么我們下面來看了,我們給大家準備了三個例子我就不信大家學不會,我講了第一個之后第二個要大家自己來寫,包括第三個你自己能寫出來,先看第一個,目前我們畫的圖都是無向圖的從0開始,第一個是0,深度優先,一條路往下走,是不是可以走1,也可以走2啊,你總要寫一個吧,那我們就寫那個數小的吧,選1就可以了,1怎么辦,繼續往下,是不是有3也有4,那我們就先寫這個3吧,寫了3之后怎么辦,你的下一步只能是7了,一條路往下走,然后再往下走,走誰啊,走4,再往下走,1,遍歷的時候會進行標記的,1訪問過了,訪問過了怎么辦,這個過程是遞歸的,或者你利用棧的,當你訪問到4的話,1已經訪問過了,一步一步的往回退,先退到7這兒,然后退到3這兒,再退到1這兒,再退到0這兒,因為一路退回來沒有別的頂點,如果我們7這個要是有個頂點,你看先4退到7,就會先訪問這個頂點,再往后退,再往后退,沒有頂點,這棵樹走完,再往后退,又退到這兒,還有頂點嗎,有,你發現這條道走完了,是不是還有另外一條路啊,這好比是從北京到石家莊,鄭州武漢到廣州了,到點要回來一趟,把這些城市訪問一遍,再開始另外一條路線,從這兒開始再走2,2下面一直往下走,5,然后是多少啊,6,看是不是和我們下面的結果一樣:01374256這是一個,這是我們說的深度優先遍歷,我們下面還有兩個例子,廣度優先該怎么辦,就像我們樹的遍歷一樣,他要借助一個隊列來實現,先把0放到隊列里面,然后誰先出去啊,0先出去,0出去之后把它兩個直接相連的1和2放到這兒,這些相連的放到這兒,然后讓1再出去,1出去之后再做一件事,與1相鄰的3放到這,4也放到這兒,下一個怎么辦,讓2出去,2出去的話,與2相連的,5和6,放到這兒,然后3再出去,3出去了,與3相連的,這里有個7,4出去,與4相連的有個7,是不是有個7,那我們這里再放個7,或者我們這里不放7,7可以做個標記,已經放進去了,這都是算法里面可以來變通的,可以有這些變化的,然后5再出來,5有沒有孩子,有沒有下一個,這是不是有6啊,6已經放進來了,可以做一下標記,6再出來,還有2,2已經進去過,最后還有7,還有4,還有3,那都已經標記過了,按照這個方式,01234567,相當于我們如果把它看成一棵樹的話,先第一層,再第二層,再第三層,再第四層,就按照這種方式來訪問就可以了,記住這個隊列就可以很輕松的搞定了 我們再來看一個,我們看下面這個,告訴我這個圖比上面這個圖要復雜一下了,我們首先進行深度優先遍歷,下面的結果先不要看,這是深度優先的一個過程,這是廣度優先的一個過程,我們從A開始,首先是A,深度優先啊,先是A,然后有B有C,我們總要寫一個唄,我們就選B,然后選E,然后選F,然后再選一個C,注意下面該怎么辦,就往后退了,正好退的時候比較簡單,是不是沒有其它頂點,有的話要順便訪問以下,遞歸遍歷,B又退回來了,下一次該怎么辦了,D,D怎么辦,G,有兩個,一個是I,一個是H,我們該訪問H,訪問小的唄再訪問D了,D訪問過了怎么辦,往后退,退到G了,還有一個呢,I,把這個I再訪問一下,訪問I怎么辦,繼續往后退,退到最后退這個根,是不是都解決了,abefcdghi,沒有問題,還有不清楚的按照這個順序這個步驟來看就可以了,廣度優先該怎么辦,一般使用隊列來實現的,借助一個隊列來實現的,怎么辦,先放誰,先放A,B,C,D,對于B來說有E,對于C來說有F,對于G來說有H,對于G來說有I,abcdefghi,這是我們講的廣度優先的一個案例,那就給大家講到這兒了,把這個圖的深度優先和廣度優先的寫出來,我們繼續來看圖像圖的深度優先和廣度優先的遍歷,這是我們的第三個例子,這次聽懂,前兩個回頭一看就知道了,現在講深度優先,從A開始,有3個路徑,B,C,D都可以,選一個唄,選B吧,選B的話怎么辦,選B的話又相連了,有E有C,最后只能走F了,下回在走D,然后怎么辦,是不是繞了一圈繞道主目錄里面去了然后怎么辦,往后退,F還有一段,是H,然后走I,下邊該怎么辦了,從I開始退,退到H,再退到F,再退到C,再退到B,還有一套路徑呢,E和G,這是一個哦,明確了,和我們的結果一樣嗎,一樣的,那我們再來看一個廣度優先不是問題吧,廣度優先怎么辦,你就畫一個隊列,先是A,然后就是B,C,D,先找直接相鄰的,下邊該誰了,跟B相鄰的,E,和C相鄰的,F,與D相連的,不是F嗎,BCD相連的都說了,跟E相連的G,根F相連的H,下邊該怎么辦了,跟G相連的沒有,跟H相連的,I,ABCDEFJHI,就是他了,這是我們說的一個遍歷,A擁有三個相鄰的,不管是廣度還是深度優先,里面選B,還是選C,到底是選D,我們現在說選個小的,那實際中它是怎么來的,實際中它是這么來的比如說你要采用鏈式存儲結構,你要找A相連的節點,他先找第一個,這個結構大家確定了,與a相鄰的節點,是訪問a,還是訪問b,還是訪問d,表里面如果兩個節點交換一下順序,他的順序就變了,它是按照這個順序來就可以了,這是我們講的關于圖的相關內容,圖的定義,圖的存儲,還有圖的遍歷,給了一些廣度深度一些算法,并且舉了三個例子,深度優先遍歷相當于先根遍歷如果我們要用代碼來實現的話,可以采用遞歸,也可以采用借助棧的方式,廣度遍歷類似于樹的層次遍歷,我們要借助隊列的非遞歸方式

?

總結

以上是生活随笔為你收集整理的图的定义存储和遍历(一级)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。