Chinaunix首页 | 论坛 | 博客
  • 博客访问: 45169
  • 博文数量: 43
  • 博客积分: 1161
  • 博客等级: 少尉
  • 技术积分: 425
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-24 11:14
文章分类
文章存档

2011年(40)

2010年(3)

分类: Python/Ruby

2011-05-14 18:57:10

返是一种排序优化思想,其基础即是以空间换时间的高效排序。

在高效排序中,与门定义了一个中间结果集,这其实也挺麻烦的,还要想一个不冲突的名字。其实可以直接写成:
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use Data::Dumper;
  5. sub ask_monkey_about(){
  6.     my $people=shift;
  7.     ++$call_total;
  8.     return$people;
  9. }
  10. my @cataways=qw(Gilligan Skippers Professor Ginger Mary_Ann Thurston Lovey);
  11. my @wasters=
  12.     map $_->[0],
  13.     sort{$a->[1]cmp $b->[1]}
  14.     map {[$_,&ask_monkey_about($_)]},
  15.     @cataways;

程序第12~15行就是一个Schwartzian Transform。说白了就是省掉了一些中间步骤,写一起了。


Schwartzian Transform的范式可以概括为:
  1. my @output_data=
  2.    map $_->[0],
  3.    sort{SORT COMPARISON USING $a->[1] <=>$b->[1]}
  4.    map {[$_,EXPENSIVE FUNCTION OF $_]},
  5.    @input_data;

Schwartzian Transform的结构其实都是基本固定的。

1行和第5行是不会变的;

从下往上看:

4行的map迒回一个匿名数组引用,其中包含了输入数据的原值和耗时计算值;

3行以map迒回的匿名数组引用作为输入来排序,排序关键字是耗时计算值;

2行从sort的迒回值中取出排序后的原值结果。

实际使用的时候,可以先把基础结构写出来:
  1. my @output_data=
  2.    map ,
  3.    sort
  4.    map ,
  5.    @input_data;

然后再在对应的位置填空就是了。

如果实在记不住返样的形式,拆开了用高效排序里面的中间结果集也行,效率都是一样的,无非是要不要给中间结果集想一个名字而已。

Schwartzian Transform的多值形式其实也没什么神奇的,无非是在第4行多算几个中间结果,在第3行多写几个or而已,形式和基本的按多值排序差不多。
阅读(353) | 评论(0) | 转发(0) |
0

上一篇:高效排序

下一篇:需要关注什么?

给主人留下些什么吧!~~