我正在尝试比较包含目录文件列表的多个字符串数组.目标是确定每个目录中存在哪些文件以及哪些文件不存在.考虑:
List1 List2 List3 List4
a a e f
b b d g
c f a h
结果应该是:
列表1:
List1 List2 List3 List4
a yes yes yes no
b yes yes no no
c yes no no no
列表2:
List1 List2 List3 List4
a yes yes yes no
b yes yes no no
f no yes no yes
…
我可以遍历所有数组并遍历每个条目,遍历所有其他数组并执行grep:
for my $curfile (@currentdirfiles) {
if( grep(/$curfile/, @otherarrsfiles) ) {
// Set 'yes'
} else {
// set 'no'
}
}
我唯一担心的是我最终得到的是0 ^ 2n数量级.我可能无法对此做任何事情,因为无论如何我最终会遍历所有数组.一个改进可能在grep函数中,但我不确定.
有什么想法吗?
最佳答案 现在问题已被修改,这就产生了你想要的答案.它在O(n3)时间内工作,这对于问题是最佳的(有n3个输出).
#!/usr/bin/env perl
use strict;
use warnings;
#List1 List2 List3 List4
#a a e f
#b b d g
#c f a h
my(@lists) = ( { a => 1, b => 1, c => 1 },
{ a => 1, b => 1, f => 1 },
{ e => 1, d => 1, a => 1 },
{ f => 1, g => 1, h => 1 },
);
my $i = 0;
foreach my $list (@lists)
{
analyze(++$i, $list, @lists);
}
sub analyze
{
my($num, $ref, @lists) = @_;
printf "List %d\n", $num;
my $pad = " ";
foreach my $i (1..4)
{
print "$pad List$i";
$pad = "";
}
print "\n";
foreach my $file (sort keys %{$ref})
{
printf "%-8s", $file;
foreach my $list (@lists)
{
my %dir = %{$list};
printf "%-8s", (defined $dir{$file}) ? "yes" : "no";
}
print "\n";
}
print "\n";
}
我得到的输出是:
List 1
List1 List2 List3 List4
a yes yes yes no
b yes yes no no
c yes no no no
List 2
List1 List2 List3 List4
a yes yes yes no
b yes yes no no
f no yes no yes
List 3
List1 List2 List3 List4
a yes yes yes no
d no no yes no
e no no yes no
List 4
List1 List2 List3 List4
f no yes no yes
g no no no yes
h no no no yes