perl – 查找列表中最长元素的最快方式(执行时间)
发布时间:2020-12-15 21:27:44 所属栏目:大数据 来源:网络整理
导读:这是找到列表中最长的元素的最快(执行时间)方式吗? #!/usr/bin/env perluse warnings;use 5.012;use List::Util qw(reduce);use List::Util::XS;my @array = qw( one two three four five six seven eight nine ten eleven );my $l = reduce{ length($a) le
这是找到列表中最长的元素的最快(执行时间)方式吗?
#!/usr/bin/env perl use warnings; use 5.012; use List::Util qw(reduce); use List::Util::XS; my @array = qw( one two three four five six seven eight nine ten eleven ); my $l = reduce{ length($a) > length($b) ? $a : $b } @array; say $l; 解决方法
当只尝试找到一个列表的一个元素时,不需要构建一个N大小的数据结构,这里的许多答案已经完成.最快的O(N)方法是走数组,跟踪最大的元素.这样你有O(N)访问列表,和O(1)内存使用.
sub longest { my $max = -1; my $max_i = 0; for (0 .. $#_) { # for each index my $len = length $_[$_]; # only get length once per item if ($len > $max) { # save index and update max if larger $max = $len; $max_i = $_; } } $_[$max_i] # return the largest item } 如果你要运行上面的代码很多次,我建议嵌入子程序的正文. 编辑: drewk的基准显示,上述代码中的数组索引有点瓶颈.再试一次,我终于找到了一种比reduce解决方案更快的方法: sub fastest { my $max = -1; my $max_ref; for (@_) { if (length > $max) { # no temp variable,length() twice is faster $max = length; $max_ref = $_; # avoid any copying } } $$max_ref } 这导致以下基准: Rate longest drewk reduce fastest longest 44245/s -- -21% -30% -47% drewk 55854/s 26% -- -11% -33% reduce 63014/s 42% 13% -- -25% fastest 83638/s 89% 50% 33% -- (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |