字符全排列的另一种实现
2010-10-18 16:39
211 查看
朋友让我帮忙写一个密钥空间的穷举,我想到了全排列。
到网上查了一下,网上的全排列算法,大部分是基于交换原则,由递归算法来给出答案。
我这里给出另一个算法,是基于乘法原理和数据结构来给出结果。也是采用递归算法。
似乎该方法更容易理解,且很形象。
乘法原理是说,选第一个数有n种可能, 第二个数n-1种可能,第三个数n-2个可能... 第n数1种可能。
则总的可能数为: n * (n-1)(n-2)...*1 = n! 种可能。
说实话,该程序是在递归函数中,隐含的使用了数据交换过程。典型的穷举搜索算法。
代码如下:
到网上查了一下,网上的全排列算法,大部分是基于交换原则,由递归算法来给出答案。
我这里给出另一个算法,是基于乘法原理和数据结构来给出结果。也是采用递归算法。
似乎该方法更容易理解,且很形象。
乘法原理是说,选第一个数有n种可能, 第二个数n-1种可能,第三个数n-2个可能... 第n数1种可能。
则总的可能数为: n * (n-1)(n-2)...*1 = n! 种可能。
说实话,该程序是在递归函数中,隐含的使用了数据交换过程。典型的穷举搜索算法。
代码如下:
#include <stdio.h> #include <stdlib.h> #include <conio.h> #include <string.h> typedef struct{ char c; char outc; int flag; }List; void initStruct(char *pStr, List *pList); void permutation(List *pList, int depth); char *pStr = "12345"; int main(int argc, char *argv[]) { int len = strlen(pStr); List* pList=(List *)malloc(len *sizeof(List) ); initStruct(pStr,pList); //初始化数据结构 permutation(pList,0); _getch(); return 0; } void initStruct(char *pStr, List *pList) { for(unsigned int i=0; i<strlen(pStr); i++) { pList[i].c=pStr[i]; //初始化结构 pList[i].flag = 1; //设定元素均为可选状态 } } void permutation(List *pList, int depth) { int i; int len =strlen(pStr); // 当递归处理到最后一个元素,表示已选择完毕,输出结果 if(depth==len) { for(i=0; i< len; i++) { printf("%c ",pList[i].outc); } printf("/n"); return; } //遍历所有可被选择的元素 for(i=0; i<len; i++) { //当元素还没有被选择时,选定该元素 if(pList[i].flag==1) { pList[i].flag=0; //设定给元素已经选择标志 pList[depth].outc=pList[i].c; //把该元素送到输出数组中 permutation(pList,depth+1); //递归到下一个处理元素 pList[i].flag=1; //恢复元素为初始状态 } } }
相关文章推荐
- 全排列的另一种实现方法:旋转法
- C语言实现全排列(部分算法参考网友,可实现重复字符的组合)
- N个字符全排列的非递归实现
- 采用递归算法实现任意字符的全排列问题
- 递归实现n个不同字符的所有全排列
- 实现全排列的另一种方法(续)
- N个字符全排列的递归实现
- js实现字符全排列算法的简单方法
- 用条件编译实现,输入一行字符,可以用两种方式输出,一种为原文输出;另一种将字母转变成后继字母,即按密码输出
- 8.n个字符的全排列(递归实现)
- 递归实现的字符全排列
- 基于ARM9开发板的按键字符设备驱动实现
- iOS手机号正则表达式并实现344格式 (正则的另一种实现方式)
- 全排列实现
- C#--关于事件的定义及注册,如何实现在一个文本框中只输入数字或者只能输入0至9十种数字、a至z或A至Z五十二种字符。
- STL实现全排列 next_permutation
- jquery全选/全不选/反选另一种实现方法(配合原生js)
- 关于递归实现字符串反转,没想到字符随机写入操作,不new就不行?
- 关于一道J笔试或者机试题的Java实现:从键盘输入一串字符,翻转后输出(要求不使用string相关类即对象)
- 实现在一个字符串中删除中文字符及空格的实现代码