社区
数据结构与算法
帖子详情
探讨一个排列的算法
veinstone
2004-06-07 09:06:21
如何用递归的方法列举一个列表的无重复排列?
注意,不是计算排列数,如:f(n) = f(n-1)*n,这个不要。
要的是:有{a,b,c}一个列表,列出它的无重复排列是{{a,b,c},{a,c,b},{b,a,c},{b,c,a},{c,a,b},{c,b,a}}。
注意要用递归的方法啊!!
...全文
349
44
打赏
收藏
探讨一个排列的算法
如何用递归的方法列举一个列表的无重复排列? 注意,不是计算排列数,如:f(n) = f(n-1)*n,这个不要。 要的是:有{a,b,c}一个列表,列出它的无重复排列是{{a,b,c},{a,c,b},{b,a,c},{b,c,a},{c,a,b},{c,b,a}}。 注意要用递归的方法啊!!
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
44 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
xiaonian_3654
2004-06-21
打赏
举报
回复
楼上,你怎么用拼音命名,怕怕
nainaixiong
2004-06-18
打赏
举报
回复
俺也写了一个:
#include "stdafx.h"
#define N 3
void pailie(int n);
int num[10];
int num_[10];
int main(int argc, char* argv[])
{
for(int i=0;i<N;i++)
{
num[i]=i;
num_[i]=-1;
}
pailie(0);
return 0;
}
void pailie(int n)
{
for(int i=0;i<N;i++)
{
bool f=false;
for(int j=0;j<n;j++)
{
if(num[i]==num_[j])
{
f=true;
break;
}
}
if(f)continue;
num_[n]=num[i];
pailie(n+1);
if(n==N-1)
{
for(int ii=0;ii<N;ii++)
{
printf("%d ",num_[ii]);
}
printf("\n",n);
}
}
}
fireofhell
2004-06-14
打赏
举报
回复
等一会,我编个不是递归的看看,运行时间嘛,是这种算法程序比较关键的。我当然知道程序慢在哪里了
xiaonian_3654
2004-06-14
打赏
举报
回复
我对这个速度没有兴趣,但是我能明确的告诉你慢在那里
fireofhell
2004-06-14
打赏
举报
回复
你自己看你的程序运行时间就知道了,几乎是mmmcd(超超) 的一倍,知道为什么吗?
不要迷信大师,你想想就应该知道,你的程序肯定要慢很多!
fireofhell
2004-06-14
打赏
举报
回复
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <iostream.h>
#include <time.h>
#include <assert.h>
using namespace std;
int used[30],p[30],n = 8;
void go(int k)
{
int i;
if(k==n)
{
//for(i=0;i<n;i++)printf("%c",p[i]+'a');
//printf("\n");
return;
}
for(i=0;i<n;i++)
{
if(used[i])continue;
used[i]=1;
p[k]=i;
go(k+1);
used[i]=0;
}
}
void main( void )
{
clock_t start1, finish1,start2,finish2;
double duration1,duration2;
char str[]="ABCDEFGH";
start1 = clock();
//assert(start);
for(int number1 = 0 ;number1 < 100 ;number1 ++)
while(next_permutation(str,str+8))
;
//cout<<str<<endl;
finish1 = clock();
//assert(finish);
start2 = clock();
for(int number2 = 0 ;number2 < 100 ;number2 ++)
go(0);
finish2 = clock();
duration1 = (double)(finish1 - start1) / CLOCKS_PER_SEC;
duration2 = (double)(finish2 - start2) / CLOCKS_PER_SEC;
cout<<duration1<<endl;
cout<<duration2<<endl;
cout<<duration2/duration1<<endl;
}
xiaonian_3654
2004-06-14
打赏
举报
回复
要是说到效率,我看未必吧,毕竟这是出自大师手笔的
虽然不能迷信大师,但是大师就是大师
至于什么不用递归,不过就是把递归转化为非递归而已
你要是有兴趣,可以改一改啊
fireofhell
2004-06-14
打赏
举报
回复
to xiaonian_3654(你猜猜):
你的程序嘛,调用了一个模板函数来做,老实说,效率真的比较低,我想看看有谁能给出一个自己写的算法,递归的好像就一楼的最好了,不用递归的暂时没有发现,期盼中……
fireofhell
2004-06-14
打赏
举报
回复
to CsdnPlayer(CSDN首席军师)(公孙智多星) :
你的程序效率比较低
CsdnPlayer
2004-06-14
打赏
举报
回复
呵呵,孤陋寡闻了。组合数学很有用么?
xiaonian_3654
2004-06-14
打赏
举报
回复
算法实际上是stl中的,任何一本组合数学上都讲的,我不敢贪天之功啊,
呵呵
fireofhell
2004-06-14
打赏
举报
回复
我刚写了一个,结果测试时发现漏掉了一类情况,晕!不过从执行的速度来看,少去了递归的大量调用函数,这样可以节省很多时间,系统不用反复的保存堆栈释放堆栈
CsdnPlayer
2004-06-13
打赏
举报
回复
to xiaonian_3654(你猜猜),
我觉得你的代码是另一种思虑,不是取字符来组成字符串,而是将已有字符串的字符进行换位,不错!
CsdnPlayer
2004-06-13
打赏
举报
回复
//C语言 递归版
//Windows2000+VC6 测试通过
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 3
char string[N] = {'A', 'B', 'C'};
char output[N];
bool setOne(int index);
bool isValid(int index, char target);
void main(void)
{
setOne(0);
getchar();
exit(0);
}
bool setOne(int index)
{
int count;
//int i=index;
for(count=0; count<N; count++) {
if(isValid(index, string[count]))
output[index] = string[count];
else
continue;
if((index+1)<N) {
setOne(index+1);
} else {
char temp[N+1];
temp[N] = '\0';
strncpy(temp , output, N);
puts(temp);
}
}
return true;
}
bool isValid(int index, char target)
{
int count;
for(count=0; count<index; count++) {
if(output[count] == target)
return false;
}
return true;
}
chenzhichao2008
2004-06-12
打赏
举报
回复
用队列一样可以做的
darkfirexl
2004-06-12
打赏
举报
回复
怎么用队列作
xiaonian_3654
2004-06-12
打赏
举报
回复
我的程序怎么没有关注?????????
darkfirexl
2004-06-11
打赏
举报
回复
to 懒鬼:我只是把我以前写的程序复制过来而已,当然会有点乱。
fireofhell
2004-06-11
打赏
举报
回复
看了这么多,还是看mmmcd(超超)的最顺眼,不过没有看到让人耳目一新的程序啊!
chenzhichao2008
2004-06-11
打赏
举报
回复
#include "iostream.h"
#include "stdlib.h"
#define N 3
int uses[N]={0},mark[N]={0};
int k=0;
void order(int a[],int i)
{
int tag;
int j=0;
uses[i]=1;
mark[k++]=a[i];
if(k==N)
{
for(j=0;j<N;j++)
cout<<mark[j];
cout<<endl;
}
for(j=0;j<N;j++)
{
if(uses[j]) continue;
order(a,j);
}
k--;
uses[i]=0;
}
void main()
{
int a[N];
int i;
for(i=0;i<N;i++)
cin>>a[i];
for(i=0;i<N;i++)
order(a,i);
system("pause");
}
加载更多回复(24)
《数据结构
算法
实现及解析(高一凡)源代码
《数据结构
算法
实现及解析(高一凡)源代码》是一部深入
探讨
数据结构与
算法
的著作,由高一凡编写,旨在帮助读者理解和实践数据结构的相关
算法
。这本书的源代码是针对严蔚敏和吴伟民编著的《数据结构(C语言版)》进行...
【
算法
】下
一个
排列
本文通过深入
探讨
“下
一个
排列
”
算法
,不仅揭示了C++在
算法
实现上的强大与灵活性,也展示了该
算法
在不同领域的广泛应用潜力。掌握此类
算法
不仅能够提升解决特定问题的能力,更能深化对数据结构和
算法
原理的理解。...
Java
排列
组合
算法
实现与应用
简介:
排列
组合是计算机科学中的重要
算法
概念,在Java开发中尤为重要。...本文提供基于递归和回溯法的组合和
排列
算法
实现,并讨论了它们在解决问题时的应用和优化。 1.
排列
与组合的定义和区别 ...
深入
探讨
回溯
算法
在
排列
、组合和子集问题中的应用
回溯
算法
是一种在组合优化问题中被广泛应用的
算法
。它是一种递归搜索的方法,通过尝试所有可能的选择来解决问题。在解决
排列
、组合和子集问题时,回溯
算法
展现出了其强大的优势。
如何实现
一个
不规则
排列
的图片布局
算法
昨天不知怎么的就开始想其中的
算法
了,现在我把思考的过程在这里贴出来分享一下,如果你有更好的
算法
欢迎
探讨
。 最终我做出的效果是这样的: 垂直滚动 水平滚动
算法
总体思路 先说...
数据结构与算法
33,027
社区成员
35,335
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章