【问题标题】:Perl- Reading sorted array elements into a hash with sorted keysPerl-将排序的数组元素读入带有排序键的散列
【发布时间】:2011-09-11 07:41:25
【问题描述】:

所以我有一个数组(比如@array),其排序值介于 0 和 1 之间,还有一个哈希(比如 %hash),其键是排序的并且是 0 到 1 之间的数字。 hash 为 0。现在,我需要查看 @array 的每个元素,在 %hash 中找到立即小于它的键,并将相应的值增加 1 。也就是说,键作为区间的下界

如果说

$array = (0.15,0.33,0.67,0.87) 
and %hash = ("0.25", 0, "0.50", 0, "0.75", 0)

我接受$array[1] = 0.33

然后,我需要能够确定 $array[1] 大于 0.25 但小于 0.5,因此,将 "0.25" 的值增加 1,从而得到更新的哈希 %hash = ("0.25 ", 1, "0.50", 0, "0.75", 0)。

我希望这是有道理的!提前谢谢!!!

【问题讨论】:

  • 很难弄清楚为什么你认为你需要哈希。

标签: arrays perl hash


【解决方案1】:

哈希不按排序顺序存储键。您必须重新考虑解决问题的方法。

【讨论】:

    【解决方案2】:

    您正在构建区间或范围的频率分布。 CPAN 有可以做到这一点的模块。如果您可以重新表述您的问题以同意这些模块如何理解频率分布,您将能够为自己省点麻烦并获得对您的项目可能有用的其他统计工具的访问权限。一个例子:

    use Statistics::Descriptive;
    my @data = (0.15, 0.33, 0.67, 0.87);
    my @bins = (0.25, 0.50, 0.75, 1.00);
    my $stat = Statistics::Descriptive::Full->new();
    $stat->add_data(@data);
    my $freq = $stat->frequency_distribution_ref(\@bins);
    

    $freq 中的分布将是这样的哈希引用:

    $freq = {
      '0.25' => 1
      '0.5'  => 1,  # N of items x, such that PREVIOUS_BIN_VAL < x <= .50
      '0.75' => 1,
      '1'    => 1,
    };
    

    如果您无法修改您的问题,那么您需要自己计算分布,但您可以从Statistics::Descriptive 获得重要提示。特别是,对您有一个有序的 bin 值列表会很有帮助。这是一个插图:

    my @data = (0.15, 0.33, 0.67, 0.87);
    my @bins = (0.25, 0.50, 0.75);    # Include 0.0 if you want 0.15 to be tallied.
    my %freq = map {$_ => 0} @bins;
    
    for my $d (@data){
        for my $b (reverse @bins){
            do { $freq{$b} ++; last } if $d >= $b;
        }
    }
    

    【讨论】:

      【解决方案3】:

      据我了解,您想跟踪$array 中有多少项小于%hash 中的密钥

      因此,对于散列中的每个键值,您可以从数组中检索小于列表中键的所有项目并获取它的计数。您可以为此使用grep

      use strict;
      use warnings;
      use Data::Dumper;    
      
      my $array = [qw (0.15 0.33 0.67 0.87 1.5) ] ;
      my %hash = (0.25 => 0, 0.50 => 0, 0.75 => 0, 0.05 => 0);    
      
      for my $k (keys %hash) {
              my @filtered =  grep { $_ < $k } @$array;
              $hash{$k} = @filtered;
              #$hash{$k} = @filtered ? 1 : 0 # if you just want a flag 
      }
      
      print Dumper(\%hash);
      

      【讨论】:

        【解决方案4】:

        如果您的哈希键是均匀分布的,就像在您的示例中一样,每个都可以通过一个简单的公式计算,例如 $biggestSmaller = int(i*4)/4。如果没有,你需要一个像@keys = sort keys %hash 这样的辅助索引——它也可以是一棵二叉树,但这很简单,一个简单的列表就应该这样做(如果速度不重要,你甚至可以懒得去搜索自下而上,而不是实现二进制搜索)。

        【讨论】:

          猜你喜欢
          • 2014-05-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-16
          • 1970-01-01
          相关资源
          最近更新 更多