我将如何实现目录的广度优先遍历(深度未知且不一定对称)。
我的第一个想法是使用叉子。我不确定如何实施。我在想一个循环,首先获取父母,然后获取父母的孩子数,然后根据该孩子的孩子数和chdir进行多次分叉,由于进行了多进程,因此所有孩子都是然后chdir'd到。然后将孩子作为父母分叉。
我觉得这可能有漏洞,我正在寻找有关可能存在的缺陷的信息,或者这是一种可怕的方法。我听说过人们首先使用广度叉,但从未找到任何示例,因此,如果有任何示例,我将很乐意研究它们。
最佳答案
您的代码如下所示:
使用基本目录设置initialize todo
队列。
虽然todo
队列不为空,
将队列的开头分配给path
。
卸下队列的开头。
如果path
引用目录,
将path
中文件的路径追加到todo
队列中。
使用path
执行要执行的任何操作。
我不明白为什么您认为fork
会有所帮助。
例如,实际的Perl实现:
sub dir_contents {
my ($path) = @_;
my $dh;
if (!opendir(my $dh, $path)) {
warn("Can't open dir \"$path\": $!\n");
return;
}
return map { "$path/$_" } grep { !/^\.\.?/ } readdir($dh)
}
my @todo = 'some path';
while ( my $path = shift(@todo) ) {
if (!stat($path)) {
warn("Can't stat \"$path\": $!\n");
next;
}
push @todo, dir_contents($path) if -d _;
print("$path\n");
}
关于c - 广度优先c,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28388878/