Нахождение сложности данного кода

Я борюсь, чтобы найти сложность данного кода. Я думаю, что я борюсь с определением правильной сложности и как на самом деле анализировать сложность. Код для анализа выглядит следующим образом:

    public void doThings(int[] arr, int start){
    boolean found = false;
    int i = start;
    while ((found != true) && (i<arr.length)){
        i++;
        if (arr[i]==17){
            found=true;
        }
    }
}
public void reorganize(int[] arr){
    for (int i=0; i<arr.length; i++){
        doThings(arr, i);
    }
}

Вопросы:

1) Какова сложность случая реорганизации в лучшем случае и для каких входов это происходит?
2) Какова сложность наихудшего случая метода реорганизации и для каких входов это происходит?

Мои ответы:

1) Для метода реорганизации возможны два лучших варианта. Во-первых, когда длина массива равна 1, это означает, что цикл в методе reorganize и doThings будет запущен ровно один раз. Другая возможность - это когда i-й элемент массива равен 17, что означает, что цикл doThings не будет полностью выполняться на этой i-й итерации. Таким образом, в обоих случаях лучший случай = Ο (n).

2) Наихудший случай был бы, когда число 17 находится в конце массива и когда число 17 отсутствует в массиве. Это будет означать, что массив будет пересмотрен n×n раз, а это означает, что наихудший случай будет Ο(n^2).

Может ли кто-нибудь помочь мне правильно ответить на вопросы, если мои вопросы неверны и, если возможно, объяснить проблему?

1 ответ

Решение

В "лучшем случае" массив пуст, и вы ничего не ищете.

В худшем случае вы смотрите на каждый элемент, потому что никогда не видите 17. Все остальные случаи находятся между ними.

if (arr[i]==17){ это "самый горячий путь" кода, то есть он запускается чаще всего.

Это всегда будет выполнять в общей сложности n*(n-1)/2 раз (я думаю, что я сделал эту математику правильно) в худшем случае, потому что даже когда вы установите found = true, reorganize Метод не знает об этом, не заканчивается и продолжает поиск, даже если вы уже отсканировали весь массив.

По сути, выровнять код без методов. У вас есть этот вопрос.

Что такое Big-O вложенного цикла, где число итераций во внутреннем цикле определяется текущей итерацией внешнего цикла?

Другие вопросы по тегам