好的,第一篇技術(shù)博客晃跺。我們開始吧锁摔。
刷過(guò)leetcode的朋友看見這張應(yīng)該會(huì)會(huì)心一笑,BFS哼审,DFS這類詞爭(zhēng)先恐后往外跳谐腰。但是呢,太高級(jí)了涩盾,我的朋友們十气。讓我們先用一種最文藝(傻氣)的辦法,來(lái)解決這個(gè)問(wèn)題春霍。
我們的目標(biāo)是:找到start-end之間的最短路徑砸西,如圖所示
來(lái)吧,Grassfire 算法。小時(shí)候芹枷,大家都背過(guò)一首詩(shī):離離原上草,一歲一枯榮衅疙。 野火燒不盡,春風(fēng)吹又生。說(shuō)的就是這種算法鸳慈。這首詩(shī)告訴我們饱溢,草,都是從旁邊的草開始燃燒蔓延的走芋!grassfire-燒草绩郎,就這么簡(jiǎn)單又有力。
首先把終點(diǎn)的距離設(shè)定為0翁逞,然后設(shè)定距離終點(diǎn)最近的格子距離為1肋杖。如圖所示
然后,距離1最近的格子是2挖函,距離2最近的格子是3状植,以此類推
好了,這時(shí)候每一個(gè)數(shù)字都代表這該單元格到終點(diǎn)的距離怨喘。我們把數(shù)字連起來(lái)津畸,就形成了最短路徑,注意了哲思,這個(gè)路徑很可能不是唯一解洼畅。
整個(gè)過(guò)程用偽代碼表示就是
但是有些時(shí)候,我們會(huì)遇見走不通的情況棚赔,我們寫代碼的時(shí)候就要考慮好這個(gè)問(wèn)題
實(shí)現(xiàn)過(guò)程:
1.如果start-end之間有路帝簇,找到最短路徑
2.如果start-dend之間沒(méi)有路,跳出循環(huán)靠益,報(bào)錯(cuò)
下面談?wù)勥@個(gè)算法計(jì)算復(fù)雜度的問(wèn)題丧肴,這個(gè)算法是一種遍歷搜索,火會(huì)席卷每一個(gè)角落胧后。
其中崔步,V是圖中格子的數(shù)量咨跌。我們假設(shè)我們有100個(gè)格子,要訪問(wèn)的格子數(shù)
2維棋盤:100 X100 = 1000
3維棋盤: 100X100X100 = 1000000
6維棋盤: 100X100X100X100X100X100 =1000000000000
1000000000000啊朋友們,什么概念春感,就差不多和天上的星星一樣多了哇乘凸!grassfire的計(jì)算量隨著格子的變多或者維度的上升而變得很大屁商。
好啦榨崩,總的來(lái)說(shuō)這是一個(gè)很簡(jiǎn)單的算法,一定能找到全局最優(yōu)解竖伯。宛若春風(fēng)吹過(guò)每一個(gè)角落存哲,吹到我們每一個(gè)人的心中