Pull to refresh
0
0
Evgeny @azeffin

User

Send message

Декартово дерево: Часть 3. Декартово дерево по неявному ключу

Reading time12 min
Views58K

Оглавление (на данный момент)


Часть 1. Описание, операции, применения.
Часть 2. Ценная информация в дереве и множественные операции с ней.
Часть 3. Декартово дерево по неявному ключу.
To be continued...

Очень сильное колдунство


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

Вспомним-ка еще раз структуру дерамиды. В ней есть ключ x, по которому дерамида есть дерево поиска, случайный ключ y, по которому дерамида есть куча, а также, возможно, какая-то пользовательская информация с (cost). Давайте совершим невозможное и рассмотрим дерамиду… без ключей x. То есть у нас будет дерево, в котором ключа x нет вообще, а ключи y — случайные. Соответственно, зачем оно нужно — вообще непонятно :)

На самом деле расценивать такую структуру стоит как декартово дерево, в котором ключи x все так же где-то имеются, но нам их не сообщили. Однако клянутся, что для них, как полагается, выполняется условие двоичного дерева поиска. Тогда можно представить, что эти неизвестные иксы суть числа от 0 до N-1 и неявно расставить их по структуре дерева:

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

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

Делаем твёрдый переплёт для любимых книжек

Reading time6 min
Views536K
Небольшое вступление

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

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

Большое вступление

Некоторое время назад мне захотелось прочитать цикл Дугласа Адамса «Автостопом по галактике». Я попробовал почитать несколько переводов и не один меня не устроил. Поэтому было принято решение — читать на английском! Найти эти книги в оригинале в наших книжных магазинах довольно сложно. А если и есть, то только первая часть цикла. В электронном виде найти несколько проще. Но я предпочитаю читать с бумаги (читалку на E-ink куплю обязательно — очень нравятся), поэтому книги я распечатываю.

Первые две книги выглядели так:
image

Я их прочитал с огромным удовольствием, но выглядели они не очень хорошо. И я решил, что «Life, the Universe, and Everything» нужно делать книжкой.

Процесс с картинками и комментариями под катом. Осторожно, действительно много картинок.
Читать дальше →

Полнотекстовый поиск в веб-проектах: Sphinx, Apache Lucene, Xapian

Reading time15 min
Views55K
Полная авторская верcия из моего блога. Оригинал материала написан специально для Developers.org.ua

Наверное любой современный веб-проект сложно себе представить без… без контента! Да, именно контент в разных его проявлениях сегодня «правит бал» в различных веб-проектах. Не так важно — создаваемый пользователями или получаемый из других источников автоматически — информация является основной любого (ну, или почти любого) проекта. А раз так — то вопрос поиска необходимой информации стоит очень остро. И острее с каждым днем, ввиду стремительного расширения количества этого самого контента, в основном за счёт создаваемого пользователями (это и форумы, и блоги и модные нынче сообщества, вроде Habrahabr.ru). Таким образом, любой разработчик, реализующий сегодня какой-либо проект, сталкивается с потребностью реализовать поиск в своём веб-приложении. При этом требования к такому поиску уже намного сложнее и шире, чем даже год-два назад. Конечно, для каких-то проектов вполне подойдёт и простое решение, к примеру, вполне можно использовать Custom Google Search. Но чем более сложное приложение, и чем сложнее структура контента, если требуются особые виды поиска и обработки результата, или же просто количество или формат данных в вашем проекте особый, вам потребуется собственная поисковая система. Именно своя система, собственный поисковый сервер или сервис, а не сторонний, пусть даже гибкий и настраиваемый. Но что же выбрать, и вообще — какие сейчас на рынке есть поисковые проекты, которые готовы для использования в реальных проектах, не исследовательских или научных, а реальных бизнес-приложениях? Далее мы кратко рассмотрим различные варианты поисковых решений, пригодных для встраивания в ваше веб-приложение или развёртывания на собственном сервере.
Читать дальше →

Code Like a Pythonista: Idiomatic Python (part1)

Reading time9 min
Views26K
Kaa, the Python


Это продолжение перевода статьи Дэвида Гуджера «Пиши код, как настоящий Питонист: идиоматика Python»

Начало и окончание перевода.


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

Читать дальше →

Code Like a Pythonista: Idiomatic Python (part0)

Reading time12 min
Views28K
Kaa, the Python
От переводчика:

Я только начал изучать Python. С самого первого знакомства язык порадовал симпатичными конструкциями и синтаксически-гарантированной удобностью к чтению и пониманию кода.
В процессе освоения, при написании своего кода, бывает, сомневаюсь в правильности выбранных способов с точки зрения Python-way ( PEP 8 — Style Guide for Python Code, если угодно). Для вникания в идеологию программирования, в Python-сообществе кроме исчерпывающей документации, ко всеобщей радости, накоплено уже немало вспомогательных материалов, таких как статья Python Tips, Tricks, and Hacks, перевод которой недавно появился на Хабре
Мне понравилась статья Дэвида Гуджера «Пиши код, как настоящий Питонист: идиоматика Python» (David Goodger «Code Like a Pythonista: Idiomatic Python»). Для лучшего её усвоения решил оформить (в силу умения) полноценный перевод, потом показалось здравой идеей поделиться с Хабром.
Пока работал над переводом, пришло понимание, что статья существенно больше, чем показалась при прочтении ее в оригинале, поэтому постить буду частями, чтобы не выпасть из формата Хабра-статьи.
Продолжение и окончание перевода.

are you ready?

Code Like a Pythonista: Idiomatic Python (part2)

Reading time11 min
Views18K
Kaa, the Python


После небольшого перерыва представляю заключительную часть перевода статьи Дэвида Гуджера «Пиши код, как настоящий Питонист: идиоматика Python»


Ссылки на первую и вторую части.


Еще раз подчеркну, автор в этой статье не открывает Америку, большинство Питонистов не найдут в ней какой-то «особой магии». Но довольно подробно перечисляются методологии использования и выбора различных конструкций в Python с точки зрения удобочитаемости и близости к идеологии PEP8.
В некоторых местах в авторской статье отсутствуют примеры исходных кодов. Разумеется, оставил как есть, придумывать свои не стал, в принципе должно быть понятно, что имел в виду автор.

Читать дальше →

Слабые события в C#

Reading time11 min
Views79K

От переводчика


Недавно в проекте, где я работаю, мы столкнулись с проблемой утечки памяти. Прочитав множество статей — от рассказов по управлению памятью в .NET до практических рекомендаций по правильному освобождению ресурсов, я в том числе наткнулся на статью, в которой рассказывается, как корректно использовать события. Ее перевод я и хочу вам представить.
Это топик из песочницы, с которым я попал сюда на Хабр.

Читать дальше →

Быстрое создание CRUD-основы приложения на Entity Framework/ASP.Net MVC

Reading time12 min
Views14K
Большинство прикладных приложений, которые приходится разрабатывать на практике, сводятся к примитивному шаблону: есть некая предметная область, в которой выделены объекты и связи между ними. Все это легко представляется в виде таблиц в базе данных, а базовый функционал приложения состоит в том, чтобы выполнять над этими таблицами четыре основных действия: создание, модификацию, просмотр и удаление объектов. Далее, обычно, на эту основу прикручивают дополнительную бизнес-логику, модуль отчетов и остальной необходимый функционал.
Естественной реакцией организма разработчика на присутствие определенного шаблона является желание автоматизировать его применение, например, используя кодогенерацию. Шутка. Кодогенерация – это тот же метод copy-paste, только за программиста его делает специально написанный инструмент. Иногда это оправдано, но перед тем, как решится на генерацию кода, лучше хорошо подумать, а нельзя ли здесь обойтись средствами ООП, к примеру?
Читать дальше →

Запускаем софтверный бизнес в России

Reading time7 min
Views2K
Много было в последнее время топиков о стартапах, организации команд, разработке ПО и некоторых других вещах, неразрывно связанных с софтверным или интернет-бизнесом. В этой статье я хочу рассказать, что сейчас будет вас ждать, пожелай вы открыть свою компанию по продаже программного обеспечения (ПО, далее софта). Ибо пока полноценных топиков на эту тему я не видел.

Зачем нужен этот топик? Чтобы после прочтения можно было однозначно ответить на вопросы «А оно мне надо?», «Стоит ли переводить проект в разряд стартапа (или наоборот)?», «Как заработать на своем труде в России?» и на ряд других более конкретно. И это только касательно России (если все будет хорошо, то выложу аналогичный топик и относительно международного софтверного бизнеса).

Внимание: вся нижеприведенная информация изложена с позиций минимизации затраченного времени (и увеличения надежности мероприятия) и с учетом отсутствия прописки в городе регистрации юр. лица (и отсутствия рабочего офиса).

Продукт и команда


Перед стартом обязательно имейте хотя бы что-нибудь. Что-нибудь, что приносит деньги. Без денежного потока (пусть даже в 10-20 тысяч рублей) затевать все это бессмысленно (далее будет понятно, почему, но первичные расходы на оформление всей волокиты составляют порядка 30к рублей). Естественно, открывать свое юридическое лицо и оформлять бизнес стоит в том случае, если вы собираетесь расти. И не просто расти, а очень сильно расти. Иметь оборот в 20-30 тысяч рублей можно и не имея никакого юридического лица, а при «нелегальном» обороте в районе 100 тысяч уже могут начаться различные проблемы с государством (и красиво оформить это может уже не получиться).

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

Ладно, вроде у нас есть, что продавать (будь это хоть утилита «Time Machine для Windows»). У нас есть пара человек, которые разделяют ответственность за компанию и готовы работать во имя ее успешности. Что дальше?

Дальше самое интересное.
Читать дальше →

Как подружить ASP.NET Controls и DI-контейнер

Reading time5 min
Views1.7K

Интро

В последнее время решил немного освежить свои знания в ASP.NET, в связи с чем углубился в процессы генерации кода контролов по разметке (*.ascx, *.aspx) и обнаружил что можно делать очень интересные решения, о которых  о хочу поведать. Итак сегодня мы узнаем, как подружить наш Dependency Injection контейнер с генерируемым контролами кодом.
Читать дальше →

Обфускаторы (и деобфускаторы) для .NET §0

Reading time3 min
Views21K
Ни для кого не секрет, что из скомпилированных сборок (exe и dll) для платформы .NET может быть легко восстановлен код на языках высокого уровня (C#, VB.net). Это означает не только то, что если в программе имеется система лицензирования, то она может быть легко снята; но и то, что ваш исходный код могут скопировать, например, нечистые на руку конкуренты. Чтобы обезопасить себя от подобных угроз большинство разработчиков коммерческого софта используют разного рода обфускаторы.
Читать дальше →

Распределенная файловая система GFS (Google File System)

Reading time14 min
Views28K
В настоящее время, в условиях роста информации, возникают задачи хранения и обработки данных очень большого объема. Поэтому эти данные обрабатывается сразу на нескольких серверах одновременно, которые образуют кластеры. Для упрощения работы с данными на кластерах и разрабатывают распределенные файловые системы. Мы подробно рассмотрим пример распределенной файловой системы Google File System, используемую компанией Google. (Статья является, фактически, вольным и урезанным переводом оригинальной статьи ).
Читать дальше →

Структуры данных: бинарные деревья. Часть 1

Reading time6 min
Views375K

Интро



Этой статьей я начинаю цикл статей об известных и не очень структурах данных а так же их применении на практике.

В своих статьях я буду приводить примеры кода сразу на двух языках: на Java и на Haskell. Благодаря этому можно будет сравнить императивный и функциональный стили программирования и увидить плюсы и минусы того и другого.

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

Прав ли R#: call to .ToString() is redundant?

Reading time9 min
Views3.5K
Этот пост публикуется по просьбе хабраюзера mstyura, у которого не хватает кармы для публикации. Если вам понравилась статья, то благодарите автора и помогите ему с кармой.

Хочу поделиться с Хабросообществом результатом своего минииcследования на тему упаковки\распаковки значимых типов. На написание данного топика меня сподвигли две вещи: книга Рихтера «CLR via c#» и собственно R#. Последний на мой взгляд давал «нечестные» замечания моему коду.
Читать далее

Три парадигмы F#

Reading time16 min
Views21K

Введение


Все, кто так или иначе связан с .NET программированием знает, что уже в следующую версию Visual Studio будет встроен новый язык программирования — F#, который позиционируется как функциональный, чем сразу, так уж повелось, вызывает подозрения в бесполезности. Для того, чтобы показать, что F# — куда больше, чем просто ФЯП (хотя и просто ФЯП — это очень немало), я и написал все нижеследующее.
Эта статья, несмотря на изрядную длину, не претендует на то, чтобы полностью описать всю функциональность языка. Это всего лишь краткий обзор, призванный продемонстрировать широкий спектр возможностей, каждая из которых заслуживает отдельной статьи, и даже не одной.
Кроме того, написав такой пространный пост, я хотел сделать задел на будущее, чтобы в дальнейшем мне не отвлекаться на незначительные вещи базового уровня. Конечно, сразу головой в пруд — это действенно, но и какой-никакой фундамент не помешает.
А уже в следующий раз я приведу пример на волнующую тему пригодности F# для обычной профессиональной программистской деятельности.
И еще раз, под катом действительно МНОГО текста. И не говорите потом, что я вас не предупреждал. =)
Читать дальше →

Software Configuration Management // Контроль версий

Reading time12 min
Views19K
И снова здравствуйте.

Продолжаю публиковать цикл статей о SCM — управлении конфигурацией ПО.
3 предыдущие заметки можно прочитать в этом же блоге.

Сегодня расскажу о том, с чем работает большинство читателей — о контроле версий.

Disclaimer


Далее будут описаны основные техники, реализованные в подавляющем большинстве систем контроля версий. Как они реализуются в приложениях, которые использует читатель, оставим на откуп многочисленным руководствам пользователя, how-to, FAQ и прочим документам, коих можно найти без труда. Главное – понять, по каким принципам и зачем оно работает именно так.

Всё понятно, продолжай

5 нетехнических ошибок, которые допускают программисты

Reading time3 min
Views1.3K
Есть два множества навыков, которые необходимо культивировать хорошему программисту: технические и нетехнические. К сожалению, некоторые программисты сосредотачиваются только на технической части. Когда это происходит, у них появляются плохие привычки, которые служат поводом к 5 нетехническим ошибкам.
подробнее об ошибках, которые я может быть допускаю

Несколько полезных аспектов для PostSharp

Reading time11 min
Views11K
В .net-е есть несколько серьезных AOP-фреймворков, но ни один их них не «рулит» так как PostSharp. Будучи большим фанатом (а также пользователем) сего фреймворка, хочу представить сообществу несколько «рецептов». Некоторые из них я создал сам, другие нашел в интернете и адаптировал под свои нужды. Тут я покажу несколько самых «сочных» рецептов. А если вы не знакомы с фреймворком или идеологией AOP, могу порекоммендовать вот этот вебкаст. Итак, начнем?

Читать дальше →

Про Git на пальцах (для переходящих с SVN)

Reading time8 min
Views279K
Год назад мы с командой решили перейти с SVN на Git. Зачем это было надо — писать не буду, т.к. на эту тему уже и так много написано. А хочу я описать типичные алгоритмы работы, понятные человеку, который долгое время пользовался SVN. Ниже — памятка, написанная для команды год назад, чтобы легче было мигрировать. Надеюсь, кому-нибудь пригодится.
Читать...

Information

Rating
Does not participate
Location
Санкт-Петербург, Санкт-Петербург и область, Россия
Registered
Activity