为什么这个函数xn ^ 2的大o?

时间:2017-06-08 02:50:37

标签: big-o

我有以下功能:

public String joinWords(String[] words) {
  String sentence = "";
  for(String w : words) {
    sentence = sentence + w;
  }
}

我被告知这是一个O(n ^ 2)?这是为什么?有一个循环不是O(n)吗?

2 个答案:

答案 0 :(得分:1)

实际上,循环迭代words.length次。

但是,在每次迭代时,旧的sentence字符串将被丢弃,并创建一个新的sentence字符串。在创建新sentence的过程中,先前的一个被复制到新的word中,然后附加<?php $subcategories = get_categories('&child_of=22&hide_empty'); foreach ($subcategories as $subcategory) { echo '<a href="' . get_category_link( $subcategory->term_id ) . '" title="' . sprintf( __( "View all posts in %s" ), $subcategory->name ) . '" ' . '>' . $subcategory->name.'</a>'; echo '<p>'.$subcategory->description.'</p>'; } ?> 。每个复制行为都需要O(n),因此整个循环需要O(n 2 )。

答案 1 :(得分:0)

字符串连接的循环很奇怪。编译器可以将连接转换为stringBuilders,但不能在循环中转换,尽管这应该在编译器能力范围内。

典型的java编译器将您的语句转换为:

public String joinWords(String[] words) {
  String sentence = "";
  for(String w : words) {
    sentence = new StringBuilder().append(sentence).append(w).toString()
  }
}

因此,每次执行此操作时,您仍然会将每个数字复制到新String。哪个是另一个循环的来源。

你很明显可以将其转换为(在Android中):

TextUtils.join("",words);

或Java8中的String.join()命令。并且有不止一些有用的方法来实现流。但是,由于内部是的,那个循环将是O(N ^ 2)。

显然:

public String joinWords(String[] words) {
      String sentence = "";
      StringBuilder sb = new StringBuilder();
      for(String w : words) {
          sb.append(w);
      }
      return sb.toString();
}

修复它。

额外的循环不需要在那里。但是在循环中使用字符串连接是。