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 };