Я пытаюсь понять контраст между временем выполнения для этой функции
public static String f(int N) {
if (N == 0) return "";
String s = f(N / 2);
if (N % 2 == 0) return s + s;
else return s + s + "x";
}
и этой функции
public static String f(int N) {
if (N == 0) return "";
if (N == 1) return "x";
return f(N/2) + f(N - N/2);
}
, где конкатенация строк занимает время, пропорциональное размеруstrings.
Пока что я считаю, что первая функция вызывается log (N) раз для ввода N, а вторая 2log (N) раз.Это правильно?Кроме того, я не уверен, как думать о том, сколько операций происходит в каждом из этих вызовов.Я знаю, что для первой функции в базовом случае есть 0 операций (без конкатенации), затем 1 операция (конкатенация двух нулевых строк со строкой длины 1?), Затем 2 операции.Вообще я считаю, что строка, полученная при вызове с N, имеет длину N?Но я просто не знаю, с чего бы начать думать о том, как все это складывается.
Во-вторых, я тоже немного растерялся.Мне просто нужен подход к анализу.Имейте в виду, что я не очень хорошо разбираюсь в символах, поэтому, если вы собираетесь хвастаться символами, я был бы признателен за объяснение, которое также поможет мне следовать за символами.