常见算法思想——穷举算法
- 简单介绍
- 详细介绍
- 算法思路
- 算法特点
- 算法优化
- 实例演示
- 题目描述
- 题目分析
- 完整代码
简单介绍
在进行归纳推理时,如果逐个考察了某类事件的所有可能情况,因而得出一般结论,那么这结论是可靠的,这种归纳方法叫做穷举法。穷举法是利用计算机运算速度快、精确度高的特点,对要解决问题的所有可能情况,一个不漏地进行检验,从中找出符合要求的答案,因此穷举法是通过牺牲时间来换取答案的全面性。
在数学和计算机科学理论中,一个集的穷举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数。这两种类型经常(但不总是)重叠。
详细介绍
算法思路
采用穷举算法解题的基本思路:
(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;
}