【问题标题】:Time Complexity of this Algorithm: is it O(n^2) or O(n)该算法的时间复杂度:是 O(n^2) 还是 O(n)
【发布时间】:2019-12-13 06:00:55
【问题描述】:

我正在尝试解决 Leetcode 的“Reverse Words in a String III”。我想出了一个解决方案,但我认为我的时间复杂度是 O(n^2)。我的代码能够通过所有测试用例。我的代码如下:

class Solution {
    public String reverseWords(String s) {
        if(s.isEmpty())
            return "";

        StringBuilder result = new StringBuilder();        
        String[] str = s.split("\\s+");
        for(String s1:str){
            char[] c1  = reverseChar(s1);
            result.append(c1).append(" ");
            }
        return result.toString().trim();
    }

    public char[] reverseChar(String s){
        char[] c = s.toCharArray();
        int i = 0;
        int j = c.length-1;

        while(i<j){
                char temp = c[i];
                c[i] = c[j];
                c[j] = temp;
                j--;
                i++;
            }
        return c;
    }

}

【问题讨论】:

  • 我想说它是 O(n*m) 复杂度,其中 n 是单词数,m 是字符串的长度。
  • 如果不将其拆分成单词,您认为复杂度会是多少? (即反转整个字符串)您认为将其拆分为单词的复杂性是多少?哪个最高?
  • 您可以通过使用StringBuilder#reverse 而不是编写char[] reverseChar(String s) 方法来减少执行时间。
  • 这只是 O(n),因为您只遍历每个字符一次
  • @Luggi Mendoza,为什么你认为 StringBuilder#reverse 会降低时间复杂度?

标签: java string stringbuilder


【解决方案1】:

O(n) ... 当字符串长度较短时,由于 JVM 的启动/拆除成本,实际上会稍微少一些。

如果您有兴趣准确了解,我建议您研究 Java Micro-benchmarking Harness (JMH)(回复:https://www.oracle.com/technetwork/articles/java/architect-benchmarking-2266277.html)。

我不推荐以下穷人的基准;但是,它回答的问题都是一样的。

    public static void main (String[] args) {
        Random r = new Random();
        char[] chars = new char[100_000]; // change this value to other benchmarks
                for (char c : chars) {
            c = (char) (r.nextInt(90) + 32);
        }

        Solution s = new Solution();
        long x1  = System.currentTimeMillis();
        s.reverseWords(Arrays.toString(chars));
        long x2 = System.currentTimeMillis();

        System.out.println("duration = " + (x2 - x1));
    }

【讨论】:

    【解决方案2】:

    我认为复杂度是 O(n/2)。代码可以抽象为

    for(int i =0 ,i< str.length, i++){
        for(int j = 0,j < str[i].length/2, j++)
        {
           ...
        }
    }
    

    说str是['abc','abc','abc','abc'],复杂度是4*(3/2) = (4*3)/2。而4*3 == n,所以是O(n/2)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-12
      相关资源
      最近更新 更多