社区
数据结构与算法
帖子详情
探讨一个排列的算法
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}}。
注意要用递归的方法啊!!
...全文
343
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写文章
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++中文分词源码,分词的方法
西方语言在语句(或从句)内词汇之间存在分割符(空格),而汉语的词汇在语句中是连续
排列
的。因此,汉语词汇的切分(分词)在中文信息处理的许多应用领域,如机器翻译、文献检索、文献分类、文献过滤、以及词频统计等,是非常重要的第一步。 自动分词是基于字符串匹配的原理进行的。迄今为止,已经有许多文献对各种分词方法进行
探讨
,其着重点或为分词的速度方面,或为分词的精度方面以及分词的规范。本文主要
探讨
分词的速度问题,通过实验对比和理论分析,说明我们所提出的
算法
是有效的。 目前人们所提出的分词方法,在考虑效率问题时,通常在词典的组织方面进行某种调整,以适应相应的
算法
,如最大匹配法、最小匹配法、逐词遍历法、以及最佳匹配法等。这些方法中,或将词典按词条长度排序或按词频排序,其目的在于协调
算法
与数据结构,使之效率最高。客观地说,它们都在一定程度上提高了分词的效率。 本文所介绍的是基于词典的最大向前匹配方法。而在数据结构方面,我们则是将词典组织成自动机形式。
深入
探讨
回溯
算法
在
排列
、组合和子集问题中的应用
回溯
算法
是一种在组合优化问题中被广泛应用的
算法
。它是一种递归搜索的方法,通过尝试所有可能的选择来解决问题。在解决
排列
、组合和子集问题时,回溯
算法
展现出了其强大的优势。
深入
探讨
:如何实现
排列
组合
一、引言当你点开了这篇博客,希望你能站在跟我一起
探讨
的角度上来思考这个问题,那么也许你能获得更多的启示 ^_^。最近在做 LeetCode 的时候,有一道题让我想到了另
一个
问题: 如何编程实现
排列
组合
算法
? 也就是说,输入 M 个元素的整型数组,输出取 N 个数的
排列
组合结果,并将结果打印出来。 这个问题乍一听,好像并不复杂,但是仔细一想,又好像无从下手。毕竟是 M 中取 N 个元素,如果
如何实现
一个
不规则
排列
的图片布局
算法
一直在500px上看照片,发照片。以前看它的首页图片展示就只是觉得好看,洋气,也没想过自己在iOS上实现一下。昨天不知怎么的就开始想其中的
算法
了,现在我把思考的过程在这里贴出来分享一下,如果你有更好的
算法
欢迎
探讨
。 最终我做出的效果是这样的: 垂直滚动 水平滚动
算法
总体思路 先说一下总体上的思路。既然图片的大小、位置各不一样,我们
HeapPermute
算法
正确性和时间效率的分析
算法
课的习题要求分析HeapPermute
算法
的正确性,实在是费劲,目前已花费鄙人数小时之久。参阅了之前11级和12级学长/学姐的博客,个人认为证明是错误的,所以自己整理了
一个
版本(分歧点列在了
算法
正确性分析的后面)。因为
算法
正确性的证明实在太麻烦,所以部分步骤有省略,望海涵。 0. 习题:分析以下生成
排列
算法
的正确性和时间效率: HeapPermute(n) //实现生成
排列
的 Heap ...
数据结构与算法
33,010
社区成员
35,327
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章