Arrays 获取Perl数组中两个值之间所有元素的最有效方法
我有一个整数值列表;中的每个整数值都与一个实值相关联 为了给你一个想法,他们可以这样表示:Arrays 获取Perl数组中两个值之间所有元素的最有效方法,arrays,perl,Arrays,Perl,我有一个整数值列表;中的每个整数值都与一个实值相关联 为了给你一个想法,他们可以这样表示: 1 0.48 5 0.56 6 0.12 20 1.65 25 1.50 并非所有整数都表示在列表中,只有那些与之关联的值 给定一个整数值范围,我必须对与该范围极值之间的任何整数相关联的实值执行一些操作。例如: 给定范围5-20,我需要提取与整数5、6和20相关的实值,然后对它们执行一些操作 现在我能想到的最好办法是使用整数值作为散列键,循环所有排序的整数值,并检查每个值是否在
1 0.48
5 0.56
6 0.12
20 1.65
25 1.50
并非所有整数都表示在列表中,只有那些与之关联的值
给定一个整数值范围,我必须对与该范围极值之间的任何整数相关联的实值执行一些操作。例如:
给定范围5-20,我需要提取与整数5、6和20相关的实值,然后对它们执行一些操作
现在我能想到的最好办法是使用整数值作为散列键,循环所有排序的整数值,并检查每个值是否在范围内;像这样:
foreach (sort key %hash)
{
if ($_ >= $rangemin && $_ <= $rangemax)
{
push @somearray, $hash{$_}
}
last if $_ >= $rangemax;
}
foreach(排序键%hash)
{
如果($\>=$rangemin&&$\=$rangemax;
}
然而,我要处理的真正的列表要长得多,而且这个实现需要很多时间来执行
是否有一种更快/更有效的方法来获取数组中两个任意值之间的值列表?是否更快可能取决于您的数据,但您可以简单地循环数字,并检查它们是否存在:
for my $num ($rangemin .. $rangemax) {
if (defined $hash{$num}) { # number exists
# do stuff
}
}
作为一种变体,您可以使用grep
获取索引列表:
my @range = grep defined($hash{$_}), $rangemin .. $rangemax;
您不需要执行完整的集合扫描,只要迭代5-20次,然后从集合中获取与该键相关联的值,如果该键存在(
未定义()或未定义()。不排序,无需排序
这可能会稍微快一点:
@somearray = @hash{ grep $_ >= $rangemin && $_ <= $rangemax, keys %hash };
或
或
哪个最快将在很大程度上取决于数据的稀疏性、范围的大小以及包含的哈希值的百分比。oops对不起,我更正了推送。您能告诉我您的表达式是什么吗?我不熟悉该符号,我当然可以猜出结果,但我想知道它是否需要时间与我的实现相比,获得它的步骤更多或更少。谢谢!添加了解释。步骤更少,但涉及列表的步骤比基本操作更昂贵,
for ($rangemin..$rangemax) {
push @somearray, $hash{$_} if exists $hash{$_};
}
for ($rangemin..$rangemax) {
push @somearray, $hash{$_} // ();
}
@somearray = @hash{ grep exists $hash{$_}, $rangemin..$rangemax };