| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3350 人关注过本帖, 2 人收藏
标题:一个烦人的算法题。。。高手请进!!!
只看楼主 加入收藏
草狼
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:577
专家分:1040
注 册:2010-4-6
收藏
得分:1 
回复 13楼 beyondyf
如果有重复数, 该如何去重呢
2012-05-31 12:28
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
排列不考虑重复数。提交给函数的数据要在提交前自行判断,函数也不应该负责去重的工作。

实际应用中如果有这样的数据校验要求,我建议单独写校验模块。这样可以提高效率(免得每次调用一个功能都校验数据)。

重剑无锋,大巧不工
2012-05-31 13:09
草狼
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:577
专家分:1040
注 册:2010-4-6
收藏
得分:0 
以下是引用beyondyf在2012-5-31 13:09:45的发言:

排列不考虑重复数。提交给函数的数据要在提交前自行判断,函数也不应该负责去重的工作。

实际应用中如果有这样的数据校验要求,我建议单独写校验模块。这样可以提高效率(免得每次调用一个功能都校验数据)。


我觉得是你的算法如果有重复数, 求得的答案就是错的了
貌似哪还不够完美
如 1 1 2 你的那个求排列貌似永远得不到2 1 1
2012-05-31 16:15
czz5242199
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:660
专家分:2400
注 册:2011-10-26
收藏
得分:0 
回复 23楼 草狼
一般不会有重复的啊,如果有的话可以对下标进行计算
2012-05-31 16:26
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
回复 23楼 草狼
你的想法很有意思。一般我们讲排列都是针对不同的元素。

部分(或全部)元素相同?从没这么想过,不过也不是不可以。

以 1 1 2 为例,那它的排列有如下的3种。

1 1 2

1 2 1

2 1 1

同意这一点的话,只需要将第一个循环中的条件
s[i] < s[i - 1]
改成
s[i] <= s[i - 1]
即可。我就不编译了,你不妨试试

重剑无锋,大巧不工
2012-05-31 16:49
草狼
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:577
专家分:1040
注 册:2010-4-6
收藏
得分:0 
以下是引用beyondyf在2012-5-31 16:49:17的发言:

你的想法很有意思。一般我们讲排列都是针对不同的元素。

部分(或全部)元素相同?从没这么想过,不过也不是不可以。

以 1 1 2 为例,那它的排列有如下的3种。

1 1 2

1 2 1

2 1 1

同意这一点的话,只需要将第一个循环中的条件s < s1]改成s <= s1]即可。我就不编译了,你不妨试试

如果你觉得这么一改就行, 那就行吧
2012-05-31 18:31
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
回复 26楼 草狼
呵呵,还是我亲自验证一下吧。刚刚试了一下。1 1 2没有问题。

再试一下 1 1 2 2 3 这组数据。

下面是测试用的代码
程序代码:
#include<stdio.h>

void next_permutation(int * s, int len)
{
    int i, j, k, t;
    for(i = len - 1; i && s[i] <= s[i - 1]; i--);
    for(j = i, k = len - 1; j < k; j++, k--){ t = s[j]; s[j] = s[k]; s[k] = t;}
    if(!i) return;
    for(j = i--, k = len - 1; j < k; s[t] > s[i] ? k = t : (j = t + 1)) t = (j + k) >> 1;
    t = s[i]; s[i] = s[k]; s[k] = t;
}

int main()
{
    int s[5] = {1, 1, 2, 2, 3}, len = 5, i, j;
    for(i = 1; i <= 40; i++, puts(""))
    {
        printf("%2d : ", i);
        for(j = 0; j < len; printf(" %d", s[j++]));
        next_permutation(s, len);
    }
    return 0;
}
下面是以上代码的执行结果
程序代码:
 1 :  1 1 2 2 3

 2 :  1 1 2 3 2

 3 :  1 1 3 2 2

 4 :  1 2 1 2 3

 5 :  1 2 1 3 2

 6 :  1 2 2 1 3

 7 :  1 2 2 3 1

 8 :  1 2 3 1 2

 9 :  1 2 3 2 1
10 :  1 3 1 2 2
11 :  1 3 2 1 2
12 :  1 3 2 2 1
13 :  2 1 1 2 3
14 :  2 1 1 3 2
15 :  2 1 2 1 3
16 :  2 1 2 3 1
17 :  2 1 3 1 2
18 :  2 1 3 2 1
19 :  2 2 1 1 3
20 :  2 2 1 3 1
21 :  2 2 3 1 1
22 :  2 3 1 1 2
23 :  2 3 1 2 1
24 :  2 3 2 1 1
25 :  3 1 1 2 2
26 :  3 1 2 1 2
27 :  3 1 2 2 1
28 :  3 2 1 1 2
29 :  3 2 1 2 1
30 :  3 2 2 1 1
31 :  1 1 2 2 3
32 :  1 1 2 3 2
33 :  1 1 3 2 2
34 :  1 2 1 2 3
35 :  1 2 1 3 2
36 :  1 2 2 1 3
37 :  1 2 2 3 1
38 :  1 2 3 1 2
39 :  1 2 3 2 1
40 :  1 3 1 2 2

可以看到总组数是30,这与理论计算结果相符。之后也顺利地重新开始循环。算法没问题。

重剑无锋,大巧不工
2012-05-31 19:25
草狼
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:577
专家分:1040
注 册:2010-4-6
收藏
得分:0 
回复 27楼 beyondyf
我想说的就是这个啊  一那个全排列有重复的啊
如1 1 3 2 2 这样的出现了2次啊
所以我说你的那个代码不完美啊
2012-05-31 19:46
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
呵呵。好吧,那这回完美了吧?

重剑无锋,大巧不工
2012-05-31 19:50
草狼
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:577
专家分:1040
注 册:2010-4-6
收藏
得分:0 
以下是引用beyondyf在2012-5-31 19:50:02的发言:

呵呵。好吧,那这回完美了吧?

以下是引用beyondyf在2012-5-31 19:50:02的发言:

呵呵。好吧,那这回完美了吧?

如果你说上面那个代码的话, 还是不完美啊
应为它有10个重复的全排列

你那案列1 1 2 2 3 全排列应该只有30个
2012-05-31 19:54
快速回复:一个烦人的算法题。。。高手请进!!!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018628 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved