排序变换思路:施瓦茨变换

施瓦茨变换(Schwartzian Transform)是一种排序思路。先看看它的结构:

my @output_data =
    map { EXTRACTION },
    sort { COMPARISON }
    map [ CONSTRUCTION ],
@input_data;

施瓦茨变换:

  • construction:构造一个由原始数据以及被处理后准备用来做排序属性的元素组成的列表A
  • comparison:从列表A中取得元素进行排序,得到排序后列表B
  • expraction:从列表B中取得原始元素得到新列表C
  • 列表C就是期待的排序结果

先举个例子,文件test.txt中的内容如下:

1     mac     2000    500
2     winxp   4000    300
3     bsd     1000    600
4     linux   1000    200
5     SUSE    4000    300
6     Debian  600     200

现在需要使用perl对该文件进行排序,以第三字段为主排序依据(升序),第四字段(升序)、第一字段(降序)分别为辅助排序依据。

下面这种代码是谁都会的:

open DATA,"<","/perlapp/test.txt"
    or die "Can't open file: $!";

print sort {
                my @x = split / +/,$a;
                my @y = split / +/,$b;
                $x[2] <=> $y[2] 
                or $x[3] <=> $y[3]
                or $y[0] <=> $x[0]
           } <DATA>;

上面的排序过程中,对每一行都进行了一次split函数处理,换句话说,每一次比较操作都进行了两次split。

使用施瓦茨变换,可以将每次比较过程中每一种函数的多次操作都减少为一次,正如上面的split可以减少为一次(性能并没有更优化,只是代码减少了,更漂亮了)。

以下是使用Schwartzian Transform实现上述排序需求的代码:

open DATA,"<","/perlapp/test.txt" or die "Can't open file: $!";

print map { $_->[0] }
      sort { 
          $a->[3] <=> $b->[3] 
          or $a->[2] <=> $b->[2] 
          or $b->[1] <=> $a->[1] }
      map { [ $_,split / +/,$_ ] } <DATA>;

在上面施瓦茨变换代码中(从下往上看):

  • 最后一个map函数,将<DATA>中的元素重新构建成了一个新的匿名列表A,这个列表中除了原始文件中的每一行数据,还有对每一行进行split后的元素,因为每一行都是空格分隔的,所以split后的每一个元素都直接作为匿名列表的元素。大概如下:["6 Debian 600 200","6","Debian","600","200"]
  • sort函数对匿名列表A进行排序,取列表A中需要排序的元素进行排序,排序后得到一个新的排序列表B,这个列表中仍然包含了原始数据和split后的各元素,只不过它们是经过排序后的
  • 第一个map函数从排序后的列表B中取出第一个元素,也就是文件中的元素数据,得到最终的排序列表C

很多地方说施瓦茨变换会提高排序性能,但实际上并没有,原来sort的排序方式对每个$a $b都进行了split,其实就是对每一行都进行split,施瓦茨变换后对每一行都进行split,实际上它们是一样的,只不过施瓦茨变换后是对整个<DATA>预先split好,而不是每次取$a $b的时候进行split。

也就是说,施瓦茨变换仅仅只是让sort排序的时候,取数据更直接而已,并没有提升性能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
许瓦兹引理:从一道加利福尼亚大学伯克利分校数学系博士生试题谈起 作 者: 佩捷 著 出版时间:2014 丛编项: 《数学中的小问题大定理》丛书 内容简介 《许瓦兹引理:从一道加利福尼亚大学伯克利分校数学系博士生试题谈起》系统地介绍了许瓦兹引理、保角映射以及复函数的逼近,并且着重地介绍了Caratheodory和Kobayashi度量及其在复分析中的应用。论述深入浅出,简明生动,读后有益于提高数学修养,开阔知识视野。《许瓦兹引理:从一道加利福尼亚大学伯克利分校数学系博士生试题谈起》可供从事这一数学分支相关学科的数学工作者、大学生以及数学爱好者研读。 目录 1 几道数学竞赛培训题 2 保角映射 3 一道西德竞赛题 4 Schwarz引理 5 同时代的两位Schwarz 6 一个伯克利问题 7 中国大学生夏令营试题 8 与非欧几何的联系 9 与多复变函数论的联系 10 复函数的逼近 11 与插值问题的联系 12 Caratheodory和Kobayashi度量及其在复分析中的应用 1 序言 2 单值化定理 3 源自于Schwarz引理和Schwarz-Pick引理的推动 4 关于小林度量的基本事实 5 关于Caratheodory度量的一些基本事实 6 小林度量和Caratheodory度量的比较 13 陆启铿论Schwarz引理 附录 线性变换与罗巴切夫斯基几何 1 罗巴切夫斯基几何在圆上的欧几里得图像 2 给定附标的两点间的非欧距离的计算法 3 非欧几里得圆周 4 曲线的非欧长度 5 非欧几里得面积 6 远环 7 超环 8 罗巴切夫斯基几何在平面上的欧几里得图像 参考文献 编辑手记
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值