Обновить
274.5

Алгоритмы *

Все об алгоритмах

Сначала показывать
Порог рейтинга
Уровень сложности

Алгоритмы и решения при разработке движка JavaScript на C#

Время на прочтение5 мин
Охват и читатели14K
Здравствуйте, уважаемые хабровчане!

Чуть меньше года назад я, так же, в песочнице, публиковал статью о начале разработки движка JavaScript на C#. Прошел год после создания проекта и я рад представить вам первую версию сего творения, которую можно скачать на nuget.
Но в этой статье я не буду пиариться, приводить сравнения с конкурентами, измерять производительность и прочее. Здесь я напишу о том, через что мне пришлось пройти, какой кровью всё это далось и с чем пришлось столкнуться.
Читать дальше →

Ликбез: методы ресайза изображений

Время на прочтение7 мин
Охват и читатели132K
Почему изображение, масштабированное с бикубической интерполяцией, выглядит не как в Фотошопе. Почему одна программа ресайзит быстро, а другая — нет, хотя результат одинаковый. Какой метод ресайза лучше для увеличения, а какой для уменьшения. Что делают фильтры и чем они отличаются.

Вообще, это было вступлением к другой статье, но оно затянулось и вылилось в отдельный материал.


Этот человек сидит среди ромашек, чтобы привлечь ваше внимание к статье.
Читать дальше →

Персонализация для поисковых сервисов

Время на прочтение12 мин
Охват и читатели5.8K
В настоящей работе изложены принципы применения технологии персонализации, учитывающей психологические особенности пользователей, при формировании выдачи по информационному поиску.
Целью данной технологии является создание для пользователя персонального комфортного пространства в сети интернет вообще, и положительного опыта взаимодействия с поисковым сервисом в частности. Как следствие, поисковые сервисы получают инструментарий для оптимизации использования своих ресурсов.

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

Python реализация парадигмы event-driven с помощью сопрограмм

Время на прочтение7 мин
Охват и читатели58K
Статья про то, как с помощью расширенных генераторов Python сделать собственную реализацию сопрограмм, переключающихся по получению событий. Простота кода получившегося модуля вас приятно удивит и прояснит новые и мало используемые возможности языка, которые можно получить, используя такие генераторы. Статья поможет разобраться и с тем, как это устроено в серьезных реализациях: asyncio, tornado, etc.
Читать дальше →

Пальчиковые деревья (Часть 1. Представление)

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

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


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

Статья будет состоять из 3-х частей:

Пальчиковые деревья (Часть 1. Представление)
Пальчиковые деревья (часть 2. Операции)
Пальчиковые деревья (Часть 3. Применение)

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


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



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

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


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

Алгоритм удаления узла из btree

Время на прочтение4 мин
Охват и читатели16K
Доброго времени суток!

История данного текста такова. Ребёнку задали задание запрограммировать btree. Я иногда ему помогаю. Решил, что это тривиально. Но попытки наскоком решить задачу успехом не увенчались. Поиски сколько-нибудь разумного описания и/или кода также были тщетны. Зачёт сын давно сдал, но мой параноидальный характер заставил меня решить задачу. Может кому-нибудь пригодится.
Читать дальше →

Оптимизация для начинающих, или о пользе профилирования

Время на прочтение5 мин
Охват и читатели18K
Попалась мне задача написать на PHP оптимальный алгоритм вставки нового значения в упорядоченный массив. Причем аргументировано доказать, что именно этот алгоритм лучший. Для этого предлагалось написать три варианта и выбрать из них лучший. Конечно же я знаю, что лучший метод поиска — бинарный, но раз сказали доказать, что он лучший, так и быть, напишу еще два. С таким настроем и уверенностью в будущем результате я и принялся кодить.

Что из этого получилось приглашаю начинающих программистов почитать, а опытных обсудить.
Читать дальше →

Quotient filter

Время на прочтение5 мин
Охват и читатели16K
Quotient filter — это вероятностная структура данных, позволяющая проверить принадлежность элемента множеству. Она описана в 2011 г. как замена фильтру Блума. Ответ может быть:
— элемент точно не принадлежит множеству;
— элемент возможно принадлежит множеству.

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

Почему буфер должен расти экспоненциально

Время на прочтение2 мин
Охват и читатели27K
Сотрудник Mozilla Николас Нетеркот опубликовал заметку с очень чётким объяснением, почему размер буфера памяти для программы нужно увеличивать экспоненциально, а не линейно.

Предположим, что у нас есть структура данных, для которой нужно всё больше памяти, например, строка или вектор. Если новые элементы не помещаются в буфере, то создаётся новый буфер, туда копируются всё содержимое из старого, а затем старый буфер освобождается. Обычное этим занимается realloc().

Так вот. Представим, что наш изначальный 1-байтный буфер растёт по 1 байту до тех пор, пока не достигнет размера 1 МиБ. Сколько памяти мы задействовали для него кумулятивно?

1 + 2 + 3 + … + 1,048,575 + 1,048,576 = 549,756,338,176 байт

Неслабо, да?
Читать дальше →

Получение уникального контента из видеоблогов

Время на прочтение3 мин
Охват и читатели12K
Тема стенографии не нова, вот её мы и будем использовать для получения уникального текста.
Специализированного софта для данной задачи в виде одной программы — я не нашел и для реализации решил использовать несколько программ:

1) RealSpeaker PRO 1.5

2) Virtual Audio Cable 4.10 Full

3) SplitCam

4) Текстовый редактор (Блокнот, Word и т.д.)

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

Библиотека Strutext обработки текстов на C++ — реализация лексического уровня

Время на прочтение15 мин
Охват и читатели14K

Базовые принципы


Этот текст является продолжением поста о библиотеке Strutext обработки текстов на языке C++. Здесь будет описана реализация лексического уровня представления языка, в частности, реализация морфологии.
Читать дальше →

Конечный автомат (он же машина состояний) на чистом С

Время на прочтение5 мин
Охват и читатели138K
Почти каждый микроконтроллерщик сталкивался с громадными switch-case и мучительно их отлаживал.
И много кто, начиная писать реализацию какого-либо протокола, задумывался как написать её красиво, изящно, так чтобы через месяц было понятно что ты имел в виду, чтобы она не отжирала всю память и вообще какала бабочками.
И вот тут на помощь приходят машины состояний, они же конечные автоматы (те самые которые используются в регулярных выражениях).

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

Как создается Data Matrix?

Время на прочтение4 мин
Охват и читатели63K
Data Matrix является двумерным матричным штрих кодом, состоящим из светлых и темных участков. С помощью такого штрих кода можно закодировать достаточно большой объем информации (2-3Кб). Часто Data Matrix применяется при маркировке небольших предметов, например микросхем, а также в пищевой, оборонной промышленности, рекламе и других сферах.

Существует множество сайтов для создания таких кодов, но мне всегда было интересно, каким же образом текст превращается в набор черных и белых квадратиков? Должен же быть какой-то алгоритм?

При создании Data Matrix нам понадобится обратиться к арифметике полей Галуа и кодам Рида-Соломона. Рассмотрим этот процесс на простом примере.
Читать дальше →

Ближайшие события

Android MediaPlayer. Расширяем возможности с помощью прокси

Время на прочтение6 мин
Охват и читатели20K

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

Перевод интерактивного учебника «Problem Solving with Algorithms and Data Structures»

Время на прочтение3 мин
Охват и читатели69K
imageПривет, Хабр!

Мы (@ali_aliev и avenat) с удовольствием представляем вашему вниманию перевод интерактивного учебника «Problem Solving with Algorithms and Data Structures» от Брэда Миллера (Brad Miller) и Дэвида Ранума (David Ranum) из Luther College, что в Айове, США.

О чём?

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

Авторы рассказывают о таких структурах данных, как стеки, очереди (в том числе с приоритетом), деки, хэш-таблицы, списки, деревья и графы. Последним двум вообще посвящены весьма не маленькие главы. Изложение не просто описательное: для каждой структуры предлагается вариант (а иногда и не один) её реализации на Python. Упор, естественно, делается на объектно-ориентированное программирование: создаётся класс, к нему пишутся методы, некоторые из которых авторы оставляют читателям для самостоятельной доработки. Затем идут примеры использования рассмотренной структуры и описание алгоритмов с её участием.

Одна из глав учебника посвящена рекурсии, в том числе её графическому представлению (фракталы). Разбирается несколько известных рекурсивных задач, а в конце наглядно демонстрируется, что эта методика, несмотря на её элегантность, отнюдь не «серебряная пуля».

Не обделены вниманием и классические алгоритмы для сортировки и поиска. И, естественно, для каждого из них анализируются производительность и «подводные камни», а так же даются рекомендации по применению. В последних главах, посвящённых деревьям и графам, даётся много материала об их разновидностях и связанных с ними алгоритмах. Изложение тут становится более сжатым, многие моменты просто описываются с тем, чтобы после прочтения главы читатель реализовал их самостоятельно.
Читать дальше →

Парные товары. Размещения товаров в торговом зале

Время на прочтение2 мин
Охват и читатели24K


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

Итак, Пары — это товары, часто покупаемые вместе. В паре один товар является ключевым (якорным), а второй — сопутствующим. On-line сервис Datawiz.io выявляет парные взаимосвязи товаров при помощи алгоритма APRIORI.
Читать дальше →

Библиотека Strutext обработки текстов на языке C++

Время на прочтение7 мин
Охват и читатели16K

Введение



Этот текст можно рассматривать как обзор библиотеки Strutext, задуманной автором как набор эффективных алгоритмов лингвистической обработки текста на языке C++. Код библиотеки находится в репозитории на Github. Библиотека имеет открытый исходный код и поставляется под лицензией Apache License 2.0, т.е. может быть использована совершенно бесплатно без каких-либо существенных ограничений.

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

Гарри Каспаров проиграл суперкомпьютеру Deep Blue в шахматы из-за компьютерного сбоя

Время на прочтение2 мин
Охват и читатели188K


Одна из величайших шахматных партий всех времен и народов — это, вне всяких сомнений, сражение Гарри Каспарова и суперкомпьютера Deep Blue от IBM, в 1997 году. Это была уже вторая игра Каспарова с суперкомпьютером, матч-реванш машины.

Первая партия в игре была очень сложной и напряженной, у Каспарова было поначалу преимущество, но, начиная с 44 хода, он перестал понимать логику игры машины, и, в итоге, проиграл весь матч. Спустя некоторое время Каспаров даже обвинил инженеров IBM в «читерстве»: манипуляциях с ПО машины, которые и привели к поражению. Спустя 17 лет ситуация прояснилась — Каспаров проиграл из-за сбоя в алгоритме работы компьютера в самой первой партии всего сражения.
Читать дальше →

Как работают рекомендательные системы. Лекция в Яндексе

Время на прочтение11 мин
Охват и читатели150K

Привет, меня зовут Михаил Ройзнер. Недавно я выступил перед студентами Малого Шада Яндекса с лекцией о том, что такое рекомендательные системы и какие методы там бывают. На основе лекции я подготовил этот пост.





План лекции:


  1. Виды и области применения рекомендательных систем.
  2. Простейшие алгоритмы.
  3. Введение в линейную алгебру.
  4. Алгоритм SVD.
  5. Измерение качества рекомендаций.
  6. Направление развития.

Под катом вы найдете конспект лекции и презентацию

Как колебания в продажах влияют на оборот?

Время на прочтение3 мин
Охват и читатели14K


Данная публикация — это реальный кейс от Datawiz.io, в котором мы расскажем, как найти товары и категории с большими колебаниями продаж, и как колебания продаж влияют на поведение клиентов.

Производя анализ данных для торговой сети, мы столкнулись с проблемой: при почти равных количествах продаж в день в двух магазинах сети, оборот в одном магазине «Shop1» увеличивался, а в магазине «Shop2» — снижался.
Читать дальше →

Вклад авторов