Вы хотите знать все, что нужно знать о большой О? Я тоже.
Итак, чтобы говорить о большом О, я буду использовать слова, в которых есть только один удар. Один звук на слово. Маленькие слова быстрые. Вы знаете эти слова, и я тоже. Мы будем использовать слова с одним звуком. Они маленькие. Я уверен, что вы будете знать все слова, которые мы будем использовать!
Теперь давайте поговорим о работе. Большую часть времени я не люблю работать. Тебе нравится работать? Это может быть тот случай, когда вы это делаете, но я уверен, что нет.
Я не люблю ходить на работу. Я не люблю проводить время на работе. Если бы у меня был свой путь, я бы просто хотел играть и делать забавные вещи. Ты чувствуешь то же самое, что и я?
Теперь время от времени я должен идти на работу. Это грустно, но верно. Поэтому, когда я на работе, у меня есть правило: я стараюсь выполнять меньше работы. Так близко к работе, как я могу. Тогда я иду играть!
Итак, вот большая новость: большой О может помочь мне не выполнять работу! Я могу играть больше времени, если я знаю большой О. Меньше работы, больше игры! Это то, что мне помогает большой О.
Теперь у меня есть работа. У меня есть этот список: один, два, три, четыре, пять, шесть. Я должен добавить все вещи в этом списке.
Ух ты, я ненавижу работу. Ну да ладно, я должен это сделать. Итак, я иду.
Один плюс два - это три ... плюс три - это шесть ... и четыре - это ... Я не знаю. Я потерялся. Это слишком сложно для меня сделать в моей голове. Меня не очень заботит такая работа.
Так что давайте не будем делать эту работу. Давай ты и я просто подумаем, как это тяжело. Сколько работы мне нужно сделать, чтобы добавить шесть цифр?
Хорошо, давайте посмотрим. Я должен добавить одно и два, а затем добавить это к трем, а затем добавить это к четырем ... В общем, я считаю шесть добавлений. Мне нужно сделать шесть добавок, чтобы решить эту проблему.
А вот и большой O, чтобы сказать нам, насколько сложна эта математика.
Большой О говорит: мы должны сделать шесть добавок, чтобы решить эту проблему. Одно добавление, для каждой вещи от одного до шести. Шесть маленьких кусочков работы ... каждый кусочек работы - это одно прибавление.
Ну, я не буду делать работу, чтобы добавить их сейчас. Но я знаю, как это будет сложно. Было бы шесть добавлений.
О нет, теперь у меня есть больше работы. Sheesh. Кто делает такие вещи?!
Теперь они просят меня прибавить от одного до десяти! Зачем мне это делать? Я не хотел добавлять один к шести. Добавить от одного до десяти ... ну ... это было бы еще сложнее!
Насколько сложнее это будет? Сколько еще работы мне нужно сделать? Нужно ли больше или меньше шагов?
Ну, я думаю, мне пришлось бы сделать десять добавлений ... по одному на каждую вещь от одного до десяти. Десять больше шести. Мне пришлось бы работать намного больше, чтобы добавить от одного до десяти, чем от одного до шести!
Я не хочу добавлять прямо сейчас. Я просто хочу подумать о том, как трудно это добавить. И, надеюсь, играть как можно скорее.
Чтобы добавить от одного до шести, это какая-то работа. Но вы видите, добавить от одного до десяти, это больше работы?
Большой О - твой друг и мой. Big O помогает нам думать о том, сколько работы мы должны сделать, чтобы мы могли планировать. И, если мы дружим с большим О, он может помочь нам выбрать работу, которая не так сложна!
Теперь мы должны сделать новую работу. О нет. Мне вообще не нравится эта работа.
Новая работа: добавьте все вещи от одного к n.
Подождите! Что это? Я пропустил это? Как я могу добавить от одного к n, если вы не скажете мне, что такое n?
Ну, я не знаю, что это такое. Мне не сказали. Были ли вы? Нет? Ну что ж. Так что мы не можем делать работу. Уф.
Но хотя мы не будем сейчас делать работу, мы можем догадаться, насколько это будет сложно, если бы мы знали n. Мы должны были бы сложить n вещей, верно? Конечно!
Теперь вот большой О, и он скажет нам, как тяжела эта работа. Он говорит: добавить все от одного к N, один за другим, есть O (n). Чтобы добавить все эти вещи, [я знаю, я должен добавить n раз.] [1] Это большой O! Он говорит нам, как трудно выполнять какую-то работу.
Для меня, я думаю о биО, как большой, медленный, босс. Он думает о работе, но он этого не делает. Он может сказать: «Эта работа быстрая». Или он может сказать: «Эта работа такая медленная и тяжелая!» Но он не делает работу. Он просто смотрит на работу, а затем говорит нам, сколько времени это может занять.
Я забочусь о большом О. Почему? Я не люблю работать! Никто не любит работать. Вот почему мы все любим большой O! Он говорит нам, как быстро мы можем работать. Он помогает нам подумать о том, как тяжелая работа.
Э-э, больше работы. Теперь давайте не будем делать работу. Но давайте составим план, шаг за шагом.
Они дали нам колоду из десяти карт. Они все перепутаны: семь, четыре, два, шесть ... совсем не прямые. А теперь ... наша работа - сортировать их.
Ergh. Это звучит как большая работа!
Как мы можем отсортировать эту колоду? У меня есть план.
Я буду смотреть на каждую пару карт, пара за парой, через колоду, от первой до последней. Если первая карта в одной паре большая, а следующая в этой паре маленькая, я поменяю их местами. Иначе, я иду к следующей паре, и так далее, и так далее ... и скоро колода готова.
Когда колода закончена, я спрашиваю: обменял ли я карты в этом проходе? Если это так, я должен сделать все это еще раз, сверху.
В какой-то момент, в какое-то время перестановок не будет, и наш тип колоды будет готов. Так много работы!
Ну, сколько это будет стоить, чтобы отсортировать карточки по этим правилам?
У меня есть десять карт. И большую часть времени - то есть, если мне не везет - я должен пройти всю колоду до десяти раз, с помощью до десяти обменов карт каждый раз через колоду.
Большой О, помоги мне!
Входит большой О и говорит: для колоды из n карт сортировка будет выполнена за O (N в квадрате).
Почему он говорит n в квадрате?
Ну, вы знаете, n в квадрате равно n раз n. Теперь я понял: n карт проверено, вплоть до того, что может быть n раз в колоде. Это две петли, каждая из которых имеет n шагов. Это много работы в квадрате. Конечно, много работы!
Теперь, когда большой О говорит, что ему понадобится О (n в квадрате), он не означает, что n в квадрате добавляет на носу. Это может быть немного меньше, в некоторых случаях. Но в худшем случае для сортировки колоды понадобится n шагов в квадрате.
Теперь вот где большой О - наш друг.
Big O указывает на это: когда n становится большим, когда мы сортируем карточки, работа становится НАМНОГО БОЛЬШЕ труднее, чем старая работа "просто добавь эти вещи". Откуда мы это знаем?
Ну, если n становится действительно большим, нам все равно, что мы можем добавить к n или n в квадрате.
Для больших n квадрат n больше, чем n.
Большой О говорит нам, что сортировать вещи сложнее, чем добавлять вещи. O (n в квадрате) больше, чем O (n) для больших n. Это означает: если n становится действительно большим, сортировка смешанной колоды из n вещей ДОЛЖНА занять больше времени, чем просто добавление n смешанных вещей.
Big O не решает работу за нас. Большой О говорит нам, насколько тяжелая работа.
У меня есть колода карт. Я их отсортировал. Вы помогли Спасибо.
Есть ли более быстрый способ сортировки карт? Может ли большой О помочь нам?
Да, есть более быстрый путь! На обучение уходит некоторое время, но оно работает ... и работает довольно быстро. Вы тоже можете попробовать, но не торопитесь с каждым шагом и не теряйте свое место.
В этом новом способе сортировки колоды мы не проверяем пары карт, как мы это делали некоторое время назад. Вот ваши новые правила сортировки этой колоды:
Одна: я выбираю одну карту в той части колоды, над которой мы сейчас работаем. Вы можете выбрать один для меня, если хотите. (Первый раз, когда мы делаем это, «часть колоды, над которой мы сейчас работаем», это, конечно, вся колода.)
Два: я раскладываю колоду на той карте, которую вы выбрали. Что это за сплай; как мне выложить? Ну, я иду от стартовой карты вниз, один за другим, и ищу карту, которая выше, чем сплайс-карта.
Три:Я иду от конечной карты вверх и ищу карту ниже, чем сплайс-карта.
Как только я нашел эти две карты, я поменяю их местами и продолжаю искать другие карты для обмена. То есть я возвращаюсь ко второму шагу и вставляю карту, которую вы выбрали, еще немного.
В какой-то момент этот цикл (от двух до трех) закончится. Он заканчивается, когда обе половины этого поиска встречаются у сплайс-карты. Затем мы только что добавили в колоду карту, которую вы выбрали в первом шаге. Теперь все карты рядом с началом находятся ниже, чем сплайс карты; и карты ближе к концу находятся выше, чем сплайс карты. Прикольный трюк!
Четыре (и это самое интересное): у меня сейчас две маленькие колоды: одна ниже, чем сплайс-карта, а другая больше. Теперь я иду к первому шагу на каждой маленькой колоде! То есть я начинаю с первого шага на первой маленькой колоде, а когда эта работа закончена, я начинаю с первого шага на следующей маленькой колоде.
Я разбиваю колоду по частям и сортирую каждую часть, более мелкую и более маленькую, и в какой-то момент у меня больше нет работы. Теперь это может показаться медленным, со всеми правилами. Но поверьте мне, это совсем не медленно. Это намного меньше работы, чем первый способ сортировки вещей!
Как называется этот сорт? Это называется Быстрая сортировка! Этот сорт был сделан человеком по имени C. А. Р. Хоар и он назвал это быстрой сортировкой. Теперь быстрая сортировка привыкает все время!
Быстрая сортировка разбивает большие колоды на маленькие. То есть разбивает большие задачи на маленькие.
Хм. Там может быть правило, я думаю. Чтобы сделать большие задачи маленькими, разбейте их.
Этот вид довольно быстрый. Как быстро? Большой O говорит нам: этот вид требует O (n log n) работы, в среднем.
Это более или менее быстро, чем первый сорт? Большой О, пожалуйста, помогите!
Первый сорт был O (n в квадрате). Но Быстрая сортировка - это O (n log n). Вы знаете, что n log n меньше n в квадрате, для больших n, верно? Ну, вот как мы знаем, что быстрая сортировка быстрая!
Если вам нужно отсортировать колоду, как лучше? Ну, вы можете делать то, что вы хотите, но я бы выбрал быструю сортировку.
Почему я выбираю быструю сортировку? Я не люблю работать, конечно! Я хочу, чтобы работа была выполнена как можно скорее.
Откуда мне знать, что быстрая сортировка - это меньше работы? Я знаю, что O (n log n) меньше, чем O (n в квадрате). O более маленькие, поэтому быстрая сортировка - меньше работы!
Теперь вы знаете, мой друг, Большой О. Он помогает нам выполнять меньше работы. И если ты знаешь большой О, ты тоже можешь выполнять меньше работы!
Вы узнали все это со мной! Ты такой умный! Большое вам спасибо!
Теперь, когда работа сделана, поехали играть!
[1]: Есть способ обмануть и добавить все вещи от одного до n, все за один раз. Какой-то ребенок по имени Гаусс узнал об этом, когда ему было восемь лет. Хотя я не такой умный, поэтому не спрашивайте меня, как он это сделал .