圖
圖的結構
//這是乙個有向無向通用的圖結構,相當於加強版臨接表法
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...