思想:使用貪心演算法進行求解時,也是將乙個大問題分為若干小問題進行求解,在求解時,每一步都使用當前問題
的最優解,從而希望最終的結果也是最優的. 貪心演算法得到的結果不一定是最優的結果,但都是與最優解接近的
結果求解集合覆蓋問題
問題描述:有若干個電台,每個電台覆蓋若干個地區,找出覆蓋所有地區的最少電台組合,如果使用窮舉法,在電台
數量大時,組合的複雜度就是指數級,效率有限
**實現
//貪心演算法求解集合覆蓋
public
class
greedy
settemp =
newhashset
<
>()
;//存放當前電台覆蓋未覆蓋的地區
string maxkey;
//每次遍歷覆蓋最多未覆蓋地區電台的key值
int maxsetsize;
//存放最大key值電台覆蓋未覆蓋地區的數量
while
(allareas.
size()
>0)
}//將已覆蓋地區從全部地區中刪除並記錄已選擇電台加入
allareas.
removeall
(radios.
get(maxkey));
results.
add(maxkey);}
//檢視此次電台的選擇
system.out.
println
(results);}
}
基於貪心演算法解決最小生成樹問題
修路問題:
問題描述:有若干個村莊,已知任意兩條村莊直接的路的長度,相同距離修路**一定,求如何修路可使**最少
並且所有的村莊都能互相到達
思路:將若干村莊可以看出一張網圖,問題的解就是求該圖的最小生成樹,利用prim演算法從乙個頂點開始先找出該
點所有與之相連的頂點之間的邊的最小權值的點將兩點相連,再找與該兩點相連的點的最小權值邊再將此點與之
相連,迴圈此操作直到將所以的點都連上問題即可解答
**實現
** 圖類
//prim圖
public
class
primgraph}*
* 最小生成樹類
//圖的最小生成樹
public
class
mintree
//prim演算法求最小生成樹 引數為原始圖資訊和開始節點
public
void
prim
(primgraph graph,
int startindex)}}
}}system.out.
println
("連線頂點"
+ graph.data[row]
+"和頂點"
+ graph.data[column]
+" 權值為"
+ minvalue)
; isvisited[column]=1
;//找到之後將該點標誌為以訪問
minvalue =
100;}}
}** 測試類
public
class
primtest
;int vertexes = data.length;
int[
] weight =
newint
,,,,,,
};mintree mintree =
newmintree()
; primgraph graph =
newprimgraph
(vertexes)
; mintree.
mintree
(graph, data, weight)
; mintree.
prim
(graph,0)
;}}
基於貪心演算法解決最小生成樹問題
與prim演算法可以解決同樣的問題,prim演算法是基於頂點,每次選出最優的一點的邊,kruskal是基於邊,每次選出
所有邊的最優邊,基本思路是先將所有邊依次從小到大排序進選擇,把所有頂點看成乙個森林,每次遍歷檢視是否
符合將邊新增入森林的條件(就是判斷是否與已知最小生成樹內的邊形成迴路)
,迴圈此操作直到將所以頂點連起
來形成一棵樹,這棵樹便是該圖的最小生成樹
判斷迴路的思路是判斷將要新增的邊的兩頂點在已知最小生成樹中是否具有相同的頂點
**實現
** 邊的資訊
//邊的資訊,記錄邊的兩個頂點和邊的權值
public
class
edgeinfo
@override
public string tostring()
}** kruskal類
//kruskal實現
public
class
kruskal
;int
commons =
newint
,,,,,,
};kruskal mykruskal =
newkruskal
(vertex, commons)
; mykruskal.
kruskal()
;}public
kruskal
(char
vertex,
int[
] commons)}}
}//對邊進行排序
public
void
sort
(edgeinfo[
] edgeinfos)}}
}//獲取指定頂點下標
public
intgetvertexindex
(char info)
}return-1
;}//獲取圖中邊的陣列
public edgeinfo[
]getedgeinfos()
}}return e;
}//獲取頂點在當前最小生成樹類的終點下標
// ends為當前最小生成樹的所有頂點終點下標,i為需要查詢的頂點下標
public
intgetend
(int
ends,
int i)
return i;
}//求最小生成樹
public
void
kruskal()
} system.out.
println
("結果為 "
+ arrays.
tostring
(res));
}}
資料結構演算法爬坑日記一
線性結構 最常用的資料結構,特點是資料元素之間存在一對一的線性關係 分倆種儲存結構 1.順序儲存結構 又稱為順序表,儲存元素是連續的 2.鏈式儲存結構 又稱為鍊錶,儲存元素不一定是連續的,元素節點中存放資料元素以及相鄰元素的位址結構 常見線性資料結構 陣列 佇列 鍊錶 棧 非線性結構 常見二維陣列 ...
資料結構演算法爬坑日記六
回溯法 也叫向前試探法,試著尋找正確的求解,當探索到某一步不符合規則時,便回退到上一步進行重新選擇,直到獲取預期的解法 問題描述 在8 8的西洋棋棋盤上,放置八個皇后且八個皇后不能互相攻擊 思路 先將第乙個放在第一行第一列,然後將第二個放在第二行第一列,檢查是否滿足規則,如果滿足則進入第三個的放 置...
資料結構演算法爬坑日記八
思想 通過一次排序將一組資料分為兩部分,一部分全部比另一部分小,然後對兩部分分別再進行快排,迴圈此操作,直到不能再分割,便得到乙個有序序列 實現 快速排序 public class quicksort sort arr,0,arr.length 1 system.out.println arrays...