-
枚舉法
鎖定
在進行歸納推理時,如果逐個考察了某類事件的所有可能情況,因而得出一般結論,那麼這結論是可靠的,這種歸納方法叫做枚舉法.
- 中文名
- 枚舉法
- 外文名
- Enumeration method
- 別 名
- 窮舉法、列舉法、蠻力法
- 定 義
- 逐個考察了某類事件的所有可能
枚舉法簡介
在數學和計算機科學理論中,一個集的枚舉是列出某些有窮序列集的所有成員的程序,或者是一種特定類型對象的計數。這兩種類型經常(但不總是)重疊。
枚舉法特點
將問題的所有可能的答案一一列舉,然後根據條件判斷此答案是否合適,合適就保留,不合適就丟棄。例如:找出1到100之間的素數,需要將1到100之間的所有整數進行判斷。
枚舉算法因為要列舉問題的所有可能的答案,所以它具備以下幾個特點:
1、得到的結果肯定是正確的;
2、可能做了很多的無用功,浪費了寶貴的時間,效率低下;
3、通常會涉及到求極值(如最大,最小,最重等);
4、數據量大的話,可能會造成時間崩潰。
枚舉法基本思路
(1)確定枚舉對象、枚舉範圍和判定條件;
(2)枚舉可能的解,驗證是否是問題的解。
枚舉法結構
首先考慮一個問題:將1到100之間的所有整數轉換為二進制數表示。
枚舉法算法一
for i:=1 to 100 do begin
end;
枚舉法算法二
二進制加法,此時需要數組來幫忙。
program p;
var a:array[1..100] of integer; {用於保存轉換後的二進制結果}
i,j,k:integer;
begin
for i:=1 to 100 do begin
k:=100;
while a[k]=1 do dec(k); {找高位第一個為0的位置}
a[k]:=1; {找到了立刻賦值為1}
for j:=k+1 to 100 do a[j]:=0; {它後面的低位全部賦值為0}
k:=1;
while a[k]=0 do inc(k); {從最高位開始找不為0的位置}
write('(',i,')2=');
for j:=k to 100 do write(a[j]); {輸出轉換以後的結果}
end;
end.
枚舉法,是指從可能的集合中一一枚舉各個元素,用題目給定的約束條件判定哪些是無用的,哪些是有用的。能使命題成立者,即為問題的解。
枚舉法優缺點
枚舉法優點
枚舉法缺點
運算量過大,當問題的規模變大的時候,循環的階數越大,執行速度越慢。
[3]
枚舉法枚舉法的優化
枚舉法的時間複雜度可以用狀態總數*考察單個狀態的耗時來表示,因此優化主要是:
[4]
⑴減少狀態總數(即減少枚舉變量和枚舉變量的值域);
⑵降低單個狀態的考察代價。
優化過程從幾個方面考慮。具體講
⑸引進其他算法。