穷举法

一、穷举法 的基本概念

穷举法也称为枚举法(Exhaustive Attack method),,或称暴力破解法,又称为强力法(Brute-force method). 完全试凑法(complete trial-and –error method)它的基本思想是不重复、不遗漏地穷举穷举所有可能情况,或把信息条理化、系统化、或进行分类,寻找规律,引出信息,以便从中寻找满足条件的结果。

穷举法常用于解决“是否存在”、“有多少种情况”等类型的问题。对于一些数学问题、逻辑推理问题,穷举法看来也是一种“笨”方法,但它恰好利用了计算机高速运算的特点,可以避免复杂的逻辑推理过程,使问题简单化。

 

穷举法 ”一词在wiki百科 中的定义如下:

 

穷举法 ,或称为暴力破解法 ,是一种针对于密码的破译 方法,即将密码进行逐个推算直到找出真正的密码为止。例如一个已知是四位并且全部由数字 组成的密码,其可能共有10000种组合,因此最多尝试10000次就能找到正确的密码。理论上利用这种方法可以破解任何一种密码,问题只在于如何缩短试误时间。有些人运用计算机 来增加效率,有些人辅以字典来缩小密码组合的范围。

 

字符类型

字符类型一般可以分为一下5种

  • 数字型0、1、2、...9等(10个)
  • 大写字母A、B、C、...Z等(26个)
  • 小写字母a、b、c、...z等(26个)
  • 特殊字符~、$、#、@、&、*等(33个)一般较少用
  • 用户自定义字符。

如果一个多位数并且有可能包含以上所有字符的密码的组合方法一定多的惊人,相对来讲破译 的时间也会长的没法接受,有时可能会长达数年之久。

 

字典

当然如果破译一个有8位而且有可能拥有大小写数字、字母、以及符号的密码用普通的家用电脑 可能会用掉几个月甚至更多的时间去计算,其组合方法可能有几千万亿重种组合。这样长的时间显然是不能接受的。其解决办法就是运用字典,所谓“字典”就是给密码锁定某个范围,比如英文 单词以及生日的数字组合等,所有的英文单词不过10万个左右这样可以大大缩小密码范围,很大程度上缩短了破译时间。

 

另外,穷举法 百度百科 中的定义:点击这里

 

 

 

二, 简单实例

例题一:来自《数据结构与算法教材》第二版 P245

 

设计一个算法求解4排列问题,即输出4个数字1、2、3、4的所有排列。

 

解:本题实际上是要求给出所有的4位数t1,t2,t3,t4(t1,t2,t3,t4均不相同,且只能取1~4的值)。采用穷举法求解,对应算法如下:

 

#include<iostream> using namespace std; void fun() { int t1,t2,t3,t4; for(t1=1;t1<=4;t1++) for(t2=1;t2<=4;t2++) for(t3=1;t3<=4;t3++) for(t4=1;t4<=4;t4++) if(t1==t2||t1==t3||t1==t4||t2==t3||t2==t4||t3==t4) continue; else cout<<t1<<t2<<t3<<t4<<endl; } int main() { fun(); return 0; }

 

 

三,更多 实例(持续更新 )

你可能感兴趣的:(穷举法)