Архив за 13 ноября 2014

Вышла недавно статья на Хабре о том, как можно самому создать на функциональном языке такие структуры как Очередь (первый зашёл, первый вышел) и Последовательность (напоминает двусторонний стек — первый зашёл, первый вышел с обоих концов). Посмотрел я на этот код и понял, что он жутко неэффективен — сложность порядка O(n). Быстро сообразить, как создать структуры с O(1) у меня не вышло, поэтому я открыл код библиотечной реализации. Но там была не лёгкая и понятная реализация, а <много кода>. Это было описание пальчиковых деревьев, необходимость и элегантность которых для этой структуры данных хорошо раскрывается текущей статьёй.

Пальчиковые деревья

В этой статье мы рассмотрим пальчиковые деревья. Это функциональные неизменяемые структуры данных общего назначения, разработанные в работе Гинце и Паттерсона. Пальчиковые деревья обеспечивают функциональную структуру данных Последовательность (sequence), которая обеспечивает амортизированной доступ постоянный во времени для добавления как в начало, так и в конец последовательности, а также логарифмическое время для конкатенации и для произвольного доступа. В дополнение к хорошему времени асимптотических исполнения, структура данных оказывается невероятно гибкой: в сочетании с моноидальными тегами на элементах, пальчиковые деревья могут быть использованы для реализации эффективных последовательностей с произвольным доступом, упорядоченных последовательностей, интервальных деревьев и очередей приоритетов.

Статья будет состоять из 3х частей:
Пальчиковые деревья (часть 1. Представление)
Пальчиковые деревья (часть 2. Операции)
Пальчиковые деревья (часть 3. Применение)

Разрабатывая структуру данных

Основа и мотивация пальчиковых деревьев пришла от 2-3 деревьев. 2-3 деревья — это деревья, которые могут иметь две или три ветви в каждой внутренней вершине и которые имеют все свои листья на одном и том же уровне. В то время, как бинарное дерево одинаковой глубины d должны быть 2d листьев, 2-3 деревья гораздо более гибкие, и могут быть использованы для хранения любого числа элементов (количество не должно быть степенью двойки).
Рассмотрим следующее 2-3 дерево:
Пальчиковые деревья (часть 1. Представление) - 1
Это дерево хранит четырнадцать элементов. Доступ к любому из них требует трех шагов, и если бы мы должны были добавить больше элементов, количество шагов для каждого из них будет расти логарифмически. Мы хотели бы использовать эти деревья для моделирования последовательности. Тем не менее, во многих применимых последовательностях очень часто и неоднократно обращаются к началу или к концу, и гораздо реже к середине. Для удовлетворения этого пожелания, мы можем изменить эту структуру данных так, чтобы приоритет доступа к началу и к концу был наивысшим в отличие от других особенностей.
В нашем случае, мы добавляем два пальца. Палец просто точка, в которой вы можете получить доступ части структуры данных, в императивных языках это было бы просто указателем. В нашем случае, однако, мы будем реструктуризовать всё дерево и сделаем родителей первых и последних детей двумя корнями нашего дерева. Визуально, рассматривая вопрос об изменении дерева выше, захватываем первый и последний узлы на предпоследнем слое, и тянем их вверх, позволяя остальной части дерева свисать:
Пальчиковые деревья (часть 1. Представление) - 2
Читать полностью »

Ишан Вонг (Yishan Wong), теперь уже бывший президент reddit, подал в оставку неделю назад. За 3 года, что он возглавлял компанию, количество пользователей reddit выросло с 35 миллионов до 174 миллионов. Он также ответственен за решение о закрытии всех офисов reddit и перемещение работников в Сан-Франциско. Интересно, что причиной его отставки явилось разногласие с советом директоров в поисках нового здания reddit.

image

Читать полностью »

Наша небольшая компания подключает абонентов к интернету по технологии vlan-per-user.
Так исторически сложилось и в этом есть как плюсы, так и минусы, но разговор сейчас не об этом.
Обычно на каждый vlan выделяется сеть серых адресов, которая потом через NAT выпускается в большой мир. Но иногда абоненты хотят реальный белый адрес, и до недавнего времени им выдавалась /30 сеть. Что в реалиях настоящего очень расточительно и абоненты с реальными адресами переводятся на подключение по технологии SuperVLAN (RFC 3069).

Читать полностью »

image

Уважаемые читатели, в своей скромной статье я хочу рассказать о таком астрономическом понятии как «Великий аттрактор» (Великий центр притяжения). Наверняка те из вас кто увлекается астрономией уже знакомы с данной темой, но есть и такие читатели, вроде меня, которые впервые столкнулись с данным понятием.
Читать полностью »

Не новость, что почти каждый пользователь любой социальной сети имеет приличный список аудиозаписей, который так жалко потерять. Было бы меньше беспокойства, если вы имеете доступ к своим любимым аудиозаписям оффлайн. Конечно, существует несколько расширений для браузеров и десктопных приложений, решающих данную проблему. На этой ноте я и пришел к желанию реализовать собственный «велосипед».
Читать полностью »

Многим известно про аналоги функций PHP на JavaScript, разработанные Кевином ван Цонневельдом. Одна из функций, а именно — функция date() — сильно привлекло моё внимание — тем, что в ней идёт перечень форматов вывода даты и времени, причём их немало. Допустим, что в одном каком-то проекте нам понадобится только четверть из этих форматов (не важно, какие именно, суть не в этом). Как вы знаете, при работе с JavaScript дорог каждый байт, поэтому мы решили удалить 3/4 форматов, которые нам в данном проекте не нужны. В результате видим, что функция не работает, так как форматы в ней взаимосвязаны. Это послужило толчком написать свой «велосипед», который будет гибким и в котором можно смел удалять ненужные нам форматы, не нарушая при этом работоспособность функции. Можно было бы, конечно, изменить функцию Кевина, сделав ее тоже гибкой, но я решил не трогать авторский скрипт и с нуля написать свой. Скрипт максимально прокомментирован на русском и английском языках.
Читать полностью »

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

Мы решили внедрить гугл календарь:
image
Читать полностью »

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

Сага о светодиодных лампах. Часть 2 — о том, чего не пишут на коробках - 1
Читать полностью »

Firebird Project рад объявить о доступности русской документации по языку СУБД Firebird — «Руководство по языку SQL СУБД Firebird».

Руководство можно скачать с официального сайта FirebirdSQL.org или с домашней страницы проекта русской документации.

Русская документация СУБД FirebirdSQL появилась благодаря спонсорам — Московской Бирже (платиновый спонсор и один из крупнейших пользователей Firebird) и IBSurgeon/IBase.ru (золотой спонсор).

Читать полностью »

3D-карта Asus GeForce GTX 980 ROG Poseidon, предварительные сведения о которой появились накануне, представлена производителем. Ключевая особенность 3D-карты с каталожным индексом Poseidon-GTX980-P-4GD5 заключена в том, что она одновременно оснащена водоблоком и воздушным охладителем. Производитель называет это «эксклюзивной технологией DirectCU H2O».


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js