Обновить
223.16

Алгоритмы *

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

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

Как сделать из 123456789 число 100 или 0

Время на прочтение5 мин
Количество просмотров139K
В «Занимательной арифметике» известного популяризатора наук Якова Исидоровича Перельмана в конце первой главы я нашел пример следующих «Арифметических курьезов»:

100 = 1+2+3+4+5+6+7+8*9
100 = 12+3-4+5+67+8+9
100 = 12-3-4+5-6+7+89
100 = 123+4-5+67-89
100 = 123-45-67+89

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

Задача RMQ – 2. Дерево отрезков

Время на прочтение4 мин
Количество просмотров53K
В первой части нашей темы мы рассмотрели решение задачи static RMQ за (O(nlogn), O(1)). Теперь мы разберёмся со структурой данных, называемой дерево отрезков, или интервалов (в англоязычной литературе – segment tree или interval tree). С помощью неё можно решать dynamic RMQ за (O(n), O(logn)).

Определение



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

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

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

Поиск k-ого наименьшего элемента

Время на прочтение3 мин
Количество просмотров37K
Сегодня на Хабре появилась очень интересная статья, о поиске минимального (максимального) значения на отрезке в массиве. Так как статья оказалось интересной и популярной, я решил с вами поделиться ещё одним алгоритмом поиска в массиве некоторых «специальных» значений.
Читать дальше →

Задача RMQ — 1. Static RMQ

Время на прочтение4 мин
Количество просмотров67K

Введение



Задача RMQ весьма часто встречается в спортивном и прикладном программировании. Удивительно, что на Хабре ещё никто не упомянул эту интересную тему. Попробую восполнить пробел.

Аббревиатура RMQ расшифровывается как Range Minimum (Maximum) Query – запрос минимума (максимума) на отрезке в массиве. Для определённости мы будем рассматривать операцию взятия минимума.

Пусть дан массив A[1..n]. Нам необходимо уметь отвечать на запрос вида «найти минимум на отрезке с i-ого элемента по j-ый».



Рассмотрим в качестве примера массив A = {3, 8, 6, 4, 2, 5, 9, 0, 7, 1}.
Например, минимум на отрезке со второго элемента по седьмой равен двум, то есть RMQ(2, 7) = 2.

В голову приходит очевидное решение: ответ на каждый запрос будем находить, просто пробегаясь по всем элементам массива, лежащим на нужном нам отрезке. Такое решение, однако, не является самым эффективным. Ведь в худшем случае нам придётся пробежаться по O(n) элементам, т.е. временная сложность этого алгоритма – O(n) на один запрос. Однако, задачу можно решить эффективнее.

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

Фонетические алгоритмы

Время на прочтение9 мин
Количество просмотров47K
Фонетические алгоритмы сопоставляют двум словам со схожим произношением одинаковые коды, что позволяет осуществлять сравнение и индексацию множества таких слов на основе их фонетического сходства.

Часто довольно трудно найти в базе нетипичную фамилию, например:
— Леха, поищи в нашей базе Адольфа Швардсенеггера,
Шворцинегира? Нет такого!
В этом случае использование фонетических алгоритмов (особенно в сочетании с алгоритмами нечеткого сопоставления) может значительно упростить задачу.

Такие алгоритмы очень удобно использовать при поиске в базах по спискам людей, в программах проверки орфографии. Зачастую они используются совместно с алгоритмами нечеткого поиска (которые, несомненно, заслуживают отдельной статьи), предоставляя пользователям удобный поиск по именам и фамилиям в различных базах данных, списках сотрудников и так далее.

В этой статье я рассмотрю наиболее известные алгоритмы, такие как Soundex, Daitch-Mokotoff Soundex, NYSIIS, Metaphone, Double Metaphone, русский Metaphone, Caverphone.
Читать дальше →

Рейтрейсер четырёхмерного пространства

Время на прочтение5 мин
Количество просмотров17K
TitlePic

Недавно я делал простой рейтрейсер 3-х мерных сцен. Он был написан на JavaScript и был не очень быстрым. Ради интереса я написал рейтрейсер на C и сделал ему режим 4-х мерного рендеринга — в этом режиме он может проецировать 4-х мерную сцену на плоский экран. Под катом вы найдёте несколько видео, несколько картинок и код рейтрейсера.

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

Неортогональная БИНС для малых БПЛА

Время на прочтение7 мин
Количество просмотров33K
БИНС
По правилам сокращений в заголовке не должно быть, но расписав сокращения я превратил бы заголовок в аннотацию. Так что вот…
  • БИНС — бесплатформенная инерциальная навигационная система
  • БПЛА — беспилотный летательный аппарат
  • ОЧ — ось чувствительности датчика

Речь в статье пойдет о навигационной системе, в которой ОЧ датчиков ориентированы неортогонально, т.е. расположены под некоторым, ненулевым, углом к осям системы координат, связанной с БПЛА. Особенность таких БИНС в том, что по информации от каждого из датчиков можно получить значения всех трех компонент угловой скорости (для гироскопов) и линейного ускорения (для линейных акселерометров) объекта.
Статья написана как дополнение к Строим мультикоптер, часть вторая. Целью является описание одного из способов борьбы с дрейфом нуля в дешевых датчиках.
Для чего нужна избыточность читать тут...

Теперь у хабровчан есть своя команда в проекте GIMPS!

Время на прочтение2 мин
Количество просмотров1.6K

Приветствую!
Наверное, многие уже слышали о проекте распределенных вычислений по поиску больших простых чисел GIMPS (Great Internet Mersenne Prime Search). На хабре уже проскакивала информация о проекте и его результатах.

Если вы из тех, кто любит разглядывать 12мегабайтные числа в поисках интересностей и просто с целью медитации, не боитесь всё время видеть 100 процентную загрузку CPU (зная, что программа работает с приоритетом «ниже среднего» и практически не влияет на быстродействие машины), а так же хотите внести свой вклад в развитие математики, то прошу под кат.
Читать дальше →

Собираем Mini Bedlam Cube

Время на прочтение6 мин
Количество просмотров5.3K
Программу, решающую головоломку «пентамино» я написал в качестве одной из первых своих программ. Дело было давно, программа как-то работала, всех вариантов найти не успела… В общем, написал и забыл.

На днях, наводя порядок на столе, решил, что пора бы убрать валяющуюся без дела головоломку «Mini Bedlam Cube»:



А перед этим ее неплохо бы собрать. Головоломка состоит из 13 фигур — 12 составлены из 5 кубиков, одна из четырех; шесть фигур симметричные, три из них — плоские. Фигуры нужно уложить в коробку 4x4x4. Надо сказать, что периодически я вспоминал об этих кубиках, пытался с ними справиться, но так ничего и не вышло. Поэтому возникла идея — написать программу, решающую головоломку, причем затратить как можно меньше усилий, а потом решить старый вопрос: что выгоднее — перебирать фигуры или клетки, и в каком порядке.

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

B-tree

Время на прочтение6 мин
Количество просмотров217K

Введение


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

Основные операции в деревьях выполняются за время пропорциональное его высоте. Сбалансированные деревья минимизируют свою высоту (к примеру, высота бинарного сбалансированного дерева с n узлами равна log n). Большинство знакомо с такими сбалансированными деревьями, как «красно-черное дерево», «AVL-дерево», «Декартово дерево», поэтому не будем углубляться.

В чем же проблема этих стандартных деревьев поиска? Рассмотрим огромную базу данных, представленную в виде одного из упомянутых деревьев. Очевидно, что мы не можем хранить всё это дерево в оперативной памяти => в ней храним лишь часть информации, остальное же хранится на стороннем носителе (допустим, на жестком диске, скорость доступа к которому гораздо медленнее). Такие деревья как красно-черное или Декартово будут требовать от нас log n обращений к стороннему носителю. При больших n это очень много. Как раз эту проблему и призваны решить B-деревья!

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

Решаем судоку на JavaScript

Время на прочтение4 мин
Количество просмотров35K
СудокуСудоку — популярная головоломка, основной задачей которой является размещение цифр в правильном порядке.

Игровое поле представляет собой квадрат 9х9 клеток. Клетки сгруппированы в девять сегментов 3х3. В каждой клетке может быть записана цифра от одного до девяти. Основным правилом судоку является то, что цифра не может повторяться в строке, столбце и сегменте.

Под катом приводится алгоритм решения судоку, реализованный на JavaScript. Рассмотрены только базовые тактики решения головоломки, но этого достаточно для большого числа судоку легкого и среднего уровня.
Читать дальше →

Lua+FFI vs. JavaScript

Время на прочтение2 мин
Количество просмотров8.6K
SmallPic

Эта небольшая заметка не претендует на звание статьи.

В прошлый раз я сравнивал LuaJIT 2.0 Beta 5 и JavaScript в различных браузерах на примере простого рейтрейсера. Результат сравнения: JavaScript в Chrome набрал 20,000 RPS и занял 1-ое место, а LuaJIT — 5,000 RPS и последнее место.

С выходом LuaJIT 2.0 Beta 6 ситуация изменилась: Lua легко вышел на первое место обогнав Chrome. Посмотрим как это получилось.

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

SSP — Собственный алгоритм сжатия изображений без потерь

Время на прочтение6 мин
Количество просмотров6.3K
Наконец–то появилась возможность опубликовать разработанный мною когда-то алгоритм. Алгоритм был разработан для программы автоматического снятия скриншотов. Для удобства дальнейшего его описания буду называть его – SSP (sciner screenshot packer). SSP можно справедливо сопоставить PNG, поэтому в статье я буду проводить сравнения именно с ним.

Алгоритм имеет два режима компресии:
  1. без потерь – в котором, изображения после декомпресии будет восстановлено с точностью до бита;
  2. с потерями – который не уменьшает качества картинки, просто в нем непосредственно перед сжатием, изображение переводится палитру YcbCr
    Только лишь за счет изменения палитры удается существенно улучшить сжатие. Использую следующие коэффициенты:
    cY = 0.30078125 * R + 0.5859375 * G + 0.11328125 * B
    cCb = -0.171875 * R - 0.33984375 * G + 0.51171875 * B + 128
    cCr = 0.51171875 * R - 0.4296875 * G - 0.08203125 * B + 128
Читать дальше →

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

Математическая морфология

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

Двадцать вопросов, которые помогают разработать алгоритм

Время на прочтение5 мин
Количество просмотров8.5K
Как разработать алгоритм, решающий сложную задачу? Многие считают, что для этого нужно «испытать озарение», что процесс этот не вполне рационален и зависит от творческой силы или таланта.

На самом деле решение любой задачи сводится к сбору информации о наблюдаемом объекте. Причем этот принцип применим как для решения самых сложных научно-исследовательских задач, так и для решения прикладных задач. Работа изобретателя напоминает не столько работу волшебника, сколько путешествие первооткрывателя по неизведанной территории. Главное качество хорошего изобретателя – умение собирать информацию.

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

Персистентные структуры, часть 1: персистентный стек

Время на прочтение3 мин
Количество просмотров41K
Я заметил, что на хабре было достаточно много постов о таких классических структурах данных, как стек, очередь, хип; рассматривались так же дерево отрезков и множество различных деревьев поиска, но очень мало внимания уделялось персистентным структурам данных. В этом цикле статей я хотел бы поговорить как раз о них. Так уж сложилось, что я достаточно давно занимаюсь олимпиадным программированием, так что рассматривать я их буду с точки зрения моего опыта применения персистентных структур в этой области.
Читать дальше →

Четырехмерный рендеринг: особенности, проблемы, варианты решения

Время на прочтение4 мин
Количество просмотров5.6K


В комментариях к статье «Рейтрейсер на JavaScript» ее автор ankh1989 рассказал о планах написать рейтрейсер для четырехмерного пространства. Кое-какие свои мысли на эту тему я попробую изложить здесь.

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

Кластеризация палитры изображения и сжатие в формате PNG

Время на прочтение7 мин
Количество просмотров15K

Аннотация


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

Весенний семестр 2011 в Computer Science клубе в Санкт-Петербурге и Екатеринбурге

Время на прочтение2 мин
Количество просмотров1.3K


Весенний семестр в Computer Science клубе будет довольно алгоритмическим.

Курсы


В. Л. Ерухимов
Компьютерное зрение и библиотека OpenCV
Санкт-Петербург
3 пары, начало: 20.02
Д. Н. Москвин
Системы типизации лямбда-исчисления
Санкт-Петербург
12 пар, начало: 27.02
Ф. Фомин
Параметризованные
алгоритмы

Санкт-Петербург
4 пары, начало: 19.03
М. Бабенко
Линейное программирование
Санкт-Петербург
10 пар, начало: 16.04
М. Н. Вялый
Квантовые алгоритмы: возможности и ограничения
Санкт-Петербург
10 пар, начало: 02.04
П. Браславский
Анализ поисковых запросов
Екатеринбург
3 пар, начало: 13.05
Д. С. Перевалов
Что может и не может компьютерное зрение с OpenCV
Екатеринбург
2 пары, начало: 17.02
М. Ю. Хачай
Теоретические основы распознавания образов
Екатеринбург
6 пар, начало: 03.03
А. М. Райгородский
Случайные графы и алгоритмы
Екатеринбург
6 пар, начало: 18.03
М. А. Ройтберг
Анализ символьных последовательностей
Екатеринбург
6 пар, начало: 21.04


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

Защита JPEG от повторного сжатия

Время на прочтение1 мин
Количество просмотров2.6K
Многие фотохостинги и веб-прокси пережимают файлы JPEG для ускорения загрузки. В связи с этим у специалистов из Кембриджа появилась идея адаптировать известный алгоритм Товальдса по защите купюр от копирования к JPEG-изображениям. Они разработали сетку, которая генерирует муар при повторном сжатии (демонстрация на примере Google WAP прокси).
Оригинальное изображение После рекомпрессии
Если вы находитесь за файрволом с рекомпрессиией, то надпись VOID будет на обоих изображениях.
Читать дальше →

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