2014-10-16 6 views
2

Я пытался понять это весь день. Некоторые другие темы обращаются к этому, но я действительно не понимаю ответов. Есть также много ответов, которые противоречат друг другу.Как может худший случай для алгоритма иметь разные границы?

Я понимаю, что алгоритм никогда не займет больше времени, чем верхняя граница, и никогда не будет быстрее нижней границы. Тем не менее, я не знал, что верхняя граница существовала для наилучшего случая, а нижняя граница существовала для наихудшего временного времени. This question really threw me in a loop. Я не могу обмотать голову вокруг этого ... заданное время выполнения может иметь другую верхнюю и нижнюю границу?

Например, если кто-то спросил: «Покажите, что наихудшее время работы какого-либо алгоритма на куче размера n - Big Omega (lg (n))». Как вы можете получить нижнюю границу, какую-либо оценку в этом случае, когда дается время выполнения?

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

ответ

0

Мягкой принятый нами ответ на этот вопрос является функция, чье время работы колеблется между n^2 и n^3 в зависимости от того, является ли n нечетным. То, что я пытался сделать, состоит в том, что иногда границы формы O (n^k) и Omega (n^k) не являются достаточно описательными, хотя наихудшее время работы - это прекрасно определенная функция (которая, как и все функции, - это его лучшая нижняя и верхняя граница). Это происходит с более естественными функциями, такими как n log n, что является Omega (n^k), но не O (n^k) для k ≤ 1 и O (n^k), но не Omega (n^k) при k> 1 (и, следовательно, не Theta (n^k), независимо от того, как мы выбираем константу k).

+0

Это был не столько ваш ответ. Я до сих пор не знаю, как вы могли бы иметь алгоритм с наихудшей верхней границей O (n^3) и худшую нижнюю границу Ω (n^2). – biggunslenet

+0

@sdeastcott Это также O (n^4) и O (n^5) и Omega (n^1.5) и ... У нас просто нет функции, чтобы получить оценку Theta. –

0

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

Однако, если у вас есть что-то вроде O(N) или O(log(N)), они будут выполняться с разной скоростью в зависимости от входных данных.

Верхняя и нижняя границы описывают наибольшие и наименьшие итерации, соответственно, которые может принимать алгоритм.

Пример: O(N), верхняя граница - самые большие входные данные, а нижняя граница - самая маленькая.

Дополнительные источники: Big O Cheat Sheet и MIT Lecture Notes

UPDATE: Глядя на переполнения стека вопрос, упомянутой выше, что алгоритм разбит на три части, где она имеет 3 возможных типов исполнения, в зависимости от данных. На самом деле это три разных алгоритма, предназначенных для обработки разных значений данных. Алгоритм, как правило, классифицируются только с одной записи эффективности и именно обозначений, принимая наименьшее количество времени для всех возможных значений N.

В случае O (N^2), большие данные будут иметь экспоненциально дольше, и меньшее число будет действовать быстро. Алгоритм определяет, как быстро будет запущен набор данных, но границы даны в зависимости от диапазона данных, которые алгоритм предназначен для обработки.

+0

Итак, чтобы уточнить: ваш пример говорит о том, что верхняя граница O (N) представляет собой то, насколько большой N может быть и поддерживает O (N) время выполнения, а нижняя граница - это наименьший размер N, который будет иметь O (N) времени выполнения? Все еще не очень уверен. – biggunslenet

+0

О (N) представляет лучший или худший случай? – biggunslenet

+0

См. Edit, алгоритм обычно классифицируется по одной нотации времени исполнения, и вы можете иметь лучшие или худшие оценки, которые являются разными алгоритмами для разных значений данных, что дает тот же результат. – apoorvk

0

Предположим, вы пишете программу, как это, чтобы найти наименьший простой множитель целого числа:

function lpf(n): 
    for i = 2 to n 
    if n%i == 0 then return i 

Если запустить функцию на число 10^11 + 3, он будет принимать 10^11 + 2 шаги. Если вы запустите его на номер 10^11 + 4, это займет всего один шаг. Таким образом, наилучшее время работы функции - это шаги O (1), а в худшем случае - шаги O (n).

+0

Хорошо, я думаю, что понял. Вы знаете простой пример, когда лучшее время для случая будет иметь другую верхнюю и нижнюю границу? Или в худшем случае. – biggunslenet

0

Я попытаюсь объяснить это в алгоритме быстрой сортировки. В quicksort у вас есть массив и выберите элемент как ось вращения. Следующим шагом будет разбиение входного массива на два массива. Первый будет содержать элементы < pivot и второй элемент> pivot. Теперь предположим, что вы примените quicksort в уже отсортированном списке, а элемент pivot всегда будет последним элементом массива. Результатом раздела будет массив размером n-1 и массив размером 1 (элемент поворота). Это приведет к времени выполнения O (n * n). Теперь предположим, что элемент pivot всегда будет разбивать массив на два массива равного размера. На каждом шаге размер массива будет разрезан пополам. Это приведет к O (n log n). Я надеюсь, что этот пример сделает это немного понятнее для вас. Другим известным алгоритмом сортировки является mergesort. У Mergesort всегда есть время O (n log n). В mergesort вы сократите массив до тех пор, пока не останется только один элемент, и не поднимет стек вызовов, чтобы объединить массивы одного размера, и после этого объедините массив размером два и так далее.

0

Предположим, вы реализуете набор с использованием массива. Чтобы вставить элемент, вы просто помещаете в следующий доступный ковш. Если нет свободного ведра, вы увеличиваете емкость массива на значение m.

Для алгоритма вставки «не хватает места» это худший случай.

insert (S, e) 
    if size(S) >= capacity(S) 
    reserve(S, size(S) + m) 
    put(S,e) 

Предположим, мы никогда не удаляем элементы. Сохраняя следы последней доступной позиции, put, size и capacity являются Θ(1) в пространстве и в памяти.

Что относительно reserve? Если он реализован как [realloc in C] [1], в лучшем случае вы просто выделяете новую память в конце существующей памяти (лучший вариант для резерва), или вам нужно также перемещать все существующие элементы (худший случай для резерва).

  • худшего случай нижней границы для insert лучшего случай reserve(), который является линейным в m если мы не придираться. insert в наихудший случай Ω(m) в пространстве и времени.
  • худшего случая верхней границей для insert является хуже случаем reserve(), который является линейным в m+n. insert в худшем случае O(m+n) в пространстве и времени.

 Смежные вопросы

  • Нет связанных вопросов^_^