Время выполнения LinkedList строки 5 в методе shuffle

#java #algorithm #data-structures #linked-list #runtime

#java #алгоритм #структуры данных #связанный список #время выполнения

Вопрос:

Интересно, каково время выполнения строки list.set(i, list.get(j)); в нотации big O. Это O (n ^ 2) или O (2n). Связанный список имеет большую временную сложность O (n) для метода get и O (n) для метода set в java.

 public <T> void shuffle(LinkedList<T> list){               //(1)
     for(int i =0; i < list.size(); i  ){                  //(2)
          for (int j = i   1; j < list.size(); j  ){       //(3)
                T temp = list.get(i);                      //(4)
                list.set(i, list.get(j));                  //(5)
                list.set(j, temp);                         //(6)
 

Я знаю, что внешний цикл выполняется n раз, внутренний цикл выполняется n-1 раз. Я знаю, что когда у вас есть вложенные циклы, вы их умножаете (я пришел к выводу, что из правила произведения из дискретной математики, поскольку циклы независимы друг от друга). Теперь правило суммы из дискретной математики сказало мне, что есть «A способов сделать что-то и B способов сделать что-то другое, и мы не можем делать оба одновременно, тогда есть A B способов выбрать одно из действий».

Однако я не уверен, что то, что происходит в строке 5 для методов get() и set(), можно считать независимым или просто не происходит одновременно.

Другими словами, является ли время выполнения строки 5 O (n ^ 2) или O (2n) = O (n n)?

Ответ №1:

Это O (n) .

Во-первых, O (2n) и O (n) одинаковы. Необычно писать O (2n), но это не является неправильным.

Код в строке 5 вызывает функцию get один раз. Третья функция получает значение. В момент времени O(n) он получает значение j-го элемента. После этого он вызывает set один раз, и с помощью этой функции, во время O(n), он устанавливает значение i-го элемента.

Таким образом, его сложность заключается в

2O(n) = O(n).

И если я могу предположить, ваш алгоритм имеет сложность O (n ^ 3). Вы могли бы сделать это в O(n ^ 2), если вы используете операции next и prev на итераторе вместо итерации целых чисел i и j.