Как стать автором
Поиск
Написать публикацию
Обновить
96.04

Алгоритмы *

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

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

Рекурсивные функции — создание собственной математики (Scala)

Время на прочтение10 мин
Количество просмотров17K
Добрый день, Хабр!

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

1. Рекурсивные функции — что это?


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

Упаковка в контейнеры (bin packing) при помощи генетического алгоритма

Время на прочтение5 мин
Количество просмотров19K
Доброго времени суток, коллеги.
Этой статьей я продолжаю цикл посвященный EvoJ — Java фреймворку для решения задач генетическим алгоритмом.
В своей предыдущей заметке я познакомил читателей Хабра с основными принципами работы с EvoJ.

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

Наработки к планированию процессов в ОСРВ

Время на прочтение3 мин
Количество просмотров2.1K
Закончив изучение Таненбаума и ковыряние ядра Linux решил, что надо заняться чем-то дельным. По личным мотивам решил переделать ядро minix3 под планирование в жёстком реальном времени. Множество существующих алгоритмов планирования ввели меня в уныние, тем более, что хочется сделать ОС максимально универсальной и гибкой. Зацикленность на клиент-серверной модели привели к идеи о вынесении из ядра ОС механизмов планирования и разделение процессов на группы, управляемые: каждая своим планировщиком (в режиме ядра оставить только обработку deadline).
Основная проблема, которая стала очевидной сразу же — это выбор математической модели для построения алгоритма планирования. Очевидно, что подход разделения общего ресурса можно рассмотреть в аналогии с сетевыми протоколами разделения общего физического пространства.
Читать дальше →

Алгоритмическая ошибка привела к аварии самолёта

Время на прочтение3 мин
Количество просмотров18K
Недавно, 19 декабря 2011г, Австралийское бюро по безопасности на транспорте выпустило отчёт об авиационном происшествии с самолётом А-330 (б/н VH-QPA) авиакомпании Qantas, которое произошло 7 октября 2008г.

image
(фотография Stefan Roesh planepictures.net)

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

Интернет-Математика: Итоги

Время на прочтение1 мин
Количество просмотров1.5K
Как вы наверно помните Яндекс с 22 октября по 22 декабря проводил конкурс Интернет-Математика (анонс был здесь, страница конкурса здесь). Сейчас мы уже подвели итоги конкурса и определили призеров:

1й приз: keinorhasen team, Botao Hu (Hong Kong University of Science and Technology), Nathan N. Liu (Hong Kong University of Science and Technology), Weizhu Chen (Microsoft Research Asia, Hong Kong University of Science and Technology)

2й приз: mmp team, Михаил Фигурнов (Московский Государственный Университет), Александр Кириллов (Московский Государственный Университет)

3й приз: S-n-D team, Сергей Гуда (Южный Федеральный Университет), Денис Рябов (Южный Федеральный Университет)

По итогам конкурса на одной из ведущих конференций по веб поиску WSDM 2012 был проведен семинар WSCD 2012 (на странице можно ознакомиться с отчетами участников).

Ждите анонсов следующих конкурсов

Sqrt-декомпозиция (корневая оптимизация)

Время на прочтение3 мин
Количество просмотров24K
Sqrt-декомпозиция — это метод, или структура данных, позволяющая в режиме онлайн проводить такие операции, как подсчет суммы на отрезке за image и обновление элемента за image. Существуют более эффективные структуры, такие как дерево фенвика или дерево отрезков, которые оба запроса обрабатывают за image. Однако я хочу рассказать про корневую оптимизацию, т.к. в этом методе заложена идея, применимая к задачам другого типа.


Постановка задачи

Пусть нам задан массив A[i], на который поступают запросы вида:
  • посчитать сумму на отрезке [L; R] (позже, мы поймем, что аналогично можно вычислять функции min, max, gcd и др.
  • добавить к элементу A[i], delta
Наивная реализация

Мы можем предрасчитать массив частичных сумм, а именно:
 for(int j = 0; j < i; j++) B[j] += A[i];
и тогда на запрос суммы [L; R], мы будем возвращать B[R]-B[L-1] за image. Однако на запрос изменения, потребует пересчета частичных сумм (содержащих этот элемент) и в худшем случае составит асимптотику порядка image, что не есть хорошо.
Читать дальше →

Алгоритмы в биоинформатике ч.1

Время на прочтение9 мин
Количество просмотров9.9K
bioinformatic    В предыдущих статьях (1,2) мы познакомились с тем, как могут выглядеть данные в зависимости от проведенного биологического эксперимента. На основании этих визуализированных данных были сделаны предположения о том, что же происходит внутри клетки. Теперь остановимся на том, как математически и алгоритмически проанализировать данные для того, чтобы машины за нас могли выполнить рутинную работу. К сожалению, после прочтения множества статей по анализу данных у меня сложилось впечатление, что однозначного или наиболее универсального решения не существует. Есть алгоритмы, которые хорошо себя показывают на некотором наборе данных, а в других случаях уже не отвечают поставленным задачам.
Читать дальше →

EvoJ — удобный фреймворк для генетических алгоритмов

Время на прочтение7 мин
Количество просмотров5.7K
Здравствуйте, коллеги!

Здесь часто появляются статьи на тему генетических алгоритмов, разрешите и мне внести свои пять копеек.

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

Кластеризация точек на основе регулярной сети

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

В данной статье я рассмотрю два алгоритма, первый — непосредственно кластеризация, второй — построение контура кластера в виде выпуклого многоугольника, прикладная задача для улучшеного восприятия полученного результата.

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

Распределенные эволюционные вычисления

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


Одна из моих любимых тем в программировании – эволюционные вычисления и генетические алгоритмы в частности. Пару лет назад я поднимал эту (в целом уже заезженную) тему на Хабре, но сейчас глядя на то видео немного стыдно – слишком уж туманно и сумбурно было объяснение.

Сегодня я постараюсь объяснить генетические алгоритмы проще и нагляднее, а заодно рассказать вкратце о прототипе очень простого JavaScript-фреймворка для распределенных генетических вычислений degas.js. В двух словах – degas.js запускает генетический алгоритм в виде «треда» в браузере клиента используя web workers и обменивается информацией о полученных в ходе эволюции индивидуумах с сервером и другими клиентами с помощью web sockets. Сервер использует node.js.

Degas.js пока в супер-зародышевом состоянии, функционал еще примитивен, а код некрасив, но если кто-то захочет присоединиться к разработке – было бы здорово.

Сортировка слиянием без использования дополнительной памяти

Время на прочтение4 мин
Количество просмотров40K
Я долгое время думал, что написать сортировку массива слиянием так, чтобы она не использовала дополнительной памяти, но чтобы время работы оставалось равным O(N*log(N)), невозможно. Поэтому, когда karlicos поделился ссылкой на описание такого алгоритма, меня это заинтересовало. Поиск по сети показал, что про алгоритм люди знают, но никто им особо не интересуется, его считают сложным и малоэффективным. Хотя, может быть, они имеют в виду какую-то «стабильную» версию этого алгоритма, но нестабильная при этом все равно никому не нужна.

Но я все-таки решил попробовать.

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

Генетические алгоритмы. От теории к практике

Время на прочтение6 мин
Количество просмотров64K
Добрый день. В последнее время решил заняться самообразованием. Решено было начать с генетических алгоритмов.

Одно из замечатльных свойств ГА это то, что процедуры Селекции, Скрещивания и Мутации представления не имеют о Индивидах в Поколениях — для них это всего-лишь 0 и 1. Единстенная функция, которая знает, что же из себя представляют эти самые 0 и 1 — это ФитнессФункция.

Поэтому я решил, что было бы неплохо написать класс-каркас для любого ГА. Об это и будет данная статья. Предполагается, что вы уже знакомы с основами генетических алгоритмов.

Кому интресно, прошу под кат.
Читать дальше →

Алгоритм Ляна-Кнута для расстановки мягких переносов

Время на прочтение4 мин
Количество просмотров13K
При работе с текстом часто возникает потребность корректно расставить переносы. Задача на первый взгляд не такая уж очевидная, нужно учитывать особенности каждого языка, чтобы решить, в каком месте разорвать слово. Как правильно формализовать такие требования, и как потом применить их в алгоритме? Одно из самых распространенных на сей день решений предложил Франклин Марк Лян, студент известного профессора Дональда Кнута. Алгоритм так и называется – «Алгоритм Ляна-Кнута», он применяется в издательской системе TeX, автор которой опять же Д. Кнут.

Алгоритм основан на сравнении исходного слова с набором правил (шаблонов). Чем больше правил и чем качественнее они составлены, тем лучше будут расставляться переносы. В пакете TeX можно найти готовые бесплатные наборы правил для многих языков, нужно только внимательно смотреть на условия использования и распространения.
Узнать больше

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

Раскраска матрицы 17х17 четырьмя цветами без монохроматических прямоугольников

Время на прочтение2 мин
Количество просмотров3.1K
Что удивительного в этой картинке?



На самом деле она уникальна. Матрица размером 17 х 17 раскрашена четырьмя цветами, при этом на ней нельзя построить ни единого (!) прямоугольника, чтобы все углы его были одного цвета. Имеются в виду прямоугольники любого размера с вершинами в разных точках и рёбрами, параллельными осям x и y.
Читать дальше →

Псевдослучайно vs. По-настоящему Случайно

Время на прочтение2 мин
Количество просмотров35K
Ниже перевод статьи Бо Аллена отсюда.

Простой наглядный пример

Однажды я наткнулся на Random.org, классный сервис генератора настоящих случайных чисел. Разница между генератором настоящих случайных чисел (ГНСЧ) и генератором псевдослучайных чисел (ГПСЧ) в том, что ГНСЧ использует непредсказуемые физические средства для генерации чисел (например шумы атмосферы), а ГПСЧ использует математические алгоритмы (полностью производимые компьютером). Об этом можно более подробно узнать на Random.org (англ.) и в Википедии (англ.).
Читать дальше →

Определение доминирующих тонов на изображении [v 1.1]

Время на прочтение2 мин
Количество просмотров53K
После публикации прошлой статьи, я полностью забил на попытку выполнить алгоритм при помощи HSV или Lab координат. Забил на использовании библиотек цветов и вообще на сам скрипт забил.

Но что-то стало скучно и опять зачесались руки поработать с изображениями и одновременно захотелось исправить уже имеющийся алгоритм.
Скрипт: link

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

Как я создавал синтаксический анализатор

Время на прочтение5 мин
Количество просмотров37K
Для одного из моих проектов потребовалась интересная фича — перефразирование текста, позволяющего, к примеру, фразу “корова паслась на лугу” переделать в “пятнистая буренка жевала сочную траву на зеленом лугу”. Конечно же, подобного рода преобразования требуют очень большую базу связей между словами и выражениями, отсутствие которой и свело на нет всю работу. Но это уже другая история. Сейчас же я расскажу о том, как решал вопрос синтаксического анализа предложений, которые затем должны были преобразоваться во что-то новое, но такое же человекочитаемое.
Читать дальше →

Алгоритм Шеннона-Фано

Время на прочтение2 мин
Количество просмотров111K
Алгоритм метода Шеннона-Фано — один из первых алгоритмов сжатия, который впервые сформулировали американские учёные Шеннон и Фано, и он имеет большое сходство с алгоритмом Хаффмана. Алгоритм основан на частоте повторения. Так, часто встречающийся символ кодируется кодом меньшей длины, а редко встречающийся — кодом большей длины.
В свою очередь, коды, полученные при кодировании, префиксные. Это и позволяет однозначно декодировать любую последовательность кодовых слов. Но все это вступление.
Читать дальше →

Узбекский математик Б.Пономарев разгадал теорему Ферма! Проверим?

Время на прочтение3 мин
Количество просмотров12K
Давным-давно в 1637 году Пьер Ферма имел глупость написать на полях «Арифметики» Диофанта следующее: «… невозможно разложить куб на два куба, биквадрат на два биквадрата и вообще никакую степень, большую квадрата, на две степени с тем же показателем. Я нашел этому поистине чудесное доказательство, но поля книги слишком узки для него».

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

Несмотря на это, она была полностью доказана лишь в 1995 году, используя теории эллиптических кривых.

Недавно сразу несколько достаточно авторитетных по местным меркам новостных порталов взорвала новость: Узбекский математик разгадал теорему Ферма — Математик из Ташкента Борис Пономарев утверждает, что отыскал «простое оригинальное доказательство» Великой теоремы Ферма — загадки, над которой ученые всего мира бьются вот уже 350 лет (например, здесь, здесь и здесь). В одной из них даже было приведено доказательство.
Читать дальше →

Еще раз о поиске наибольшего сгущения в облаке точек

Время на прочтение4 мин
Количество просмотров7.5K
В очередной раз мне попалась задача – найти в облаке точек место их наибольшего сгущения. На этот раз ситуация была такой:
  • есть некоторое количество (можно считать, что не более 16 миллионов) измерений набора параметров. Число параметров в наборе – от 2 до 5.
  • измерение параметров может быть относительно успешным – тогда их результат будет неподалеку от истинного (параметры и тип распределения неизвестны), либо не успешным – тогда результат будет случайным (опять-таки с неизвестными параметрами распределения). Определить по одиночному измерению, было ли оно успешным, нельзя.
  • Можно считать, что точка сгущения существует. Если их несколько с близким качеством (которое формально так и не определяется), можно выдать любую.
  • ответ нужно дать за один проход по исходным данным: перевычислять их или сохранять целиком – дорого.
  • И, как обычно, хочется, чтобы алгоритм выглядел попроще, а работал побыстрее.

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

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