Все потоки
Поиск
Написать публикацию
Обновить
170.92

Алгоритмы *

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

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

Алгоритмы не важны

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

Прошу простить заранее за несколько кликбейтный заголовок )

Не так давно писал в соцсетях хейт‑пост по поводу «алгоритмических секций» при приёме на работу в Яндекс.

Да и многие другие софтверные компании это практикуют и считают навыки написания алгоритмов — чуть ли не самым важным навыком для программистов.

И ставят данной компетенции очень высокий приоритет при приёме на работу.

Попробую сегодня развить эту мысль и объяснить почему ставить навыки написания алгоритмов на первый план — не правильно, почему этот «алгоритмический» критерий не релевантен и не отражает реальной ценности / уровня / потенциальной пользы от данного программиста.

Читать далее

Черкаш-код: изобретение и внедрение

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

Так вышло, что спустя более чем 20 лет работы связанной с IT мне захотелось заглянуть в другие области знаний и таковой стала юриспруденция. Поступление на заочку, учёба, множество открытий, о которых и не задумывался раньше, привели меня к очередному этапу - учебной практике. Практика длилась месяц полноценной работы (рабочий день чуть короче обычного) и, помимо прочего, столкнула меня с большим количеством папок с документами. Поковырявшись недельку с этим добром мне пришла простая идея по структуризации этого дела в виде внедрения черкаш-кода, о чём и поведаю в данной статье.

Читать далее

Что в голове у змейки? Обучение нейросети играть в «Snake» генетическим алгоритмом

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

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

«У самурая нет цели, есть только путь»

Первый блин на производстве не отличается красотой, но опыт был получен. Наиболее привлекательным мне пришелся генетический алгоритм: отбор успешных змеек, скрещивание, частичная мутация генов и так тысячи раз до результата. Змейки, без указания им правил выживания, в тысячном поколении «понимали», что нужно стремиться съесть яблоко и никуда не врезаться, это вызывало ощущение прикосновения к чуду "It's Alive!!!"

Спустя пару лет, закончив курс по аналитике данных, появилось желание переписать проект, попрактиковаться в более серьезных разделах python и сделать тренажёр со сбором статистики.

Читать далее

Молодые математики открывают новую главу в изучении простых чисел

Уровень сложностиПростой
Время на прочтение11 мин
Количество просмотров41K
Анимация отсева по Эратосфену, где показаны кратные величины каждого простого числа, простирающиеся вдоль числовой оси.

Более 2000 лет назад греческий математик Эратосфен разработал метод поиска простых чисел, получивший название решето Эратосфена, который остаётся актуальным по сей день. Его идея заключалась в том, чтобы определять простые числа вплоть до заданной точки путём постепенного «отсеивания» тех, которые таковыми не являются. Начинается отсев с вычёркивания всех чисел, кратных 2 (кроме самой 2), затем кратных 3 (кроме 3). Следующее число, 4, уже оказывается вычеркнуто, значит, очередным шагом идёт вычёркивание всех чисел, кратных 5 и так далее. Все оставшиеся в итоге числа считаются простыми, то есть такими, которые делятся только на 1 и на самих себя.

Эратосфен работал со всем множеством простых чисел, но вы можете использовать вариации его метода для поиска таких, которые будут обладать особыми свойствами. Хотите найти «близнецов», которые отличаются всего на 2 единицы, например, 11 и 13 или 599 и 601? Для этого есть свой отсев. Интересуют простые числа, которые на 1 больше полного квадрата, например, 17 или 257? И для этого тоже есть свой отсев.
Читать дальше →

Как рисуется карта в Фараоне

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

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

Городу нужно больше рабочих...

Нейронные сети для планирования движения беспилотных автомобилей

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

Планировщик движения беспилотного автомобиля — это алгоритм-помощник, который общается с другими участниками движения посредством манёвров. То есть он действует так, чтобы другим было понятно, куда поедет беспилотник, и сам по действиям других пытается определить, кто куда будет двигаться и почему.

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

Под катом — детальный разбор логики движения беспилотника, примеры свёрточных и трансформерных архитектур моделей для предсказания движения и много формул для расчёта вероятных траекторий других машин и пешеходов. А ещё я расскажу, в чём преимущества машинного обучения перед эвристиками и чем может помочь Reinforcement Learning.

Читать далее

Извлечение текста из файлов PDF при помощи Python

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

▍ Введение


В эпоху больших языковых моделей (Large Language Model, LLM) и постоянно расширяющейся сферы их применений непрерывно растёт и важность текстовых данных.

Существует множество типов документов, содержащих подобные виды неструктурированной информации, от веб-статей и постов в блогах до рукописных писем и стихов. Однако существенная часть этих данных хранится и передаётся в формате PDF. В частности, выяснилось, что за каждый год в Outlook открывают более двух миллиардов PDF, а в Google Drive и электронной почте ежедневно сохраняют 73 миллионов новых файлов PDF (2).

Поэтому разработка более систематического способа обработки этих документов и извлечения из них информации позволит нам автоматизировать процесс и лучше понять этот обширный объём текстовых данных. И в выполнении этой задачи, разумеется, нашим лучшим другом будет Python.
Читать дальше →

S3-FIFO: новый эффективный алгоритм вытеснения из кэша на основе очередей FIFO

Уровень сложностиСредний
Время на прочтение18 мин
Количество просмотров9.5K
В этой статье я расскажу о простом и масштабируемом (Simple, Scalable) алгоритме вытеснения данных из кэша на основе трёх статических (Static) очередей FIFO (S3-FIFO). После проверки на 6594 трассировках кэшей 14 компаний мы показали, что S3-FIFO имеет меньшую частоту промахов, чем 12 лучших алгоритмов, разработанных в прошлые десятилетия. Более того, эффективность S3-FIFO устойчива — он имеет наименьший средний показатель промахов для 10 из 14 датасетов. Использование очередей FIFO позволяет S3-FIFO достичь хорошей масштабируемости с пропускной способностью в шесть раз больше по сравнению с оптимизированным LRU в cachelib на 16 потоках.

Мы пришли к выводу, что доступ к большинству объектов в смещённых нагрузках кэша выполняется только за короткий промежуток времени, поэтому критически важно быстро вытеснять их из кэша. А главная особенность S3-FIFO — это небольшая очередь FIFO, отфильтровывающая большинство объектов, не давая им попасть в основной кэш.

Иллюстрация работы S3-FIFO (с использованием порогового значения перехода из маленького в основной кэш, равного 1)
Читать дальше →

Быстрый двоичный поиск без ветвления

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

Мои читатели — занятые люди, поэтому сразу перейду к делу. Вот она, самая быстрая обобщённая (и простая) реализация двоичного поиска на C++:

template <class ForwardIt, class T, class Compare>
constexpr ForwardIt sb_lower_bound(
      ForwardIt first, ForwardIt last, const T& value, Compare comp) {
   auto length = last - first;
   while (length > 0) {
      auto rem = length % 2;
      length /= 2;
      if (comp(first[length], value)) {
         first += length + rem;
      }
   }
   return first;
}

Тот же интерфейс функции, что и у std::lower_bound, но вдвое быстрее и короче. «Без ветвления», потому что if компилируется в команду условной передачи, а не в ветвление/условный переход. Ближе к концу статьи мы изучим опции компилятора и даже более быстрые версии полностью без ветвления. Для понимания этой статьи не нужны особые знания в C++. Достаточно понимать, что итераторы (first и last) по сути являются указателями на элементы массива, хотя могут указывать на один элемент дальше, чем последний элемент массива. Можете не обращать внимания на template, class, constexpr и &. Вот если бы существовал быстрый и чистый язык, работающий на уровне железа...1 2
Читать дальше →

Пишем самую тупую на свете сортировку

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

И это не пузырьковая, а нечто гораздо более тупое.

Как-то после обеда, стоя за чашечкой кофе, мне пришла в голову мысль. Что ведь для того чтобы убедиться что массив отсортирован, надо сделать `n-1` сравнение. Например для массива длины 4 таких сравнения будет 3:

Дальше тупее

Эти прекрасные древовидные карты (альтернатива pprint)

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

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

Как задачи на LeetCode прокачали меня как разработчика, или по-честному про алгоритмы

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

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

С тех пор у меня накопилось более 400 решённых задач на LeetCode. Теперь я уверена, что такие платформы как LeetCode, HackerRank или CodeWars, при правильном подходе, способны поднять профессиональные навыки любого разработчика на новый уровень.

Читать далее

Как работает хэширование

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

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

Хэш-функции фундаментальны и используются повсюду.

Но что же такое хэш-функции и как они работают?

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

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

Кодеки новой эпохи: HEVC, AV1, VVC и нейросети

Уровень сложностиСредний
Время на прочтение6 мин
Количество просмотров29K
Сжатие с учётом контекста, источник: WaveOne (сайт удалён)

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

В новом поколении кодеков алгоритмы машинного обучения используются для анализа и понимания визуального содержания видео, выявления избыточных данных и более эффективного сжатия. Вместо написанных вручную алгоритмов, тут применяют методы Software 2.0, основанные на обучении. Данная область развивается на протяжении десятилетий, но в последние годы получила сильный толчок. Все знают, что в 2017 году произошёл прорыв в разработке ИИ благодаря изобретению трансформеров. В свою очередь, они основаны на концепции внимания, которую придумали в 90-е. Эта техника впервые позволила соотносить друг с другом отдельные части текста или видеокадра.
Читать дальше →

Выбор структур данных для самописного текстового редактора

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

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

Ресурсы


Прежде чем мы приступим к разбору того, что я сделал, важно упомянуть очень полезные ресурсы для создания собственного текстового редактора:

  • Build Your Own Text Editor — наверно, самый фундаментальный пост о создании текстового редактора с нуля, который я видел. Это превосходный туториал на случай, если вы хотите начать писать собственный текстовый редактор. Стоит заметить, что в редакторе из этого туториала в качестве внутренней структуры для текста используется, по сути, вектор строк.
  • Text Editor: Data Structures — отличный обзор множества структур данных, которые можно использовать при реализации текстового редактора. (Спойлер: как минимум одна из них будет рассмотрена в моём посте)
  • Плейлист Ded (Text Editor) на YouTube — это потрясающая серия, в которой @tscoding фиксирует процесс создания с нуля текстового редактора. Эти видео стали для меня источником вдохновения.

Зачем?


Если в сети есть так много хороших ресурсов о создании собственного текстового редактора (не говоря уже о том, что уже существует множество феноменальных текстовых редакторов), то зачем я это пишу? На то есть несколько причин:

  1. Я хотел заняться проектом, непохожим ни на один свой прошлый.
  2. Я хотел создать инструмент, которым смогу пользоваться.
  3. Мне всегда хотелось глубже разобраться с созданием собственных структур данных.
Читать дальше →

Реализуем с нуля функцию косинуса на языке C

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

Я изучил, как реализовать функцию косинуса при помощи нескольких разных подходов. Одна из реализаций почти в три раза быстрее, чем math.h, но придётся смириться с точностью до четырёх знаков после запятой.

Задавались ли вы когда-нибудь вопросом, как в математической библиотеке вашего любимого языка программирования реализованы тригонометрические функции, например, косинус? Это настолько популярная функция, что её можно встретить в каждой математической библиотеке, поэтому реализация должна быть довольно простой, ведь так? Ну уж нет. Почти совершенно точно, что это не так.

Моё исследование началось с того, что мой друг и коллега Стивен Марц работал над ядром операционной системы и я предложил, чтобы он отрисовал на экране функцию косинуса. Я часто использую косинус в качестве «hello, world» для графических приложений. Возникла проблема: его ядро не задействовало стандартную библиотеку C (а значит, прощай math.h!), а целевой платформой являлась архитектура RISC-V (а значит, никаких подобий команды fcos Intel!).

Так началось моё долгое приключение.
Читать дальше →

Как устроено распределение памяти

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

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

В этом посте я познакомлю вас с основами распределения памяти (memory allocation). Распределители памяти существуют, потому что иметь доступную память недостаточно, необходимо ещё и эффективно её использовать. Мы наглядно изучим, как работают простые распределители. Мы рассмотрим некоторые из задач, которые им необходимо решать, а также некоторые из методик, которыми они их решают. Прочитав этот пост, вы узнаете всё, что необходимо для написания собственного распределителя.
Читать дальше →

Что делает ChatGPT… и почему это работает?

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

То, что ChatGPT может автоматически генерировать что-то, что хотя бы на первый взгляд похоже на написанный человеком текст, удивительно и неожиданно. Но как он это делает? И почему это работает? Цель этой статьи - дать приблизительное описание того, что происходит внутри ChatGPT, а затем исследовать, почему он может так хорошо справляться с созданием более-менее осмысленного текста. С самого начала я должен сказать, что собираюсь сосредоточиться на общей картине происходящего, и хотя я упомяну некоторые инженерные детали, но не буду глубоко в них вникать. (Примеры в статье применимы как к другим современным "большим языковым моделям" (LLM), так и к ChatGPT).

Читать далее

Как журналист помогает выявлять серийных убийц с помощью алгоритма

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

17 октября 2014 года в мотеле маленького городка Хаммонд, Индиана, был обнаружен труп 19 летней Африки Харди. Вызванные на место полицейские почти сразу пришли к выводу, что это было убийство. На поиски убийцы ушло меньше суток — его обнаружили по записям камер наблюдения, установленных возле мотеля, а также по анализу телефонных разговоров жертвы (в номере был найден её телефон).

43-летний Даррен Ванн был арестован уже 18 октября и, как ни странно, совсем не был удивлён появлению полиции. Когда наручники защёлкнулись на его запястьях, Даррен повернулся и сказал полицейскому: «Наконец-то вы меня поймали». Так попался серийный убийца, жертвами которого стали ещё минимум шесть женщин. Но как полагали детективы, на самом деле счёт приближался к 20. 

Примечательно в этой истории то, что полиция могла бы поймать Даррена Вана ещё за 4 года до этого. Но никто не хотел слушать Томаса Харгроува — бывшего журналиста, который помогает искать маньяков с помощью собственного алгоритма, о котором и пойдёт далее речь.

Поймать маньяка

Реализация двустороннего A* на двух потоках

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

На Хабре можно найти немало статей, посвящённых оптимизациям поиска кратчайшего пути на графе. Я расскажу ещё про еще один подход. Речь пойдёт о распараллеливании алгоритма A* и исполнении его на двух потоках, а также о сложностях, с которыми я столкнулся при реализации, и их преодолении.

Читать далее

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