學習資料結構與演算法的筆記(二)

2021-10-18 10:32:51 字數 3829 閱讀 1027

圖的結構

//這是乙個有向無向通用的圖結構,相當於加強版臨接表法

public

class

graph

}public

class

node

}public

class

edge

}/**

* 將題中給的千奇百怪的圖結構,轉化成咱們熟悉的圖結構,然後在套用圖演算法

* @param matrix 【n*3的矩陣,分別為:weight、from、to】

* @return

*/public

static graph creategraph

(int

matrix)if(

!graph.nodes.

containskey

(to)

) node fromnode = graph.nodes.

get(from)

; node tonode = graph.nodes.

get(to)

; edge newedge =

newedge

(weight, fromnode, tonode)

; fromnode.nexts.

add(tonode)

;//起點連到終點上

fromnode.out++

;//出度++

tonode.in++

;//入度++

fromnode.edges.

add(newedge)

;//點的邊集++

graph.edges.

add(newedge)

;//圖的邊集++

}return graph;

}

圖的遍歷
/**

* 圖的寬度優先遍歷(類似於樹的層次遍歷)【利用佇列】

* @param node

*/public

static

void

bfs(node node)}}

}/**

* 圖的深度優先遍歷【利用棧】

* @param node

*/public

static

void

dfs(node node)}}

}

拓撲排序
/**

* 有向無環圖拓撲排序

* @param graph

* @return

*/public

static list

sortedtopology

(graph graph)

} list

result =

newarraylist

<

>()

;while

(!zeroinqueue.

isempty()

)}}return result;

}

最小生成樹演算法
這種寫法功能沒問題,但是沒有並查集快!!!由於後面基礎提公升時在仔細研究並查集,這裡就先簡單實現乙個具有該功能的集合類,等學完並查集再回來!!!

public

static

class

mysets

}/**

* 兩個節點是否在同乙個集合裡

* @param from

* @param to

* @return

*/public

boolean

issameset

(node from, node to)

return

false;}

/** * 合併兩個節點的集合

* @param from

* @param to

*/public

void

union

(node from, node to)}}

public

static

class

edgecomparator

implements

comparator

}/** * 克魯斯卡爾求最小生成樹(邊)

* @param graph

* @return

*/public

static set

kruskalmst

(graph graph)

mysets mysets =

newmysets

(nodelist)

; priorityqueue

priorityqueue =

newpriorityqueue

(new

edgecomparator()

);//小根堆

for(edge edge : graph.edges)

setresult =

newhashset

<

>()

;while

(!priorityqueue.

isempty()

)}return result;

}

/**

* 普利姆演算法求最小生成樹(點)

* @param graph

* @return

*/public

static set

primmst

(graph graph)

while

(!priorityqueue.

isempty()

)}}}

}return result;

}public

static

class

edgecomparator

implements

comparator

}

迪傑斯特拉演算法
因為存在堆上的元素被突然改了,得全域性掃瞄得方式進行調整,所以效率不高!!!所以後面還會再仔細研究自己寫堆優化,那時候再回來!!

/**

* 從head出發得單源最短路徑演算法

* @param head

* @return

*/public

static hashmap

dijkstra

(node head)

else

} selectednodes.

add(minnode)

; minnode =

getmindistanceandunselectednode

(distancemap, selectednodes);}

return distancemap;

}/**

* 從distancemap中選乙個距離最小的(而且這個不能出現在selectednodes中)

* @param distancemap

* @param touchednodes

* @return

*/public

static node getmindistanceandunselectednode

(hashmap

distancemap, hashset

touchednodes)

}return minnode;

}

《資料結構》學習筆記二 演算法(二)

繼續上節的學習,我們在這一篇文章裡把 演算法 這一章內容學習完。本節解決問題 演算法的好壞到底是如何評估的?知識點 1.函式的漸進增長 2.演算法的時間複雜度 3.常見的時間複雜度 4.演算法的空間複雜度 1.函式的漸進增長 這一知識點與數學相關,不過沒關係都是很容易理解的內容。問題 假如兩個演算法...

資料結構學習筆記 2 資料結構與演算法

四.演算法設計的要求 五.演算法效率的度量方法 六.函式的漸近增長 七.演算法時間複雜度 八.常見的時間複雜度 九.最壞情況與平均情況 十.演算法空間複雜度 資料結構是底層,演算法高層。資料結構為演算法提供服務。演算法圍繞資料結構操作。演算法是解決特定問題求解步驟的描述,在計算機中表現為指令的有限序...

(二)學習資料結構與演算法 棧

棧是資料結構中最基本的一種結構,對於資料來說,很多時候都是對資料的增 刪 查 改 1.棧在生活中的常見例子 一摞書 堆盤子 2.棧的特點 先進後出 fist in last out,filo 3.棧的實現 1 建立棧 function stack 2 棧中宣告的方法 增 push element s...