Schwartzian转换 和 Guttman-Rosler转换

考虑如下示例:

@dates = qw(2001/1/1 2001/07/04 1999/12/25);

你想按日期升序对它们进行排序,哪种方法最有效呢?

最直观的Schwartzian转换可以这样写:

@sorted = map { $_->[0] }
sort { $a->[1] <=> $b->[1]
        or $a->[2] <=> $b->[2]
        or $a->[3] <=> $b->[3]
}
map { [ $_, split m</>, $_, 3 ] } @dates;

然而,更高效的Guttman-Rosler转换(GRT)这样写:

@sorted = map { substr $_, 10 }
sort
map { m|(\d\d\d\d)/(\d+)/(\d+)|;
    sprintf "%d-%02d-%02d%s", $1, $2, $3, $_
} @dates;

GRT方法难于编码,并且比Schwartzian转换更难阅读,所以我推荐仅在极端环境下使用GRT。使用大的数据源,perl 5.005_03和linux 2.2.14进行测试,GRT比Schwartzian转换快1.7倍。用perl 5.005_02和windows NT 4.0 SP6进行测试,GRT比Schwartzian快2.5倍。

posted @ 2011-06-08 14:01  ACE封印  Views(244)  Comments(0Edit  收藏  举报