免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: ggglw
打印 上一主题 下一主题

看似简单的问题,求最简方法!请大侠们解答! [复制链接]

论坛徽章:
0
11 [报告]
发表于 2011-06-21 12:25 |只看该作者
好上面的讨论都很精彩,对我都有帮助。

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
12 [报告]
发表于 2011-06-21 12:43 |只看该作者
回复  zhlong8


    不过有几个致命的问题 就是数据不能有重复 而且不能太多
guap514 发表于 2011-06-21 11:40



    还有个 bug rand 可能为 0

论坛徽章:
0
13 [报告]
发表于 2011-06-21 13:38 |只看该作者
回复 12# zhlong8


    查了下  rand还真有可能等于0 以前没注意
不过对顺序应该没有影响吧?

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
14 [报告]
发表于 2011-06-21 13:55 |只看该作者
本帖最后由 zhlong8 于 2011-06-21 13:58 编辑
回复  zhlong8


    查了下  rand还真有可能等于0 以前没注意
不过对顺序应该没有影响吧?
guap514 发表于 2011-06-21 13:38



    这个是由 sort 决定啊,两个值一样哪个在前哪个在后

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
15 [报告]
发表于 2011-06-21 15:50 |只看该作者
这个是由 sort 决定啊,两个值一样哪个在前哪个在后
zhlong8 发表于 2011-06-21 13:55



rand()为0,是不会有问题的....
当$a,$b值都一样...sort不会改变顺序的...
print map { $_->[0] } sort { $a->[1] <=> $b->[1] } map { [ $_, /=/ ? ++$i : $i ] } <DATA>;   
没有rand()时,就是原来的顺序(没变)...

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
16 [报告]
发表于 2011-06-21 16:00 |只看该作者
rand()为0,是不会有问题的....
当$a,$b值都一样...sort不会改变顺序的...
print map { $_->[0] } s ...
jason680 发表于 2011-06-21 15:50



    当前的 sort 实现肯定是对的,这只是个概念上的 bug,因为完全可以写出一个不满足条件的 sort

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
17 [报告]
发表于 2011-06-21 16:10 |只看该作者
当前的 sort 实现肯定是对的,这只是个概念上的 bug,因为完全可以写出一个不满足条件的 sort :m ...
zhlong8 发表于 2011-06-21 16:00


不解...可否详述之...
...因为完全可以写出一个不满足条件的 sort

以下不含+rand(),相当rand()为0,则结果完全没变化...
print map { $_->[1].",". $_->[0]   } sort { $a->[1] <=> $b->[1] } map { [ $_, /^=/ ? ++$i : $i ] } <DATA>;

__DATA__
1jlsdjl
1dsflepdf
1d=fj
1dfj=
1ipwier
======   dfg
2fds
2fds
2djfl
2rewuoi
======   qqw
3dsfj
3wruo
======   eurew

$ perl t.pl
,1jlsdjl
,1dsflepdf
,1d=fj
,1dfj=
,1ipwier
1,======   dfg
1,2fds
1,2fds
1,2djfl
1,2rewuoi
2,======   qqw
2,3dsfj
2,3wruo
3,======   eurew

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
18 [报告]
发表于 2011-06-21 16:15 |只看该作者
不解...可否详述之...
...因为完全可以写出一个不满足条件的 sort

以下不含+rand(),相当rand()为0, ...
jason680 发表于 2011-06-21 16:10



    我的意思是并非所有排序算法都保证相同的值保持原来的相对位置

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
19 [报告]
发表于 2011-06-21 16:26 |只看该作者
本帖最后由 zhlong8 于 2011-06-21 16:57 编辑

那个叫稳定度,http://zh.wikipedia.org/wiki/%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95

比如 5.6 和以前默认的是快速排序算法
  1. use sort '_quicksort';
  2. use Data::Dumper;

  3. my @a;

  4. for ('a' .. 'z') {
  5.     push @a, [int(rand 5), $_];
  6. }

  7. say Dumper [sort @a]
复制代码
相同数字对应的后面字母却不一定有序

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
20 [报告]
发表于 2011-06-21 17:53 |只看该作者
那个叫稳定度,

比如 5.6 和以前默认的是快速排序算法相同数字对应的后面字母却不一定有序
zhlong8 发表于 2011-06-21 16:26


感谢您的回应....让我更了解排序"稳定度"问题....

最后所提例子....不是"稳定度"问题,也不是"quicksort"问题...
它排到array的reference了...不是random的"值"

for ('a' .. 'z') {
    push @a, [int(rand 5), $_];
    print $a[$#a],",@{$a[$#a]}[0,1]\n";
}

@sorted = sort @a;
foreach(@sorted){
  print "$_,", $_->[0],",",$_->[1],"\n";
}

rand 5结果
ARRAY(0xa0c96f8 ),0 a
ARRAY(0xa0ea0e0),0 b
ARRAY(0xa0e9f10),2 c
ARRAY(0xa0e9eb0),1 d
ARRAY(0xa0e9b20),3 e
ARRAY(0xa0f80d0),2 f
....

排序结果(它排到array的reference了...不是rand的"值")
ARRAY(0xa0c96f8),0,a
ARRAY(0xa0e9b20),3,e
ARRAY(0xa0e9eb0),1,d
ARRAY(0xa0e9f10),2,c
ARRAY(0xa0ea0e0),0,b
ARRAY(0xa0f80d0),2,f
...
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP