这种反向字符串算法的运行时间是多少?

时间:2017-08-25 23:33:55

标签: java

因此,有一种算法可以接收一个char数组,例如" Alice喜欢Bob"并且反转它所以我们有" Bob喜欢Alice"。以下是算法的代码:

public static void reverseWords(char[] input) {
   int n = input.length;
   //First, reverse the whole string.
   reverse(input, 0, n - 1);

   //Second, Reverses each word in the string.
   int start = 0, end = 0;
   while (start < n) {
       while (start < end || start < n && input[start] == ' ') {
           ++start; // Skip spaces chars.
       }
       while (end < start || end < n && input[end] != ' ') {
           ++end; // Skip non-spaces chars.
       }
       reverse(input, start, end - 1);
   }
}
public static void reverse(char[] array, int start, int end){
    while(start<end){
        char tmp = array[start];
        array[start++] = array[end];
        array[end--] = tmp;
    }
}

public static int find(char[] array, char c, int start) {
   for (int i = start; i < array.length; i++) {
       if (array[i] == c) {
           return i;
       }
   }
   return -1;
}

有人可以解释这段代码在0(n)时间运行吗?功能查找的目的是什么?我没有看到被发现在任何地方。

1 个答案:

答案 0 :(得分:1)

显然你正在学习......但你需要学习如何使术语正确。

  

这种反向字符串算法的运行时间是多少?

运行时间是算法运行所需的时间。显然,这取决于您运行它的硬件,编译器,您提供的输入......等等。基本上,这不是一个有意义的问题要问我们。如果你真的需要知道运行时间....你测量它。

  

有人可以解释这段代码在O(n)时间运行吗?

现在这个 是一个有意义的问题。您不再询问运行时间:测量或估计。您现在要询问算法的计算复杂度度量。这是关于分析代码以确定运行时间 1 如何根据问题的大小而变化;即输入。

是的,O(N)

弄清楚为什么(非正式地)将代码的各个部分分解成更小的块,并弄清楚每个块正在做什么,以及它要去多少次&#34;触摸&#34; (读或写)输入中的每个字符。然后累积它们以给出代数公式&#34;。

该公式f(n)看起来像C1 * n + C2吗?或者,您可以证明f(n)小于某些C1 * n,因为n变得非常大吗?

(我很确定我可以......但我会把细节留给你!)

  

函数find的目的是什么?我没有看到find在任何地方被召唤。

这看起来像书中的错误。

find方法的 ostensible 目的是在数组中找到给定字符出现的位置。但正如你所说,它没有被使用。

归咎于写作/编辑/出版质量控制不佳。它发生了。

1 - 嗯......实际上并不是真正的运行时间。我们通常做的是计算一些理论上代表运行时间的东西;例如原始操作,如读写变量。这不会也不能为您提供真实时间的衡量标准。但由于复杂性分析的主要目的是在算法之间进行选择,因此这通常并不重要。如果确实如此,那么您需要求助于测量和比较运行时间。