讀書筆記 漫畫演算法 9 A 尋路演算法

2021-09-29 13:09:42 字數 2844 閱讀 9915

a* 尋路演算法的講解,這裡有介紹比較清晰的文章:

首先引入兩個集合,乙個公式:

演算法執行的大致步驟如下:

下面是a*演算法的完整實現,並帶有測試用例:

/**

* a*演算法(啟發式搜尋):

* 首先引入兩個集合,乙個公式:

* openlist:可到達的格仔

* closelist:已到達的格仔

* f = g + h

* * 每乙個格仔都有三個屬性值:f,g,h

* g:從起點走到當前格仔的成本, **已經花費了多少步**

* h:不考慮障礙的情況下,從當前格仔走到目標格仔的距離,**離目標還有多遠**

* f:g和h的綜合評估,也就是從起點到達當前格仔,**再從當前格仔到達目標格仔的總步數**

* */

public

class

astarpathsearching,,

,,};

private

static

class

grid

void

initgrid

(grid parent, grid end)

}/**

* 尋路演算法主方法

** @param start

* @param end

* @return

*/public

static grid search

(grid start, grid end)

}// 如果openlist中存在終點,那麼直接返回

grid endgrid = null;if(

(endgrid =

containgrid

(openlist, end.x, end.y)

)!= null)

}return null;

}/**

* 在openlist中尋找f值最小的grid

** @param openlist

* @return

*/private

static grid findmingrid

(list

openlist)

}return mingrid;

}private

static list

findneighbors

(grid curgrid, list

openlist, list

closelist)if(

isvalidgrid

(curgrid.x+

1, curgrid.y, openlist, closelist))if

(isvalidgrid

(curgrid.x, curgrid.y-

1, openlist, closelist))if

(isvalidgrid

(curgrid.x-

1, curgrid.y, openlist, closelist)

)return gridlist;

}private

static

boolean

isvalidgrid

(int x,

int y, list

openlist, list

closelist)

// 圍牆

if(maze[x]

[y]==1)

if(containgrid

(openlist, x, y)

!= null ||

containgrid

(closelist, x, y)

!= null)

return

true;}

/** * 判斷gridlist中是否存在 grid(x, y),

* 如果存在則直接返回

* 否則返回 null

* @param gridlist

* @param x

* @param y

* @return

*/private

static grid containgrid

(list

gridlist,

int x,

int y)

}return null;

}public

static

void

main

(string[

] args)

for(

int i =

0; i < maze.length ; i++

)elseif(

containgrid

(path, i, j)

!= null)

else

} system.out.

println()

;}}}

實際上,這個演算法有個地方可以優化;我們看到findmingrid函式,它是找到集合中f值最小的方格,我們每次呼叫它都得遍歷整個集合,演算法是線性增加的,並且隨著路徑的擴大,這個集合的大小不斷擴大,演算法效率會很低,搜尋時間很令人擔憂

既然我們每次都取f值最小的元素,那麼,可以想到,使用乙個最小堆來儲存這些元素。這樣,演算法時間複雜度呈2的指數級下降;

讀書筆記 漫畫演算法 8 LRU快取的實現

lru,least recently used,最近最少使用 一種資源管理演算法 按照字面的意思,也可以理解為快取淘汰演算法 最近最少訪問的資源,我們就從快取中淘汰出去,以免長時間占用記憶體且不經常訪問 首先,我們定義基礎的資料結構 public class lrucache 用於高效訪問的hash...

A star 筆記 A星尋路演算法基礎

基礎應用 基礎應用一般為三部分 建立地圖 或者說網格 例項化出 n m的網格,一般使用二維陣列node nodes 每個格仔都是乙個節點node例項,每個節點都有自身基礎資訊和下乙個節點的引用資訊,可以先對不能通過的地方進行標記,也可以在尋路過程中動態標記。位置對映 節點座標通常只會使用整數索引,如...

排序演算法讀書筆記

按關鍵字相等的記錄順序是否變化,分為穩定和不穩定 按儲存器不同分為內部排序和外部排序,外部是指數量很大,記憶體一次不能容納全部記錄,要訪問外存 按複雜度分簡單排序 普通排序和基數排序 按依據的原則不同分為插入排序 交換排序 選擇排序 歸併排序和計數排序。排序通常需要兩種操作 比較 移動記錄。1 平均...