Да, это из более старого экзамена, который я использую для подготовки своего собственного экзамена в январе.Нам дают следующий метод:
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 кеер» (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-loop, или тот факт, что нам требуется использование методов get HashMap, делает его O (n log n)?
И если кто-то знает еще лучший способ уменьшить сложность времени, пожалуйста, сообщите!:)