我将如何实现目录的广度优先遍历(深度未知且不一定对称)。

我的第一个想法是使用叉子。我不确定如何实施。我在想一个循环,首先获取父母,然后获取父母的孩子数,然后根据该孩子的孩子数和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/

10-09 22:45