Читаем Хакни рутину. Как алгоритмы помогают справляться с беспорядком, не тупить в супермаркете и жить проще полностью

В главе 1 мы говорили о хеш-таблицах и о том, как они полезны, когда нам нужно провести быстрый обзор и не беспокоиться о порядке. Разговор о многомерных массивах дает нам прекрасную возможность расширить наше знание о хеш-таблицах. Раньше мы принимали на веру, что хеш-функция всегда отмечает позицию элемента, назначая ему уникальное местоположение в хеш-таблице, и именно благодаря этому гарантируется его быстрое нахождение в любое время. В реальности хеш-функция может столкнуться с таким явлением, как коллизия, при которой соответствующее место в хеш-таблице уже занято другим элементом. Это происходит либо потому, что хеш-функция неидеальна, то есть не работает правильно и не обеспечивает единообразного распределения значений хеш-функции, либо у нас больше элементов для хранения, чем может вместить таблица. Степень заполнения хеш-таблицы называется коэффициентом заполнения и равна нулю, когда хеш-таблица пуста, или единице, когда она заполнена.

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

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

Думаешь, куда пойти потом? не волнуйся, я тебе покажу направление, так что поторопись

Нужно подчеркнуть еще одну вещь: многомерный массив заранее навязывает нашим элементам приоритет, а именно – расстояние от входа магазина до конкретного ряда, где находится нужная вам вещь. Возможно, пора расширить наши знания об очередях с приоритетом, о которых мы упоминали мимоходом в главе 8. Там мы говорили, что, когда вы составляете некий приоритизированный список элементов, а после нужно добавить к нему новый элемент, может понадобиться стереть некоторые части списка, чтобы освободить место. Довольно скоро дело заходит в тупик, и вы обнаруживаете, что нужно делать новый список. Как может машина составить такой список с эффективностью, которую мы ждем от нее?

Мы уже видели структуры, оптимизированные для быстрого просмотра (массивы) и вставки элементов в произвольных точках (связные списки). Теперь подробнее рассмотрим очередь с приоритетом, которая оптимизирована для добавления элемента высшего приоритета[44] к коллекции в логарифмическое время. Она называется очередью, даже если не является таковой в привычном представлении, то есть когда первый предмет, вставший в очередь, первым же из нее выходит.

[45] Вместо этого вы можете представить очередь с приоритетом как некое подземное растение, которое пускает только один побег за один раз и позволяет проходящим мимо людям сорвать его.

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

Давайте смоделируем приоритизированный список в виде пирамиды.

Заметьте, что пирамида представляет собой как бы дерево из узлов. У них есть две особенности. Первое: каждый узел имеет более низкий приоритет, чем родительский.[46] Поэтому пункт с самым большим приоритетом, то есть продукт, расположенный ближе всего ко входу в магазин, помещен на самом верху. Ничего больше не сообщается о порядке других узлов, таких как узлы, которые находятся на одном уровне. Есть другие структуры, они гарантируют, что все узлы в древоподобной структуре упорядочиваются, как бинарное дерево поиска, полезное в ситуациях, которые мы описывали в главе 2.

Второе свойство: каждый узел имеет два дочерних, с возможным исключением самых низших узлов. Этот структурный инвариант гарантирует, что высота пирамиды, то есть самый длинный возможный путь, не будет превышать log n, где n есть номер элементов в пирамиде.

Вот что происходит, когда Вурзма берет коробку перчаток – вещь, которая, как мы определили, лежит ближе всего ко входу, – и хочет узнать, что из списка взять следующим.

Перейти на страницу:

Все книги серии Психология. Сам себе коуч

Рестарт. Как вырваться из «дня сурка» и начать жить
Рестарт. Как вырваться из «дня сурка» и начать жить

Порой наша жизнь начинает напоминать «день сурка», вновь и вновь проигрывающий все тот же сценарий «дом–работа–дом». Если вы устали каждый день проводить без смысла и радости, делать то, что вам совсем не хочется, эта книга для вас! По мнению Татьяны Ананьевой, признанного эксперта в области HR и маркетинга, консультанта ведущих компаний страны, в основе счастливой и гармоничной жизни лежит принцип осознанности и четкое понимание своих желаний. В легкой и доступной форме она рассказывает, как научиться управлять своей жизнью и обрести внутренний баланс и равновесие, стать счастливее в работе и в жизни.Из этой книги вы узнаете:[ul]Как найти свою мечту и реализовать ее;Почему нам так трудно избавиться от шаблонов и что с этим делать;Как научиться делать шаг к цели каждый день;Чем отличается подход к работе у разных поколений;Как избежать типичных ошибок в планировании.[/ul]

Татьяна Евгеньевна Ананьева

Карьера, кадры / Психология / Образование и наука

Похожие книги

Вперед в прошлое!
Вперед в прошлое!

Мир накрылся ядерным взрывом, и я вместе с ним.По идее я должен был погибнуть, но вдруг очнулся… Где?Темно перед глазами! Не видно ничего. Оп — видно! Я в собственном теле. Мне снова четырнадцать, на дворе начало девяностых. В холодильнике — маргарин «рама» и суп из сизых макарон, в телевизоре — «Санта-Барбара», сестра собирается ступить на скользкую дорожку, мать выгнали с работы за свой счет, а отец, который теперь младше меня-настоящего на восемь лет, завел другую семью.Отныне глава семьи — я, и все у нас будет замечательно. Потому что возраст — мое преимущество: в это лихое время выгодно, когда тебя недооценивает враг. А еще я стал замечать, что некоторые люди поддаются моему влиянию.Вот это номер! Так можно не только о своей семье, обо всем мире позаботиться и предотвратить глобальную катастрофу!От автора:Дорогой читатель! Это очень нудная книга, она написана, чтобы разрушить стереотипы и порвать шаблоны. Тут нет ни одной настоящей перестрелки, феерического мордобоя и приключений Большого Члена во влажных мангровых джунглях многих континентов.Как же так можно? Что же тогда останется?..У автора всего-навсего есть машина времени. Прокатимся?

Вадим Зеланд , Денис Ратманов

Самиздат, сетевая литература / Самосовершенствование / Попаданцы / Эзотерика