Какова сложность этого кода? И какую нотацию я должен использовать?

51
4

Когда я определяю сложность Java-кода, подобного этому, мне нужно выразить это в тете или большой нотации O?

List<Person> sortedPersons = new ArrayList<Person>();
List<Person> people = new ArrayList<Person>();

for (int i = 0; i < people.size(); i++) {
Person toadd = people.get(i);

int index = 0;
while(index < sortedPersons.size() && sortedPersons.get(index).compareTo(toadd) < 0)
index++;

sortedPersons.add(index, toadd);

}

Я знаю, что for-loop равен O (n) (или это \Theta (n)?) Операция get работает в постоянное время, поэтому O (1). Но как насчет цикла while? sortedPersons.size(): O (1) sortedPersons.get(): O (1) Является ли compareTo-операция линейной? И я думаю, что добавочная операция также работает в постоянное время. Какова общая сложность кода?

спросил(а) 2012-03-07T00:57:00+04:00 8 лет, 1 месяц назад
1
Решение
53

код O (n²) Если вы рассматриваете числа и сортируете их от малого до большого.

    Если ваш вход отсортирован в обратном порядке (от большого до малого), код будет равен Θ (n). Если ваш вход уже отсортирован, этот код будет равен Θ (n²)

Код - это всего лишь вариант сортировки Insertion, он просто использует список вместо массива.

Рассмотрим этот пример для сложности:

Цифры 1 2 3 4 5, и вы хотите сортировать от малого к большому.

После первого повторения ваш список будет состоять из 1. (это происходит в o (1)), и вы не будете посещать внутренний цикл. Во второй итерации у вас есть список {1}, так как вы вставляете 2, вы будете посещать цикл while один раз, после этого вы его вставьте. Третья итерация списка {1 2} вы дважды посещаете цикл while и вставляете 3 после него. ...

В итоге у вас будет что-то вроде: 0 1 2 3 4 раза посетил внутренний цикл.

Теперь вы можете написать 1 2 3 4 5 как (5 (5 + 1))/2).

Теперь вы можете написать O (n (n + 1)/2 + n) как O (n²).

ответил(а) 2012-03-07T01:09:00+04:00 8 лет, 1 месяц назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема