排序变换思路:施瓦茨变换
2021-05-19 00:28
标签:它的 属性 transform exp 元素 for data 字段 [1] 施瓦茨变换(Schwartzian Transform)是一种排序思路。先看看它的结构: 施瓦茨变换: 先举个例子,文件test.txt中的内容如下: 现在需要使用perl对该文件进行排序,以第三字段为主排序依据(升序),第四字段(升序)、第一字段(降序)分别为辅助排序依据。 下面这种代码是谁都会的: 上面的排序过程中,对每一行都进行了一次split函数处理,换句话说,每一次比较操作都进行了两次split。 使用施瓦茨变换,可以将每次比较过程中每一种函数的多次操作都减少为一次,正如上面的split可以减少为一次(性能并没有更优化,只是代码减少了,更漂亮了)。 以下是使用Schwartzian Transform实现上述排序需求的代码: 在上面施瓦茨变换代码中(从下往上看): 很多地方说施瓦茨变换会提高排序性能,但实际上并没有,原来sort的排序方式对每个 也就是说,施瓦茨变换仅仅只是让sort排序的时候,取数据更直接而已,并没有提升性能。 排序变换思路:施瓦茨变换 标签:它的 属性 transform exp 元素 for data 字段 [1] 原文地址:https://www.cnblogs.com/f-ck-need-u/p/9744275.htmlmy @output_data =
map { EXTRACTION },
sort { COMPARISON }
map [ CONSTRUCTION ],
@input_data;
1 mac 2000 500
2 winxp 4000 300
3 bsd 1000 600
4 linux 1000 200
5 SUSE 4000 300
6 Debian 600 200
open DATA," $y[2]
or $x[3] $y[3]
or $y[0] $x[0]
} ;
open DATA,"[0] }
sort {
$a->[3] $b->[3]
or $a->[2] $b->[2]
or $b->[1] $a->[1] }
map { [ $_,split / +/,$_ ] } ;
中的元素重新构建成了一个新的匿名列表A,这个列表中除了原始文件中的每一行数据,还有对每一行进行split后的元素,因为每一行都是空格分隔的,所以split后的每一个元素都直接作为匿名列表的元素。大概如下:
["6 Debian 600 200","6","Debian","600","200"]
$a $b
都进行了split,其实就是对每一行都进行split,施瓦茨变换后对每一行都进行split,实际上它们是一样的,只不过施瓦茨变换后是对整个预先split好,而不是每次取
$a $b
的时候进行split。