对不起,迟到的回复,我一直抛光这一段时间,因为我不想再有一个负面评分(打消我)。
这是一个有趣的效率问题。我不知道我的解决方案是否适合你,但我想我会分享它。只有当你的数组没有太频繁地改变时,以及你的数组是否包含许多重复值,这可能是有效的。我没有对它进行任何效率检查。
基本上,解决方案是通过将数组值转换为位来移除交叉检查的一个维度,并且一次对整个数组进行按位比较。数组值被删除,排序并给出一个序列号。阵列总序列号然后通过按位或以单个值存储。单个阵列可以由此被检查一个序列号只有一个的操作,例如:
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