
Алгоритмы *
Все об алгоритмах
Двадцать вопросов, которые помогают разработать алгоритм
На самом деле решение любой задачи сводится к сбору информации о наблюдаемом объекте. Причем этот принцип применим как для решения самых сложных научно-исследовательских задач, так и для решения прикладных задач. Работа изобретателя напоминает не столько работу волшебника, сколько путешествие первооткрывателя по неизведанной территории. Главное качество хорошего изобретателя – умение собирать информацию.
Если вы хотите решить сложную задачу, собирайте информацию в самых разных направлениях. Ответив на следующие 20 вопросов, вы легко выстроите план работы над задачей.
Персистентные структуры, часть 1: персистентный стек
Четырехмерный рендеринг: особенности, проблемы, варианты решения

В комментариях к статье «Рейтрейсер на JavaScript» ее автор ankh1989 рассказал о планах написать рейтрейсер для четырехмерного пространства. Кое-какие свои мысли на эту тему я попробую изложить здесь.
Кластеризация палитры изображения и сжатие в формате PNG
Аннотация
В данной статье читателю предлагается опыт разработки алгоритма сжатия изображения, хранящегося в формате PNG. Сжатие осуществляется за счет квантования палитры с использованием классификатора К–внутригрупповых средних. Приводится исходный код алгоритма, написанный на языке Java. Указываются проблемы и дальнейшие пути улучшения алгоритма.
Весенний семестр 2011 в Computer Science клубе в Санкт-Петербурге и Екатеринбурге

Весенний семестр в 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 от повторного сжатия
| Оригинальное изображение | После рекомпрессии |
![]() |
![]() |
Поиск подстроки и смежные вопросы
Lua vs. JavaScript

Недавно я написал пост о том как сделать рейтрейсер. Код рейтрейсера тогда был написан на JavaScript. Мне стало интересно, как с этой же задачей справится Lua, а именно LuaJIT 2.0. Ниже результаты сравнения.
Подсчёт объектов на изображении
Динамическое программирование. Классические задачи
Во многих олимпиадных задачах по программированию решение с помощью рекурсии или полного перебора требует выполнения очень большого числа операций. Попытка решить такие задачи, например, полным перебором, приводит к превышению времени выполнения.
Однако среди переборных и некоторых других задач можно выделить класс задач, обладающих одним хорошим свойством: имея решения некоторых подзадач (например, для меньшего числа n), можно практически без перебора найти решение исходной задачи.
Такие задачи решают методом динамического программирования, а под самим динамическим программированием понимают сведение задачи к подзадачам.
Алгоритм Мамдани в системах нечеткого вывода
Введение
Так уж повелось, что любую статью о нечеткой логике принято начинать с упоминания имени Лотфи Заде. И я не стану исключением. Дело в том, что этот человек стал не только отцом-основателем целой научной теории, написав в 1965 году фундаментальный труд «Fuzzy Sets», но и проработал различные возможности ее практического применения. Он описал свой подход в 1973 году в тексте «Outline of a New Approach to the Analysis of Complex Systems and Decision Processes» (опубликованном в журнале IEEE Transactions on Systems). Примечательно, что сразу после его выхода одна предприимчивая датская фирма весьма успешно применила изложенные в нем принципы для усовершенствования своей системы управления сложным производственным процессом.
Но при всех заслугах Л. Заде, не менее важный вклад внесли последователи этой теории. Например, английский математик Э. Мамдани (Ebrahim Mamdani). В 1975 году он разработал алгоритм, который был предложен в качестве метода для управления паровым двигателем. Предложенный им алгоритм, основанный на нечетком логическом выводе, позволил избежать чрезмерно большого объема вычислений и был по достоинству оценен специалистами. Этот алгоритм в настоящее время получил наибольшее практическое применение в задачах нечеткого моделирования.
LSB стеганография
Сегодня мы попробуем копнуть чуть-чуть глубже и рассмотрим алгоритм LSB. Если вам интересно, милости прошу под кат. (Под катом трафик: около мегабайта.)
Ближайшие события
Рейтрейсер на JavaScript

Знаете ли вы что такое рейтрейсер? Это программа которая рисует трёхмерную сцену на экране так, как её бы увидели вы. Конечно, не совсем так, но некоторые рейтрейсеры умеют рисовать очень правдоподобные картинки, например как в "Аватаре".
Идея рейтрейсера очень простая и в этой статье я раcскажу как устроен этот алгоритм и даже напишу его на JavaScript. Картинки и пример прилагаются.
Сам себе АппСтор

Хабростарожилы могут припомнить часы Синхрон, о которых однажды уже шла речь на Хабре.
Много воды утекло со дня зарождения идеи: часы успели побывать и в роли хранителя экрана, и в роли виджета, одним словом, пережить множество реинкарнаций.
Дошла очередь и до мобильной платформы. Так или иначе, целью стала iOS.
Как известно, современный путь на эту платформу лежит через Xcode и AppStore, что требует определённых душевных и финансовых вложений.
Однако, если припомнить смутное время выхода первого (точнее второго) «КПК» от яблочной компании (на всякий случай, речь про iPhone 1), то вспомнится бурная дискуссия, о том, как же так можно, чтобы приложения для него были ничем иным как простыми web-приложениями — обычным нагромождением HTML/CSS/JS и тому подобным. Как раз то, что нам и нужно!
Дерево Фенвика
Что это?
Дерево Фенвика — это структура данных, дерево на массиве, которая обладает следующими свойствами:
• позволяет вычислять значение некоторой обратимой операции F на любом отрезке [L; R] за логарифмическое время;
• позволяет изменять значение любого элемента за O(log N);
• требует памяти O(N);
Как устроен AES
О чём эта статья
Долгое время я считал, что криптографические алгоритмы шифрования и хеширования, вроде AES и MD5, устроены очень сложно и написать их совсем не просто, даже имея под рукой полную документацию. Запутанные реализации этих алгоритмов на разных языках программирования только укрепляли это мнение. Но недавно у меня появилось много свободного времени и я решил разобраться в этих алгоритмах и написать их. Оказалось, что они очень просто устроены и для их реализации нужно совсем немного времени.
В этой статье я напишу как устроен алгоритм шифрования AES (которого иногда называют Rijndael) и напишу его на JavaScript. Почему на JavaScript? Чтобы запустить программу на этом языке, нужен только браузер в котором вы читаете эту статью. Чтобы запустить программу, скажем, на C, нужен компилятор и найдётся совсем мало желающих, готовых потратить время на компиляцию кода из какой то статьи. В конце есть ссылка по которой можно скачать архив с html страницей и несколькими js файлами — это пример реализации AES на JavaScript.
Так сколько шариков для гольфа действительно поместится в школьный автобус?

Там читатель берет объем автобуса, делит на объем шарика и получает количество шаров. Вычитает, правда, какое-то количество, учитывая, что там есть «сиденья и прочая ерунда, занимающая свободное место, а также сферическая форма мяча означает, что будет достаточно много свободного места между ними». Правильно ли он учел?
Давайте разберемся.
Структуры данных: двоичная куча (binary heap)
Для дальнейшего чтения необходимо иметь представление о деревьях, а также желательно знать об оценке сложности алгоритмов. Алгоритмы в этой статье будут сопровождаться кодом на C#.
Введение
Двоичная куча представляет собой полное бинарное дерево, для которого выполняется основное свойство кучи: приоритет каждой вершины больше приоритетов её потомков. В простейшем случае приоритет каждой вершины можно считать равным её значению. В таком случае структура называется max-heap, поскольку корень поддерева является максимумом из значений элементов поддерева. В этой статье для простоты используется именно такое представление. Напомню также, что дерево называется полным бинарным, если у каждой вершины есть не более двух потомков, а заполнение уровней вершин идет сверху вниз (в пределах одного уровня – слева направо).

XSD: частичная валидация
Вклад авторов
alizar 2996.5ZlodeiBaal 1564.0Fil 1460.0agorkov 1345.0haqreu 1310.0Leono 1086.0YUVladimir 1037.0valemak 1014.0mephistopheies 996.0Zalina 922.0











