Как судить относительную эффективность алгоритмов, данных время выполнения как функции 'n'?

Рассмотрите два алгоритма, A, и B. Эти алгоритмы и решают ту же проблему и имеют сложности времени (с точки зрения количества элементарных операций, которые они выполняют), данный соответственно

a) (n) = 9n+6

b) (n) = 2(n^2)+1

(i) Какой алгоритм является лучшим асимптотически?

(ii) Который является лучшим для небольших входных размеров n, и для того, какие значения n имеет место это? (Можно принять в случае необходимости это n> 0.)

Я думаю, что это - A.Я прав?

И каков ответ для части B? Что точно они хотят?

6
задан Bill the Lizard 18 September 2012 в 17:06
поделиться

11 ответов

Я думаю, что построение этих функций было бы очень полезно для понимания того, что происходит.

7
ответ дан 8 December 2019 в 04:29
поделиться

Простое графическое программное обеспечение покажет, что 9n + 6 будет работать лучше довольно быстро. как и простая алгебра. В подходах из 5 и более подходов 9n + 6 будет быстрее.

1
ответ дан 8 December 2019 в 04:29
поделиться

Посмотрев на константы, легко увидеть, что вначале a будет больше, чем b. Глядя на вхождения n (n в a, n ^ 2 в b), вы можете увидеть, что b асимптотически больше. Таким образом, нам нужно только выяснить, из какой точки b больше, чем a. Для этого нам просто нужно решить уравнение a (n) = b (n) относительно n.

1
ответ дан 8 December 2019 в 04:29
поделиться

Я бы запустил алгоритм несколько раз для описанных вами случаев (и на компьютерах с разными процессорами) и узнал время начала и время окончания. Затем посмотрите на разницу их времени для каждого из ваших случаев.

0
ответ дан 8 December 2019 в 04:29
поделиться

9n + 6 - лучший вариант.

Возьмем этот пример, если ваше n равно 10, тогда

9n + 6 = 96 2 (n ^ 2) + 1 = 201

, возьмем, что n равно 100

9n + 6 = 906 2 (n ^ 2) + 1 = 20001

и это продолжается и продолжается ...

если n = 4, то

9n + 6 = 40 {{1 }} 2 (n ^ 2) + 1 = 33

Заключение, второй вариант лучше, если n <= 4, но хуже, если 5 или больше.

Кстати, при вычислении сложности алгоритма мы обычно опускаем коэффициент и константы, потому что они не сильно влияют на разницу в скорости, поэтому его следует упростить как a (n) = n и b (n) = n ^ 2, что дает вам четкий ответ.

1
ответ дан 8 December 2019 в 04:29
поделиться

это очевидно, если у нас есть: * 9n + 6 => n: 5 => 9 * 5 + 6 = 45 + 6 = 51 * 2 (n ^ 2) +1 => n: 5 => 2 (5 * 5) +1 = 2 * 25 + 1 = 50 + 1 = 51 , затем 9n + 6 намного лучше.

0
ответ дан 8 December 2019 в 04:29
поделиться

Какой алгоритм является лучшим асимптотически?

Чтобы ответить на этот вопрос, вам просто нужно взглянуть на экспоненты n в обеих функциях: Асимптотически n 2 будет расти быстрее, чем n . Таким образом, A ∈ O ( n ) асимптотически лучший выбор, чем B ∈ O ( n 2 ).

Что лучше всего для небольших входных данных n , и для каких значений n это так? (При необходимости вы можете предположить, что n > 0.)

Чтобы ответить на этот вопрос, вам нужно найти точку пересечения, в которой обе функции имеют одинаковое значение. А для n = 5 обе функции вычисляют 51 (см. 9n + 6 = 2 (n ^ 2) +1 в Wolfram Alpha ). А поскольку A (4) = 42 и B (4) = 33, B - лучший выбор для n <5.

13
ответ дан 8 December 2019 в 04:29
поделиться

Асимптотически O (n) лучше (дешевле), чем O (n ^ 2).

Для малых значений n это простая задача алгебры:

Найдите n, для которого 9n + 6 = 2 (n ^ 2) +1 : очистив его, мы получим уравнение 2-го класса 2 (n ^ 2) -9n-5 = 0 . Это дает n = 5, что означает, что для n = 5 оба процесса будут иметь одинаковую стоимость:

  • 9n + 6 => n: 5 => 9 * 5 + 6 = 45 + 6 = 51
  • 2 (n ^ 2) +1 => n: 5 => 2 (5 * 5) +1 = 2 * 25 + 1 = 50 + 1 = 51

Это означает, что B лучше для n <5, они равны при n = 5, а A лучше при n> 5. Если вы ожидаете, что n будет меньше 5 в подавляющем большинстве случаев, тогда B может быть лучшим выбором, но это будет актуально только в том случае, если алгоритм используется много . Если вы реализуете его как функцию, незначительные преимущества B бледнеют по сравнению с накладными расходами на вызовы, поэтому они не будут незаметными.

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

1
ответ дан 8 December 2019 в 04:29
поделиться

Вам, вероятно, следует начать с ознакомления с асимптотикой, обозначением большой буквы O и т.п. Асимптотически будет лучше. Почему? Поскольку можно доказать, что для достаточно большого N, a (n) N.

Доказательство оставлено в качестве упражнения для читателя.

1
ответ дан 8 December 2019 в 04:29
поделиться

Асимптотически, a(n) лучше, поскольку это O(n) в отличие от O(n2). Вот график времени работы как функции от n. Как видите, a(n) работает медленнее только при малых значениях n.

0
ответ дан 8 December 2019 в 04:29
поделиться

Ответ на первую часть, очевидно, (а), потому что O (n * n)> O (n).

Ответ на вторую часть состоит в том, что вы не можете сказать: «Что лучше всего для небольших входных данных», потому что вы не даете информации ни о том, что такое «элементарные операции» в каждом случае, ни о том, сколько времени занимает каждая из этих операций. Компилятор или ЦП могут применить некоторую оптимизацию, которая заставляет так называемый более медленный алгоритм работать НАМНОГО быстрее, чем «лучший» алгоритм при небольших размерах входных данных.

И под «маленькими» размерами ввода, которые могут означать 10, 100 или 1 миллион +! Переход между умным алгоритмом O (n) и глупым алгоритмом O (n * n) может быть огромным, потому что компиляторы и процессоры отлично справляются с очень быстрым запуском немого кода.

Многие люди совершают ошибку, «оптимизируя» свой код на основе O (), не учитывая размер входных данных и не проверяя, насколько хорошо каждый из них работает с наборами данных, которые они будут использовать.

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

0
ответ дан 8 December 2019 в 04:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: