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

Алгоритмы *

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

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

Реализация метода принятия решений в экспертных группах

Уровень сложностиСредний
Время на прочтение6 мин
Количество просмотров1.4K

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

Принять решение

Глубокое обучение: Слой линейного преобразования и полносвязная нейросеть. Теория и реализация на самодельном autograd

Уровень сложностиПростой
Время на прочтение14 мин
Количество просмотров2.8K

Всем привет. В этой статье я расскажу про слой линейного преобразования. Идею для реализации я взял из книги «Грокаем глубокое обучение». Здесь рассмотрим как использовать самодельный алгоритм автоматического дифференцирования при создании и обучении нейросети, про который я сделал разбор ранее.

Меня зовут Алмаз Хуснутдинов. Я занимаюсь проектом "Теория цифрового интеллекта" - бесплатный и открытый проект, направленный на развитие мышления в направлении создания программы, обладающей интеллектом.

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

Содержание: идея слоя прямого распространения, новые операции: операция умножения и деления матрицы на число, линейный слой и дополнительный функционал, задача «логическое или», как происходит обучение линейного слоя и набор данных digits.

Читать далее

Инвентарь в Godot

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

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

Читать далее

Как мы ускоряли виртуальные фоны в Толке

Уровень сложностиСредний
Время на прочтение4 мин
Количество просмотров1.6K

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

Читать далее

Модель составного полупростого числа

Уровень сложностиСредний
Время на прочтение12 мин
Количество просмотров933

В предлагаемой статье приводится полная списочная многострочная модель (СММ) составного полупростого числа N и перечень вопросов, сопровождающих ее описание. Ответы на вопросы предлагается находить самим читателям. Найденные правильные ответы, либо комментируемые другими читателями, обеспечат глубокое понимание проблем, связанных с подобными числами и задачами. Выбор самих чисел предопределен их широким использованием в области информационной безопасности.
Рассматривая строки модели, особенно ее средней части читателя могут удивлять появления в строках квадратичных вычетов полных квадратов, возникающие интервалы между строками с кратными значениями делителей числа N, поведение средних вычетов и, возможно, что-то еще.

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

Для моделирования выбрана простая зависимость (линейная) N = х1 + хо. Очевидно, что список представлений такой модели конечен, и для чисел ограниченного размера может быть легко построен в форме таблицы, содержащей S =½ (N –1) строк. Модель названа списочной многострочной моделью и кратко обозначается (СММ, СМ-модель).

Читать далее

Решение головоломки Fillwords на Python

Уровень сложностиПростой
Время на прочтение19 мин
Количество просмотров2.6K

Игра Fillwords популярна благодаря своей простоте и увлекательности: она развивает словарный запас, тренирует внимательность и логику. Миллионы игроков по всему миру используют её как способ расслабиться и одновременно размять мозг, а сложные уровни делают процесс поиска слов настоящим вызовом.

Играя в Fillwords, я заметил, что сложные уровни требуют всё больше времени. Это натолкнуло меня на идею создать программу-помощник на Python.

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

Читать далее

Задача о рюкзаке. Простое решение, но где-то должен быть подвох

Уровень сложностиСредний
Время на прочтение15 мин
Количество просмотров3.8K

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

Читать далее

SQL HowTo: подбираем значение ветвлением (Advent of Code 2024, Day 17: Chronospatial Computer)

Уровень сложностиПростой
Время на прочтение10 мин
Количество просмотров1.2K

В этой челлендж-серии статей попробуем использовать PostgreSQL как среду для решения задач Advent of Code 2024.

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

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

Читать далее

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

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

"Лежит на струнах пыль
Ржавеет под окном
Разбитый телевизор
Ты сгладил все углы
И жизнь твоя сплошной
Проклятый компромисс
Ни вверх ни вниз"

Так поёт группа Би-2 в песне "Компромисс" и с ними трудно не согласиться. Наша жизнь действительно состоит из сплошных проклятых компромиссов между несколькими решениями. Мы пытаемся найти максимально дешёвую, но качественную электронику, ищем экономичный, но быстрый автомобиль и красивого, но надёжного партнёра для отношений.

Каждая из этих повседневных задач заключается в поиске оптимума нескольких конфликтующих между собой функций. Это называется многокритериальная оптимизация (Multi-objective optimization). В этой статье мы ближе познакомимся с этой задачей, посмотрим на 2 популярных метода её решения и узнаем, как с её помощью заработать на криптовалюте с минимальным риском.

Читать далее

Kotlin Coroutines под капотом: CoroutineContext и CoroutineScope

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

Structured Concurrency это одна из главных фишек Kotlin Coroutines, позволяющая оперировать иерархиями корутин через единый интерфейс, благодаря такой организации можно легко отменить сразу все корутины, имея ссылку только на самый высокоуровневый объект. В этой статье я разберу две базовые штуки на основе которых строится Structured Concurrency - CoroutineContext и CoroutineScope. Поехали!

Читать далее

B-Tree — сбалансированный куст поиска

Уровень сложностиСложный
Время на прочтение22 мин
Количество просмотров3.4K

В реляционных СУБД есть дефолтный тип индекса — B‑Tree: Tree в названии однозначно указывает на дерево, ну а В это, наверно, Binary? Или Balanced? Или Balanced Binary? Почему‑то долгое время я полагал, что это Balanced Binary, и эта версия даже «работала». На деле всё куда интереснее, предлагаю проследовать под кат, чтобы посмотреть на этот на самом деле скорее низкорослый куст и сравнить его с Red‑Black Tree на Java.

Точно куст?

Как уместить поиск по 30 тысячам слов в 64 КБ ОЗУ

Уровень сложностиСредний
Время на прочтение17 мин
Количество просмотров9.5K

Как уместить словарь размером 250 КБ в 64 КБ ОЗУ с возможностью выполнения быстрого поиска? Для справки: даже современные методики сжатия наподобие gzip -9 не могут сжать этот файл до размера меньше 85 КБ.

В 1970-х Дуглас Макилрой столкнулся с этой непростой задачей при реализации проверки правописания для Unix в AT&T. Из-за ограничений компьютера PDP-11 весь словарь должен был умещаться всего в 64 КБ ОЗУ. Кажется, подобную задачу решить невозможно.

Вместо того, чтобы использовать стандартные методики сжатия, Дуглас воспользовался преимуществами свойств данных, разработав алгоритм сжатия, отличавшийся от теоретического минимума сжатия всего на 0,03 бита. И по сей день этот рекорд остаётся непревзойдённым.

История spell в Unix — это не только любопытный исторический факт. Это мастер-класс по проектированию в условиях жёстких ограничений: анализа первооснов задачи, применения математических наблюдений и проектирования изящных решений, работающих в условиях строгого дефицита ресурсов.

Читать далее

Судоку: моя попытка в новый алгоритм решения. Часть 2. Заполнение латинского квадрата

Уровень сложностиСредний
Время на прочтение28 мин
Количество просмотров1.3K

Итак, это продолжение моих попыток в новый алгоритм решения Судоку. Начало было тут, на текущий мой взгляд довольно глупое и неудачное.

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

Читать далее

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

Фильтр Гаусса на стероидах: подход на точность вычислений

Уровень сложностиСредний
Время на прочтение7 мин
Количество просмотров2K

Hello, world! Это вторая часть хабростатьи Smart Engines про быструю фильтрацию изображений. Да-да, создавая топовый продукт по распознаванию документов, нам приходится разбираться в методах обработки изображений на экспертном уровне (иначе не получилось бы распознать изображение паспорта за 150 мс на мобильном телефон). В предыдущей части мы начали обсуждать быстрые аппроксимации гауссовского фильтра, которым была посвящена наша недавняя публикация в научном журнале MDPI Applied Sciences [1]. О том, как работает оригинальный фильтр Гаусса, мы уже писали, сейчас мы только напомним о его использовании всюду, где возникает обработка изображений: от редактирования фотографий на смартфоне – для размытия фона за объектом в режиме "портрет", до анализа рентгеновских снимков – чтобы убрать шум и улучшить читаемость изображения.

Читать далее

Калькулятор? Да его напишет кто угодно

Уровень сложностиПростой
Время на прочтение7 мин
Количество просмотров50K

[Прим. пер.: на Хабре уже был перевод этой статьи, но незавершённый примерно на четверть.]

Неправда.

Калькулятор должен показывать результат введённого математического выражения. А это намно-о-ого сложнее, чем кажется.

В этом посте я расскажу величайшую историю о разработке приложения-калькулятора.

На изображении выше показан калькулятор из iOS.

Заметили что-нибудь?

Он посчитал неправильно.

(10100) + 1 − (10100) равно 1, а не 0.

Android считает правильно. А причина, по которой он это делает, абсолютно безумна.

Читать далее

Компилятор за выходные: синтаксический анализатор Уорли

Уровень сложностиСредний
Время на прочтение11 мин
Количество просмотров5.8K

Изначально, когда я решил написать компилятор за выходные, я решил, что нет смысла заморачиваться, и использовал сторонний лексический / синтаксический анализатор. Мой выбор пал на SLY, довольно известную библиотеку. И действительно, пара часов работы, и мой компилятор прекрасно строил синтаксические деревья из исходного кода на wend. Я пытался было заглянуть под капот, утонул в море технических терминов (LL(1), LR, LALR(1) и тому подобное), и решил, что парсинг своими руками - это не для меня, теория формальных языков меня слабо интересует. Однако же в итоге выяснилось, что базовый синтаксический анализатор - это не так сложно, и я закатал рукава.

Читать далее

Сгенерировать 100 млн случайных строк менее чем за минуту

Уровень сложностиСредний
Время на прочтение5 мин
Количество просмотров8.3K

Зачастую в программисткой практике необходимо нагенерировать множество случайных строк. Либо для тестового примера, либо как источник обезличивания, либо просто, чтобы наполнить разработческую БД. Задача, в принципе, понятная и легкая для любого уровня программиста. Но если это нужно сделать быстро, например, если набор случайных строк нужен здесь и сейчас, то можно использовать предлагаемое решение. Строки получаются разной длины, со 100%-ной хаотичностью (полностью несортированные). Выглядят эти строки вот так (спойлер):

Читать далее

AStar Pathfinding для агентов различного размера с использованием пространственного хэширования

Уровень сложностиСредний
Время на прочтение10 мин
Количество просмотров1.6K

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

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

Но когда речь заходит о поддержке агентов, обладающих разным радиусом, увы, информации не так много.

Данный пробел я постараюсь восполнить в рамках этой статьи.

Читать далее

Простыми словами о методе максимального правдоподобия и информации Фишера

Уровень сложностиСредний
Время на прочтение17 мин
Количество просмотров16K

Всем привет👋🏻

Сегодня я хотел бы рассказать про метод максимального правдоподобия и информацию Фишера и еще несколько смежных тем, которые активно используются в машинном обучении и анализе данных. Расскажу я об этом просто, понятно и без воды, но с практическими примерами, в том числе на Python.

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

Присаживайтесь поудобнее, заварите кофейку и запаситесь печеньки, нам предстоит интересный путь🍪

Go little rockstar⭐

Смогу ли я уложить оптимизирующий компилятор в тысячу строк питона? Прогон первый: mem2reg

Уровень сложностиСредний
Время на прочтение22 мин
Количество просмотров4.4K

Год назад мне пришлось взять на себя курс лекций по теории компиляторов. Вы встречались некомпетентными преподавателями? Это я, здравствуйте! Прежде чем учить других, я всё-таки решил заглянуть в учебник сам, и это вылилось в серию статей "компилятор за выходные" (да, я помню, что за мной должок с описанием лексера/парсера). В итоге я уложил компилятор со мной придуманного си-подобного языка на GNU ассемблер в шестьсот строк кода, причём без внешних зависимостей, включая парсинг.

Всё бы хорошо, вроде работает, но кажется, самое веселье осталось за бортом. Мой компилятор, по факту, это простой pretty print вокруг синтаксического дерева, подумаешь. А как работают оптимизирующие компиляторы? И поставил я себе задачу попробовать уложить игрушечный, но всё же рабочий оптимизирующий компилятор в тысячу строк кода. Как думаете, получится?

Итак, тема сегодняшнего разговора - вынос переменных из памяти в регистры, оно же оптимизационный проход mem2reg, см. кпдв.

Читать далее

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