Какова временная сложность алгоритма Евклида (верхняя граница, нижняя граница и среднее значение)?

Я искал его в Интернете на многих сайтах, но ни один не дал четкого ответа. Все они дают много сложных математических вещей, которые мне не только трудно понять, но и не имеют значения, поскольку я просто хочу знать, какова верхняя граница (наихудшая сложность), нижняя граница и средняя временная сложность алгоритма Евклида. Вот то, что я собрал с множества сайтов, ни один не говорит одно и то же:

Найти НОД ( а , б ) , с б < а , и б количество цифр час :

  • Некоторые говорят, что временная сложность О ( час 2 )

  • Некоторые говорят, что временная сложность О ( бревно а + бревно б ) (при условии бревно 2 )

  • Другие говорят, что временная сложность О ( бревно а бревно б )

  • Один даже говорит: «По теореме Ламе вы найдете первое число Фибоначчи, большее, чем b. Если оно Ф [ к + 1 ] их меньше, чем к рекурсивные вызовы. Таким образом, это О ( бревно б ) "

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

Я был бы очень признателен, если бы вы окончательно уладили все это, дав мне прямые и ясные ответы на следующее:

  1. Какова временная сложность (верхняя граница) алгоритма Евклида в наихудшем случае?

  2. Какова средняя временная сложность алгоритма Евклида?

  3. Какова нижняя граница алгоритма Евклида (в лучшем случае) и когда это происходит?

Вы даже не представляете, как мне поможет ваш ответ. Я очень подавлен, так как увяз в том, что можно считать довольно простым алгоритмом. Спасибо.

Что вы имеете в виду под средним? Ты имеешь ввиду а , б случайный ниже некоторой границы н , а фиксированный и б ниже а 1 или что-то другое? Это неясно из контекста, и нет стандартного определения. я думаю в лучшем случае а или б равно 0 .
Что ж, я использовал термин «средний случай», так как он обычно используется для таких алгоритмов, как сортировка, поиск... Знаете... Будет одинаково мило с вашей стороны, если вы расскажете мне в двух словах о каждом из этих двух случаев, которые вы упомянули. В противном случае оставьте «Средний случай» и, пожалуйста, расскажите мне только о верхней и нижней границах. дня.
@Ivy: Ганс задал очень точный вопрос и правильно указал, что стандартного определения не существует, поэтому ссылка на то, как термин «обычно используется», бесполезна. В приведенных вами примерах (сортировка, поиск) обычно имеется очевидная четко определенная интерпретация «среднего», а именно то, что элементы для сортировки/вставки/искания появляются в порядке, равномерно выбранном случайным образом из всех возможных перестановок. Здесь нет такой очевидной интерпретации.
Недостаток знаний не позволяет мне ответить на этот вопрос. Но я знаю, что анализ сложности — деликатная тема, и нужно быть очень осторожным, задавая вопросы и отвечая на них.
Если такой парень, как ты, говорит: «Мне не хватает знаний...», то мне интересно, на каком месте стоит такой парень, как я!! LOL. Я уверен, что не знаю даже доли того, что ты знаешь об этих вещах. Что ж, рад, что вы сказали, что «анализ сложности — деликатная тема». Это помогает мне чувствовать себя лучше, поскольку я борюсь и отстаю в этой теме. все. Но зачем беспокоиться, с такими форумами никто не одинок .... есть умные люди, чтобы помочь таким борцам, как я!!
Чтобы расширить информацию здесь, отличным ресурсом является ... en.wikipedia.org/wiki/…
Для будущих читателей: лучший ресурс, который я когда-либо видел по этому вопросу, находится в AOCP Кнута, том 2 (главы 4.5.1-4.5.3).
Есть статья Йонассена и Кнута «Простой алгоритм, анализ которого невозможен» , Journal of Computer and System Sciences 16:3 (июнь 1978 г.), стр. 301–322. Не будьте слишком строги к себе.

Ответы (2)

Чтобы решить некоторые предварительные вопросы, позвольте Т ( а , б ) — количество шагов, предпринятых в алгоритме Евклида, который многократно оценивает НОД ( а , б ) "=" НОД ( б , а мод б ) до б "=" 0 , предполагая а б . Кроме того, пусть час "=" бревно 10 б быть количеством цифр в б (дай или возьми). (Заметим, что в этих расчетах при подсчете шагов мы игнорируем вопрос о временной сложности м о г функция. Если мы предположим, что это О ( 1 ) , то все нижеследующее относится и к временной сложности алгоритма.

  1. В худшем случае, как вы сказали, а "=" Ф н + 1 и б "=" Ф н , где Ф н это последовательность Фибоначчи, так как она будет вычислять НОД ( Ф н + 1 , Ф н ) "=" НОД ( Ф н , Ф н 1 ) пока не дойдет до н "=" 0 , так Т ( Ф н + 1 , Ф н ) "=" Θ ( н ) и Т ( а , Ф н ) "=" О ( н ) . С Ф н "=" Θ ( ф н ) , это означает, что Т ( а , б ) "=" О ( бревно ф б ) . Обратите внимание, что час л о г 10 б и бревно б Икс "=" бревно Икс бревно б подразумевает бревно б Икс "=" О ( бревно Икс ) для любого а , поэтому наихудшим случаем для алгоритма Евклида является О ( бревно ф б ) "=" О ( час ) "=" О ( бревно б ) .

  2. Средний случай требует немного больше внимания, так как он зависит от вероятностной ситуации. Для того, чтобы точно рассчитать его, нам нужно распределение вероятностей. Если а фиксируется и б выбирается равномерно из Z [ 0 , а ) , то количество шагов Т ( а ) является

    Т ( а ) "=" 1 2 + 6 бревно 2 π ( 4 γ 24 π 2 ζ ( 2 ) + 3 бревно 2 2 ) + 12 π 2 бревно 2 бревно а + О ( а 1 / 6 + ϵ ) ,

    или, для меньшей точности, Т ( а ) "=" 12 π 2 бревно 2 бревно а + О ( 1 ) . (Источник: Википедия)

  3. В лучшем случае, а "=" б или б "=" 0 или какой-либо другой удобный случай, подобный этому, поэтому алгоритм завершается за один шаг. Таким образом, Т ( а , а ) "=" О ( 1 ) .

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

(Это подчеркивает разницу между нотацией «большой О» математика и нотации «большой О» программиста: в первом случае вы хотите, чтобы оценка была истинной. н , даже те н которые настолько абсурдно велики, что никто никогда не сможет их записать или сохранить в памяти, тогда как во втором случае программистов в первую очередь интересуют н е [ 0 , 2 64 ] , и это либеральная оценка. Для них важнее увидеть «ведущий вклад» во временную сложность, а для алгоритма Евклида меньшее число определяет сложность вычислений в целом.)

Вы считаете шаги? Я думаю, что он просит «общую» сложность, что бы это ни значило.
Спасибо, спасибо, Марио!! Вы ответили на то, что я хотел знать, в пронумерованном формате. Но у меня есть только одна небольшая путаница по поводу вашего ответа. В 1) вы говорите, что Fn — это последовательность Фибоначчи, а затем вы говорите, что Fn = Θ (фн). Как последовательность может быть приравнена к сложности? Вы хотите сказать, что какая-то конкретная операция над последовательностью Фибоначчи есть Θ(φn). Если да, то какую операцию вы имеете в виду, то есть Θ(φn)? Пожалуйста, уточните это. мое форматирование.... если возможно дайте мне ссылку, где я могу узнать код разметки для форматирования вопросов/ответов на этом форуме. Я ничего об этом не знаю)
Он оценивает размер Ф н с ф н .
О, спасибо, Ганс. Кстати, что вы имели в виду по поводу «общей» сложности? Что именно вы имеете в виду? В контексте алгоритма Евклида мы обычно имеем в виду количество шагов, не так ли?
Я имею в виду, насколько дорог один шаг? Количество шагов зависит только от б . Но общая сложность должна включать а так как вы должны что-то сделать с а . Если допустить сколь угодно большое а и б вы не воспринимаете работу мода как постоянную. Следовательно, вы получите общую сложность, включающую бревно а и бревно б . Но не поймите меня неправильно. Я думаю, что ответ Марио превосходен.
Что ж, пожалуйста, предоставьте полный ответ, а затем Ганс, потому что теперь я действительно запутался. Некоторые сайты действительно дали сложность с точки зрения a и b. Некоторые говорят O (loga.logb), а другие говорят O (loga + logb) .Какой из них правильный?Будем надеяться, что Марио что-то скажет об этом.Кроме того, не могли бы вы объяснить, почему «для сколь угодно больших a и b вы не принимаете операцию мода как постоянную». Повторяю, пожалуйста, объясните, почему так.И Ганс , что касается стоимости одного шага, википедия говорит, что она равна h, количеству цифр в b, меньшему числу. Отсюда верхняя граница O (h ^ 2) .. согласно википедии.
Математическое определение нотации большого O дается с точки зрения скорости роста функций, а не фактического времени, необходимого для выполнения операций. Когда я говорю Ф н "=" Ом ( ф н ) , Я имею в виду, что Ф н А ф н для некоторых А , и достаточно большой н . @HansGiebenrath, это правда, что я игнорирую временную сложность мода и говорю об этом в начале. Если вы этого не сделаете, и а б , то поскольку действие мода зависит от каждой цифры в а в худшем случае вы получите О ( бревно а ) на первый шаг и О ( 1 ) для других, так что вы получите О ( бревно а + бревно б ) , но константа намного меньше на а .
Марио, должен ли я заключить, что все те сайты, которые говорили о таких вещах, как O(loga.logb), абсурдны? Что-то вроде O(loga.logb) полностью абсурдно в этом контексте? И, наконец, поскольку вы затронули временную сложность мод здесь, я должен вбить себе в голову для моего экзамена, что если учитывать как количество шагов, так и временную сложность работы мода (каждого шага), то сложность будет O (loga + logb)? Будет ли это ваше редактирование более подходит, чем O (logb) в «1)», если мы также примем во внимание временную сложность мода? Пожалуйста, ответьте на этот вопрос, приятель.
Извините, моя ошибка, вам нужно разделить a на b на этом первом шаге, поэтому вклад на самом деле О ( бревно а бревно б ) и вы получаете О ( бревно а бревно б ) , нет О ( бревно а + бревно б ) для полного расчета. Подводя итог, временная сложность О ( бревно а бревно б ) с учетом мода и О ( бревно б ) если вы считаете шаги.
Спасибо, что разъяснили все это, Марио. Я рад, что присоединился к этому математическому форуму, несмотря на первоначальные опасения, что мои элементарные вопросы будут высмеяны и останутся без ответа...... Подождите, подождите... Я снова что-то пропустил. Какой первый шаг? Вы имеете в виду, когда сказали: «Вы должны разделить a на b на этом первом шаге»? Пожалуйста, укажите это для меня, так как я не хочу заучивать эту формулу наизусть после всего этого анализа. Как мы получаем O (logalogb) из О(лога+логб)?
Что я имею в виду, Марио, так это: Разделив a на b в O (loga + logb), мы не получим O (loga-logb + logb) или O (loga)? Как мы получим O (logalogb)?
Спасибо за усилия, Марио. @IvyMike: на каждом шаге вы делите числа, которые ограничены а . Таким образом, каждое подразделение находится в О ( бревно а ) . Поскольку есть О ( бревно б ) подразделения, у нас есть О ( бревно а бревно б ) .
@HansGiebenrath На самом деле временная сложность деления или модуля равна О ( бревно а бревно б ) (или О ( бревно 2 а ) с а б ), так что наивная оценка на самом деле О ( бревно а бревно 2 б ) . Есть немного сложная причина, связанная со скоростью, с которой числа уменьшаются, что объясняет, почему общая временная сложность О ( бревно а бревно б ) по всем шагам. Доказательство см. на стр. 94 сайта shoup.net/ntb/ntb-v2.pdf .
@MarioCarneiro Плохо. Вы конечно правы. Я всегда думаю в терминах «мягкого»-О, игнорируя все логарифмические факторы. Тогда с помощью алгоритма деления Шёнхаге-Штрассена всего лишь О ~ ( бревно а ) . А так же спасибо за ссылку. Эта книга выглядит очень красиво.

время выполнения является линейным в представлении большего числа: если а б тогда время выполнения О ( бревно ( а ) )

Предполагая, что операции mod и div могут выполняться за O (1), если mod и div могут выполняться за O (log (a)) время, тогда время выполнения алгоритма составляет O (log ^ 2 (a))