【发布时间】:2023-03-09 21:02:01
【问题描述】:
是的,这是我用来准备 1 月份自己的考试的旧考试。我们给出了以下方法:
public static void Oorspronkelijk()
{
String bs = "Dit is een boodschap aan de wereld";
int max = -1;
char let = '*';
for (int i=0;i<bs.length();i++) {
int tel = 1;
for (int j=i+1;j<bs.length();j++) {
if (bs.charAt(j) == bs.charAt(i)) tel++;
}
if (tel > max) {
max = tel;
let = bs.charAt(i);
}
}
System.out.println(max + " keer " + let);
}
问题是:
- 输出是什么? - 由于代码只是一种确定出现次数最多的字符的算法,因此输出为“6 keer”(6 倍空间)
- 这段代码的时间复杂度是多少? 很确定它是 O(n²),除非有人不这么认为?
- 您能否降低时间复杂度,如果可以,如何降低?
嗯,你可以。我已经收到了一些帮助并设法获得了以下代码:
public static void Nieuw()
{
String bs = "Dit is een boodschap aan de wereld";
HashMap<Character, Integer> letters = new HashMap<Character, Integer>();
char max = bs.charAt(0);
for (int i=0;i<bs.length();i++) {
char let = bs.charAt(i);
if(!letters.containsKey(let)) {
letters.put(let,0);
}
int tel = letters.get(let)+1;
letters.put(let,tel);
if(letters.get(max)<tel) {
max = let;
}
}
System.out.println(letters.get(max) + " keer " + max);
}
但是,我不确定这段新代码的时间复杂度:是 O(n) 是因为您只使用了一个 for 循环,还是我们需要使用 HashMap 的 get 方法这一事实使其成为 O( n log n) ?
如果有人知道降低时间复杂度的更好方法,请告诉! :)
【问题讨论】:
-
我不擅长确定复杂性和伤员 - 为什么 O(n^2)?我的问题点是:在第二个循环中,你迭代不是 N 次,而是(N - M,并且 M 在每次迭代中增加 1)。
-
@Vanger 表示第二个循环将执行 (1+2+3+...+N) 次,即 [(N+1)*N]/2 = (N^2 +N)/2 = O(N^2)
-
@yurib Thx :) 完全忘记了系列。
标签: java algorithm hash hashmap complexity-theory