Сравните и сопоставьте с Big O - PullRequest
0 голосов
/ 02 ноября 2019

Кто-нибудь может объяснить понимание сложности пространства? По вашему мнению, какая сложность (время или пространство) является более важной при разработке алгоритма?

В чем разница между O(log2N) и O(Nlog2N) ?. Я смотрел различные видео об этом, но все еще не понимаю полностью.

Ответы [ 3 ]

2 голосов
/ 03 ноября 2019

Пространство в целом - это объем пространства, необходимый для выполнения определенной задачи на вашем компьютере.

Допустим, у вас есть массив с 10 случайными элементами, и вы хотите вернуть отсортированный массив.

Есть пара способов , вы можете сделать это

1) создать новый массив и сохранить элементы в отсортированном виде и вернуть новый массив (этот подход займет дополнительное пространство , а дополнительное пространство обычно зависит от размера исходного массива)

2) Сортировать элементы массива на месте без использования дополнительного пространства / памяти (этот подход рекомендуется, так как он не требует дополнительного пространства)

Теперь подумайте о несортированном массиве, размер которого составляет Billions - есливы хотите извлечь элементы из массива в отсортированном порядке, вам не нужно создавать еще одну копию массива, размер которого указан в миллиардах, и отправлять новый отсортированный массив.

Вместо этого вы хотели бы изменить существующий массив на месте (без использования дополнительного пространства)

Большинство приложений, которые мы используем в повседневной жизни, используют на месте алгоритмы (например, быстрая сортировка), где экономится местоявляется высшим приоритетом.

Разница между O (logn) и O (n * logn)

  • Log (N) -> если вы выполняете двоичный поиск по N (например, 32)отсортированные элементы, вы найдете ваши элементы в самое большее время ( log32 ), то есть 5 , так как вы продолжаете погружать свой массив в 2 половины, пока не найдете свой элемент.

  • Однако N * Log (N) занимает -> 32 * Log (32) ~ 32 * 5, что намного больше, чем 5.

Теперь подумайте оэлементы размером миллиардов . В идеале ваша цель при написании алгоритма состоит в том, чтобы сэкономить время и пространство для выполнения определенной операции.

Журнал (1 миллиард) намного лучше, чем 1 миллиард раз Журнал (1 миллиард)

Наконец, Сложность зависит от ваших требований , но большую часть времени акцент будет сделан на сложности времени, а не на сложности пространства.

1 голос
/ 02 ноября 2019

По определению, если f и g являются положительными функциями действительного положительного x, «g есть O (f (x))» означает, что существует некоторый X и некоторый M такой, что для всех x> X: g (x) <=M * f (x) </p>

Вы можете заменить реальный x натуральным n и получить то же определение.

На практике, скажем, у вас есть какой-то массив (список, вектор) и у вас есть какое-то задание.

Допустим, массив чисел упорядочен, и вам нужно найти конкретное число. Таким образом, вы проверяете середину массива, затем сравниваете полученное число с числом, которое вам нужно найти, и проверяете среднюю или верхнюю половину массива или нижнюю половину. Затем вы продолжите, пока не найдете номер доказать, что нет такого числа. Количество попыток будет закрыто до log2 (n), поэтому вы можете сказать, что время O (log N), потому что O (log2 N) одинаково.

Если вы просматриваете номер массива по номеру,Вы должны проверить все элементы, и время будет O (n). Допустим, у вас есть миллион элементов. Затем в бинарном поиске вам нужно около 20 проверок, в полном цикле - миллион. Вот почему разница между O (log N) и O (N) является критической.

Другой пример, вам нужно упорядочить (отсортировать) массив. Вы можете найти минимальный элемент, проверив все элементы. Затем вы находите второй минимум, проверяя все ожидаемое первое, затем продолжаете, пока не получите самый большой элемент. Число вычислений равно n + (n - 1) + ... + 2 + 1 = n (n + 1) / 2, что равно O (n ^ 2).

Вы также можете использовать алгоритм быстрой сортировкигде вы комбинируете бинарный поиск и полный цикл по всем элементам. В этом случае время будет O (n * log n)

Теперь предположим, что у вас есть миллион элементов в массиве. Если вы используете первый подход для сортировки массива, время будет закрыто до (10 ^ 6) ^ 2 = 10 ^ 12 = 1 000 000 000 000 операций (фактическое число будет меньше, но учитывается только мощность). Второй подход даст результат в 10 ^ 6 * log (10 ^ 6), который составляет около 10 ^ 6 * 10 = 10 000 000 (также фактическое число будет 20 000 000, мы не учитываем его при проверке big-O). Смотрите разницу.

Та же проблема с пробелом. Допустим, вам нужно что-то сделать с входными значениями пользователя (входного файла), и у вас нет выбора, кроме как сохранить все значения в памяти. В этом случае вам понадобится O (n) памяти. Однако, если вы найдете решение не слишком хранить все значения в памяти, а только текущее входное значение и, возможно, некоторые другие технические переменные, вы скажете, что вам нужно O (1) памяти. Просто сравните миллион байтов с несколькими байтами, чтобы увидеть, насколько это важно.

Примером задачи, где вам не нужен полный массив, являются последние 2 цифры продукта для всех значений, указанных во входном файле. Вам не нужно резервировать память для полного списка значений.

0 голосов
/ 02 ноября 2019

С N=1000000, Lg(N)=19.93... и N.Lg(N)=19931568.57... Видите разницу?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...