对于我参加的课程,最好使用one-pass algorithm
来修复某项任务。由于这个课程不在我的专业范围内(我是建筑环境,课程是计算机科学),并且没有在课堂上讨论,我还没有弄清楚一次通过算法是什么是。谷歌搜索它让我想到这样的事情:
每个输入只能访问一次,所有内容都应按顺序处理。
对于我下面的代码,这表明for loop
适合one-pass algorithm
,但我不确定while loop
。
你能告诉我,最好用外行人的话来说,one-pass algorithm
意味着/需要什么,如果我的代码符合这个描述?
public int[] computeDepth(int tree[]) {
int[] depth = new int[tree.length];
depth[0] = 0;
for (int index=1; index < tree.length; index++) {
depth[index] = 1;
int parentIndex = tree[index];
while (parentIndex != 0) {
parentIndex = tree[parentIndex];
depth[index]++;
}
}
return depth;
}
答案 0 :(得分:3)
在计算中,一次通过算法是按顺序读取其输入的算法,没有无限制的缓冲(你不会将东西存储在其他地方并将其视为一次)。一次通过算法通常需要O(n)(如果你有n项,它需要n步完成)和少于O(n)存储(因为你不总是需要使用额外的存储,它可能是低的如O(1)),其中n是输入的大小。
(直接从https://en.wikipedia.org/wiki/One-pass_algorithm解除,并带有一些外行翻译)
for循环是一种典型的一次通过算法 - 您只需查看每个值一次并继续前进。 while循环也可以工作,只要它只查看每个值一次并且不重复for循环所看到的 - 但在这种情况下它不是。
您在深度优先搜索中的目标是仅查看每个节点一次,然后继续前进,不再重复。
希望这是有道理的。
答案 1 :(得分:3)
在外行人看来,一次通过算法是按顺序读取其输入一次的算法。
您的代码是否符合描述:否。
您使用内部tree
循环多次遍历输入while
:
tree[index]
和tree[parentIndex]
违反了一次通过算法的基本标准。