1. 程式人生 > 其它 >常見演算法思想——窮舉法

常見演算法思想——窮舉法

技術標籤:資料結構

常見演算法思想——窮舉演算法

簡單介紹

  在進行歸納推理時,如果逐個考察了某類事件的所有可能情況,因而得出一般結論,那麼這結論是可靠的,這種歸納方法叫做窮舉法。窮舉法是利用計算機運算速度快、精確度高的特點,對要解決問題的所有可能情況,一個不漏地進行檢驗,從中找出符合要求的答案,因此窮舉法是通過犧牲時間來換取答案的全面性。
  在數學和電腦科學理論中,一個集的窮舉是列出某些有窮序列集的所有成員的程式,或者是一種特定型別物件的計數。這兩種型別經常(但不總是)重疊。

詳細介紹

演算法思路

   採用窮舉演算法解題的基本思路:
(1)確定窮舉物件、窮舉範圍和判定條件;
(2)窮舉可能的解,驗證是否是問題的解。

演算法特點

  將問題的所有可能的答案一一列舉,然後根據條件判斷此答案是否合適,合適就保留,不合適就丟棄。
  窮舉演算法因為要列舉問題的所有可能的答案,所以它具備以下幾個特點:
1.得到的結果肯定是正確的。
2.可能做了很多的無用功,浪費了寶貴的時間,效率低下。
3.通常會涉及到求極值(如最大,最小,最重等)。
4.資料量大的話,可能會造成時間崩潰。

優點:
  由於窮舉法一般是現實生活中問題的“直譯”,因此比較直觀,易於理解;窮舉法建立在考察大量狀態、甚至是窮舉所有狀態的基礎上,所以演算法的正確性比較容易證明。

缺點:
  用窮舉法解題的最大的缺點是運算量比較大,解題效率不高,如果窮舉範圍太大(一般以不超過兩百萬次為限),在時間上就難以承受。

演算法優化

窮舉法的時間複雜度可以用狀態總數*考察單個狀態的耗時來表示,因此優化主要是:
1.減少狀態總數(即減少窮舉變數和窮舉變數的值域);
2.降低單個狀態的考察代價。

優化過程從幾個方面考慮。:
1.提取有效資訊;
2.減少重複計算;
3.將原問題化為更小的問題;
4.根據問題的性質進行截枝;
5.引進其他演算法。

例項演示

題目描述

例:有一個三位數的各位數字都不是0,且各位數字之和是6,這樣的三位數共有多少個。

題目分析

從首位開始,依據從小到大的順序依次來窮舉出每一位。

首位不能為0,最小為1,最大為4。
首位為1,有以下四種情況:114、123、132、141、
首位為2,有以下三種情況:213、222、231、
首位為3,有以下兩種情況:312、321、
首位為4,有以下一種情況:411、
則共有4+3+2+1=10種情況。

完整程式碼

#include<stdio.h>
#include <stdlib.h>

int print()
{
	int num=0;
	for(int a = 0; a <= 9; a++)
	{
		for(int b = 0; b <= 9; b++)
		{
			for (int c = 0; c <= 9; c++)
				if (a != 0 && b != 0 && c != 0 && a + b + c == 6)
				{
					printf("%d%d%d\t", a, b, c);
					num++;
				}
		}
	}
	printf("\n");
	printf("這樣的數字共有%d個。", num);
	return 0;
}

int main()
{
	int sum;
	printf("這樣的數字為:");
	sum = print();
	printf("\n");
	system("pause");
}

執行結果