Сколько времени потребуется для сортировки 10610610^6 чисел и 10910910^9 чисел для двух алгоритмов, если они занимают одинаковое время для сортировки 100010001000 чисел?

Вопрос Нам дано два алгоритма сортировки. Время работы алгоритма 1 является О ( н 2 ) в то время как Алгоритм 2 имеет время работы О ( н л о г ( н ) ) . Предположим, что алгоритм 1 и алгоритм 2 брать 1 второй, чтобы разобраться 1000 числа. Сколько времени потребуется для каждого алгоритма, чтобы отсортировать а) 10 6 числа б) 10 9 числа?

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

Ответы (3)

Как говорится, ответ «мы не знаем». Это следует из О ( ) обозначение — грубо говоря, у вас недостаточно информации, чтобы сделать вывод. Вы знаете только асимптотическое поведение, и даже не константы.

Алгоритм 1 вполне может быть таким же быстрым, как алгоритм 2, если н меньше, чем, скажем, 10 10 , а потом разорваться.

Хуже того, нотация «большое О» — это только верхняя граница. Насколько нам известно, оба могут иметь одинаковое время работы О ( н бревно н ) , так как если бы алгоритм 1 имел время работы О ( н бревно н ) , это также тривиально имело бы время работы О ( н 2 ) .

Вы видели два ответа, которые иллюстрируют, что оценки времени по принципу «О» мало что говорят о фактическом времени работы, но чтобы проиллюстрировать, насколько велика разница между фактическими заказами, давайте обойдемся без оценок по принципу «О» и предположим, что мы действительно знали что Алгоритм 1 взял именно с 1 н 2 секунд для сортировки н чисел, а Алгоритм 2 взял ровно с 2 н бревно 10 н секунд для сортировки н числа (я выбрал логарифм по основанию десять, чтобы упростить расчеты; выбор другого основания только изменил бы константу с 2 ).

Если Алгоритму 2 потребовалась 1 секунда для сортировки 10 3 числа, мы бы

1 "=" с 1 ( 10 3 ) 2 "=" с 1 10 6
так с 1 "=" 1 / 10 6 . Если алгоритму 2 также потребовалась 1 секунда для сортировки 10 3 числа, мы бы
1 "=" с 2 ( 10 3 бревно ( 10 3 ) ) "=" с 2 ( 3 10 3 )
так с 2 "=" 1 / ( 3 10 3 ) .

Теперь давайте посмотрим, что происходит, когда мы сортируем 10 6 числа. Алгоритм 1 примет

1 10 6 ( 10 6 ) 2 "=" 10 12 10 6 "=" 10 6  секунды
что получается примерно 11,5 дней. С другой стороны, алгоритм 2 примет
1 3 10 3 ( 10 6 бревно 10 6 ) "=" 6 10 6 3 10 3 "=" 2 10 3  секунды
что о 33,3 минут. Хм, 11 дней против получаса. Я знаю, какой алгоритм я бы использовал.

Для больших входных данных разница во времени становится еще более существенной. С 10 9 чисел для сортировки, вы можете понять, что алгоритм 1 займет около 31688 лет , а алгоритм 2 — около 34,7 дней.

Обратите внимание, что алгоритм 1 имел гораздо меньший постоянный множитель, чем алгоритм 2, но в долгосрочной перспективе это не имело такого значения, как асимптотический порядок их времени выполнения. Проще говоря, н бревно н Алгоритм в конечном итоге забьет н 2 алгоритм, независимо от того, каков постоянный кратный.

Математически, большой- О нотация так не работает. О ( н 2 ) обозначает класс эквивалентности функций, основанный на их амиптотике.

Так, например, ф определяется ф ( н ) "=" н 2 принадлежит О ( н 2 ) . Так и функция г определяется г ( н ) "=" 10 1000 н 2 .

Итак, два разных алгоритма, которые требуют времени О ( н 2 ) могут иметь совершенно разную производительность для конкретной задачи. Большой- О нотация предназначена для того, чтобы зафиксировать эту масштабируемость этих алгоритмов как н .


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

Таким образом, мы можем приблизиться к тому, что О ( н 2 ) алгоритм займет время ( 10 6 ) 2 "=" 10 12 обрабатывать 10 6 предметы и О ( н бревно н ) алгоритм займет время 10 9 бревно 10 9 2 × 10 10 обрабатывать 10 9 предметы.

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

Точно. Чтобы довести это до крайности, даже все практические реализации алгоритмов на компьютерах можно считать O (1) (с большой константой впереди). Очевидно, это связано с тем, что существует только конечное количество возможностей для входных данных (конечный объем памяти и конечное количество машинных номеров).