2011-09-11 41 views
3

所以我有一個數組(說@ rray)與0和1之間的排序值,還有一個哈希(說%哈希)的鍵被排序,是數字在0和1之間。散列中每個鍵的值爲0.現在,我需要查看@array的每個元素,找到%hash中的鍵,它立即小於它,並將相應的值遞增1。即,鍵充當lowerbounds爲間隔Perl-將排序後的數組元素讀入帶有排序鍵的散列

如果說

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

和我採取$array[1] = 0.33

然後,我需要能夠確定$陣列[1]大於0.25但小於0.5,因此,將「0.25」的值遞增1,給予更新的散列%hash =(「0.25」,1,「0.50」,0,「0.75」,0)。

我希望這是有道理的!提前致謝!!!

+0

要弄清楚爲什麼你認爲你需要散列是很困難的。 –

回答

4

哈希不按排序順序存儲密鑰。你必須重新思考你對問題的看法。

0

據我瞭解,你想跟蹤有多少項目在$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); 
0

如果你的散列鍵間隔均勻,就像在你的榜樣,每個人都可以通過一個簡單的公式一樣$biggestSmaller = int(i*4)/4來計算。如果不是,你需要一個像@keys = sort keys %hash這樣的輔助索引 - 它也可以是一棵二叉樹,但這很簡單,以至於一個簡單的列表應該可以做到(如果速度不重要,甚至可以很懶惰以至於搜索自下而上,而不是實施二進制搜索)。

4

您正在構建間隔或範圍的頻率分佈。 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; 
    } 
}