我有以下功能:
public String joinWords(String[] words) {
String sentence = "";
for(String w : words) {
sentence = sentence + w;
}
}
我被告知这是一个O(n ^ 2)?这是为什么?有一个循环不是O(n)吗?
答案 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();
}
修复它。
额外的循环不需要在那里。但是在循环中使用字符串连接是。