常见算法思想——穷举算法

  • 简单介绍
  • 详细介绍
  • 算法思路
  • 算法特点
  • 算法优化
  • 实例演示
  • 题目描述
  • 题目分析
  • 完整代码


简单介绍

  在进行归纳推理时,如果逐个考察了某类事件的所有可能情况,因而得出一般结论,那么这结论是可靠的,这种归纳方法叫做穷举法。穷举法是利用计算机运算速度快、精确度高的特点,对要解决问题的所有可能情况,一个不漏地进行检验,从中找出符合要求的答案,因此穷举法是通过牺牲时间来换取答案的全面性。
  在数学和计算机科学理论中,一个集的穷举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数。这两种类型经常(但不总是)重叠。

详细介绍

算法思路

   采用穷举算法解题的基本思路:
(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");
	return 0;
}

python中穷举算法 算法穷举法_算法