У меня есть этот метод:
public static int what(String str, char start, char end)
{
int count=0;
for(int i=0;i<str.length(); i++) {
if(str.charAt(i) == start)
{
for(int j=i+1;j<str.length(); j++)
{
if(str.charAt(j) == end)
count++;
}
}
}
return count;
}
Что мне нужно найти:
1) Что он делает? Ответ: подсчет общего числа end вхождений после EACH (или это? Не указано в назначении, от этого зависит пункт 3) start .
2) В чем его сложность? Ответ: первый цикл полностью перебирает строку, поэтому он равен по крайней мере O (n) , второй цикл выполняется только в том случае, если найдено start char и даже частично (индекс, при котором начало найдено + 1). Хотя, большой О это все о худшем случае нет? Таким образом, в худшем случае, start является первым символом, и внутренняя итерация повторяет строку n-1 раз, -1 является константой, поэтому n . Но статистически внутренний цикл не будет выполняться при каждом внешнем проходе итерации, но поскольку большой O соответствует наихудшему случаю, правильно ли говорить, что его сложность составляет O (n ^ 2) ? Игнорирование любых констант и тот факт, что в 99,99% случаев внутренний цикл не будет выполнять каждый проход внешнего цикла.
3) Перепишите его так, чтобы сложность была ниже.
Что я не уверен, так это то, происходит ли start самое большее один раз или больше, если самое большее один раз, то метод может быть переписан с использованием одного цикла (с флагом, указывающим, является ли встречается * начало и оттуда при увеличении счет в каждом конце вхождении), что приводит к сложности O (n) .
Однако, если start может появиться несколько раз, что , скорее всего, , потому что задание имеет курс Java, и я не думаю, что они сделают такую двусмысленность .
Решение, в этом случае, невозможно с помощью одной петли ... WAIT ! Да, это так!!
Просто укажите переменную, скажем, inc , которая будет увеличиваться каждый раз, когда встречается начало , и используется для увеличения count каждый раз, когда встречается конец после того, как 1-е начало было найдено:
inc = 0, count = 0
if (current char == start) inc++
if (inc > 0 && current char == end) count += inc
Это также приведет к сложности O (n) ? Потому что есть только 1 петля.
Да, я понимаю, что много написал, хе-хе, но я также понял, что гораздо лучше понимаю, превращая свои мысли в слова ...