什么是一次通过算法,是我的算法?

时间:2017-09-19 15:13:29

标签: java algorithm

对于我参加的课程,最好使用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;
}

2 个答案:

答案 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]

违反了一次通过算法的基本标准。