對不起,遲到的回覆,我一直拋光這一段時間,因爲我不想再有一個負面評分(打消我)。
這是一個有趣的效率問題。我不知道我的解決方案是否適合你,但我想我會分享它。只有當你的數組沒有太頻繁地改變時,以及你的數組是否包含許多重複值,這可能是有效的。我沒有對它進行任何效率檢查。
基本上,解決方案是通過將數組值轉換爲位來移除交叉檢查的一個維度,並且一次對整個數組進行按位比較。數組值被刪除,排序並給出一個序列號。陣列總序列號然後通過按位或以單個值存儲。單個陣列可以由此被檢查一個序列號只有一個的操作,例如:
if (array & serialno)
這將需要一個運行準備數據,然後可將其保存在高速緩存或相似。這些數據可以在數據更改之前使用(例如文件/文件夾被刪除或添加)。我在未定義的值上添加了一個致命的退出,這意味着數據在發生時必須刷新。
祝你好運!
use strict;
use warnings;
my @list1=('a', 'b', 'c');
my @list2=('a', 'b', 'f');
my @list3=('e', 'd', 'a');
my @list4=('f', 'g', 'h');
# combine arrays
my @total = (@list1, @list2, @list3, @list4);
# dedupe (Thanks Xetius for this code snippet)
my %unique =();
foreach my $item (@total)
{
$unique{$item} ++;
}
# Default sort(), don't think it matters
@total = sort keys %unique;
# translate to serial numbers
my %serials =();
for (my $num = 0; $num <= $#total; $num++)
{
$serials{$total[$num]} = $num;
}
# convert array values to serial numbers, and combine them
my @tx =();
for my $entry (@list1) { $tx[0] |= 2**$serials{$entry}; }
for my $entry (@list2) { $tx[1] |= 2**$serials{$entry}; }
for my $entry (@list3) { $tx[2] |= 2**$serials{$entry}; }
for my $entry (@list4) { $tx[3] |= 2**$serials{$entry}; }
&print_all;
sub inList
{
my ($value, $list) = @_;
# Undefined serial numbers are not accepted
if (! defined ($serials{$value})) {
print "$value is not in the predefined list.\n";
exit;
}
return (2**$serials{$value} & $tx[$list]);
}
sub yesno
{
my ($value, $list) = @_;
return (&inList($value, $list) ? "yes":"no");
}
#
# The following code is for printing purposes only
#
sub print_all
{
printf "%-6s %-6s %-6s %-6s %-6s\n", "", "List1", "List2", "List3", "List4";
print "-" x 33, "\n";
&table_print(@list1);
&table_print(@list2);
&table_print(@list3);
&table_print(@list4);
}
sub table_print
{
my @list = @_;
for my $entry (@list) {
printf "%-6s %-6s %-6s %-6s %-6s\n", $entry,
&yesno($entry, 0),
&yesno($entry, 1),
&yesno($entry, 2),
&yesno($entry, 3);
}
print "-" x 33, "\n";
}
來源
2011-04-27 21:34:41
TLP
'定義'是什麼讓我更容易忍受,而在哈希工作將是最有效地搜索數百和數千行(文件)的事實。謝謝。 – EDJ 2011-04-27 18:27:00