Обновить
196.89

Алгоритмы *

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

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

Метод конечных элементов своими руками

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

Метод конечных элементов (МКЭ) применяют в задачах упругости, теплопередачи, гидродинамики — всюду, где нужно как-то дискретизировать и решить уравнения сплошной среды или поля. На Хабре было множество статей с красивыми картинками о том, в каких отраслях и с помощью каких программ этот метод приносит пользу. Однако мало кто пытался объяснить МКЭ от самых основ, с простенькой учебной реализацией, желательно без упоминания частных производных через каждое слово.

Мы напишем МКЭ для расчёта упругой двумерной пластины на прочность и жёсткость. Код займёт 1200 строк. Туда войдёт всё: интерактивный редактор, разбиение модели на треугольные элементы, вычисление напряжений и деформаций, визуализация результата. Ни одна часть алгоритма не спрячется от нас в недрах MATLAB или NumPy. Код будет ужасно неоптимальным, но максимально ясным.

Размышление над задачей и написание кода заняли у меня неделю. Будь у меня перед глазами такая статья, как эта, — справился бы быстрее. У меня её не было. Зато теперь она есть у вас.

Читать далее

Поисковый движок в 80 строках Python

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

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

Давайте поговорим о целях. Слышали когда-нибудь о «кризисе сложности обнаружения маленьких веб-сайтов»? Проблема в том. что маленькие веб-сайты наподобие моего невозможно найти при помощи Google или любого другого поискового движка. Какова же моя миссия? Сделать эти крошечные веб-сайты снова великими. Я верю в возвращение славы этих малышей вдали от SEO-безумия Google.

В этом посте я подробно расскажу о процессе создания поискового движка с нуля на Python. Как обычно, весь написанный мной код можно найти в моём GitHub (репозиторий microsearch). Эта реализация не будет притворяться готовым к продакшену поисковым движком, это лишь полезный пример, демонстрирующий внутреннюю работу поискового движка.

Кроме того, мне стоит признаться, что в заголовке поста я слегка преувеличил. Да, поисковый движок действительно реализован примерно в 80 строках Python, но я ещё и писал вспомогательный код (краулер данных, API, HTML-шаблоны и так далее), из-за которого весь проект становится немного больше. Однако я считаю, что интересная часть проекта находится в поисковом движке, который состоит из менее чем 80 строк.

P.S. Написав этот пост и microsearch, я осознал, что пару лет назад нечто похожее написал Барт де Гёде. Моя реализация очень похожа на работу Барта, но я считаю что кое-что улучшил, в частности: (1) мой краулер асинхронный, что сильно ускоряет работу, (2) я реализовал пользовательский интерфейс, позволяющий взаимодействовать с поисковым движком.

Читать далее

Разбираем самый маленький JPEG в мире

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

Недавно на Хабре была опубликована статья Разбираем самый маленький PNG в мире. Интересно, а какой самый маленький файл JPEG? В ответах на StackOverflow и Reddit можно встретить размеры 107, 119, 125, 134, 141, 160 байтов. Все они представляют серый прямоугольник 1 на 1. И кто прав? Все правы, просто такая разница объясняется различными режимами кодирования и степенью строгости соответствия стандарту. Описание всех нюансов разрослось до целой статьи cо всеми необходимыми подробностями для более-менее хорошего знакомства с самыми маленькими jpeg-ами. После краткой теории разберем 159-байтный файл на КДПВ, а затем рассмотрим способы его уменьшения.

Читать далее

Стеки и Очереди в Swift

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

В этой статье мы исследуем две фундаментальные структуры данных, которые являются неотъемлемой частью программирования на Swift: стеки и очереди. Они представляют собой коллекции элементов с особыми правилами для добавления и удаления элементов. Стеки работают по принципу "последним пришел, первым ушел" (LIFO), что делает их идеальными для задач, связанных с обратной навигацией или отменой действий. Очереди, следуя принципу "первым пришел, первым ушел" (FIFO), идеально подходят для задач, требующих обработки элементов в порядке их поступления, например, в управлении задачами или потоками данных.

Читать далее

Pandas в pandas'е: упаковываем документацию в датафрейм

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

Документация к сложным библиотекам на питоне (напр. pandas) хранится в doc-строках и разбросана по сотням страниц сайта. В этой статье мы с помощью небольшого кода упакуем её (информацию из документации для каждого класса и метода) в... датайфрейм. Но зачем? Во-первых, это прикольно так её можно быстро искать и анализировать. Во-вторых, изучим некоторые встроенные питоновские средства работы с документацией. Наконец, такой датафрейм потенциально может стать основой для обучения/дообучения GPT-моделей писать более корректный, безошибочный, использующий всевозможные функции и их аргументы, код...

Читать далее

Два сапога — пара, а три — уже community: как алгоритмы на графах помогают собирать группы товаров

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

Привет, Хабр! Меня зовут Иван Антипов, я занимаюсь ML в команде матчинга Ozon. Наша команда разрабатывает алгоритмы поиска одинаковых товаров на сайте. Это позволяет покупателям находить более выгодные предложения, экономя время и деньги.

В этой статье мы обсудим кластеризацию на графах, задачу выделения сообществ, распад карате-клуба, self-supervised и unsupervised задачи — и как всё это связано с матчингом.

Читать далее

Adversarial suffixes или можно ли получить ответ на любой вопрос от LLM?

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

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

Давайте глубже разберемся в этом...

Распознавание мордочек собак для борьбы с бешенством

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


Одним из отличий человека от других животных является интеллект, благодаря которому мы научились определять, изучать и контролировать многие законы природы. Стремительное развитие технологий разительным образом повлияло не только на наш вид, но и на окружающую нас среду. Среди прочего технология распознавание лиц стала весьма полезной для многих направлений, но она ограничена человеческими лицами. Ученые из университета штата Вашингтон (Пулмен, США) разработали приложение для смартфонов, позволяющее различать отдельные особи собак. Данная разработка была использована для оценки охвата вакцинации против бешенства в сельской местности Танзании. Как именно работает приложение, и насколько оно эффективно различает собак? Ответы на эти вопросы мы найдем в докладе ученых.
Читать дальше →

Разреженные структуры данных

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

Когда-то я писал пост про различные интересные структуры данных. Среди них был т.н. sparse set. Там мы описали его в общих чертах, опустив некоторые детали (которыми позже статья была дополнена). Но кроме sparse set существуют и другие разреженные структуры данных! На них сегодня и посмотрим : )

Разредиться!

ИИ в 3D: Где мы сейчас и какое будущее нас ждёт? (Часть 1)

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

В последнее время мы оцениваем на удивление много проектов, так или иначе связанных с 3D-пространством и ML-моделями. По всей видимости по прошествии 2023 года люди воодушевились и начали видеть возможность реализации тех идей, которые ранее просто-напросто казались научной фантастикой - и они не ошибаются! Исследователи и разработчики последних технологий достигли сногсшибательных результатов. В связи с этим хотел бы накидать цикл обзорных статей, которых как мне лично, так и нашей рабочей группе очень сильно недоставало в процессе ресёрча. 

Читать далее

Детекция объектов. R-CNN, Fast R-CNN, Faster R-CNN. Часть 1

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

Кто такой детектор?

Данная статья посвящена постановке задачи детекции и обзору первых двухстадийных детекторов, таких как: R-CNN, Fast R-CNN и Faster RCNN.

Читать далее

Генератор случайных чисел, который можно запустить в голове

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

Люди ужасно плохо справляются с придумыванием случайных чисел. Я хотел научиться быстро генерировать «достаточно случайные» числа. Мне не нужно было что-то совершенное, просто способ придумывания случайных цифр за полминуты. Поискав онлайн, я нашёл старый пост в Usenet, написанный Джорджем Марсалья:

Выберите двухразрядное число, допустим, 23. Оно будет вашим «порождающим значением» (seed).

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

Пример последовательности: 23 –> (2 + 6 * 3) = 20 –> (2 + 6 * 0) = 02 –> 12 –> 13 –> 19 –> 55 –> 35 –> …

Его период будет порядком множителя (6) в группе остатков, простых относительно модуля, 10 (в данном случае 59).

«Случайными цифрами» будет количество единиц двухразрядных чисел, то есть 3,0,2,2,3,9,5,… то есть члены последовательности mod 10.

Больше всего Марсалья известен своим набором тестов diehard-генераторов случайных чисел (RNG), так что он в этом понимает (здесь и далее под RNG я имею в виду генератор псевдослучайных чисел (PRNG)). Мне стало любопытно, почему это работает и как он выбрал 6.

Мы будем писать на Raku, языке для гремлинов. На случай, если вы тоже гремлин, под спойлерами я буду объяснять все странные особенности.
Читать дальше →

Компилятор за выходные: таблицы символов

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

Как водится воскресным вечером, снова я с моим компилятором. На этот раз я расскажу, как работают области видимости переменных и как перегружать функции. Это позволит нам скомпилировать демку про́клятого огня, а также я накидал фантазию на тему игрушки арканоид (скриншот на КПДВ, видео в конце статьи). Я на удивление сам долго залипал на эту анимацию :)

На всякий случай я даю код и на wend, и на C, поскольку понимаю, что код на моём языке вряд ли интересен кому-то помимо того, кто реально возьмётся за компилятор. А вот мелкий код с интересными эффектами всегда найдёт свою публику. Кстати, если у вас есть идеи на тему чего-то интересного, что можно запрограммировать в полста строчек кода, делитесь в комментариях, я внимательно слушаю!

Читать далее

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

Формализация WF2M сети на примере алгоритма Кофе-машина и два ученых

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

Предлагается WF2M сеть (From workflow to mathematic) с формализмом, обеспечивающим расчет движения маркера по сети workflow [WF2M23]. WF2M сеть основана на ЕРС (Event-Driven Process Chain) – событийная цепочка процессов: последовательность операций, управляемых событиями.

Ранее [CCSWF24] был приведен сценарий «кофе-машина и ученый» - как демонстрация формализма алгебры процессов CCS. Текущий пример формализации WF2M сети дополнен взаимодействием второго учёного, т.е. реализует более сложный сценарий: Кофе-машина и два ученых. Настоящую статью можно считать, как апробацию [WF2M23] на сценарии [CCSWF24].

Читать далее

Обманчиво простой и интересный RSA

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

Недавно, читая книгу Real-World Cryptography, я узнала об атаке Блейхенбахера, иначе называемой атакой миллионом сообщений. Этот вид атаки Даниэль Блейхенбахер продемонстрировал в 1998 году, взломав RSA через функцию шифрования PKCS #1. В книге об этой атаке было сказано немного, поэтому я решила изучить её сама и в конечном итоге реализовать.

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

Вместо этого я решила реализовать RSA сама, чтобы иметь возможность развернуть слабую схему шифрования, позволяющую осуществить атаку Блейхенбахера. Пока что у меня готова реализация RSA и PKCS (уязвимой версии). На создание основы RSA ушло около часа, плюс несколько дней на отладку. И теперь она (кажется) работает. Вскоре, если звёзды сойдутся, можно будет развернуть саму атаку.
Читать дальше →

Визуализация алгоритмов поиска пути на Svelte: Практические заметки

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

Привет, Хабр! В этом посте делюсь опытом разработки на Svelte, демонстрируя это на моем пет-проекте.

Код проекта: GitHub
Лайв демо: ivan-sem.com

Читать далее

Часть 3. Представление вероятности безотказной работы системы в виде ряда Тейлора

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

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

Представление функции вероятности безотказной работы системы в виде ряда Тейлора является эффективным средством для проведения углубленных исследований надежности, безопасности и живучести сложных технических систем. Функция ВБРС представлена на основе к‑кратных совместных значи‑ мостей, учитывающих влияние ряда отказов элементов на систему в целом. На основе представления ВБРС в виде ряда Тейлора выведен ряд показателей важности («весовых коэффициентов»).

Кроме этого, еще в 1981 году И.А. Рябинин обозначил широкий класс объектов моделирования под названием структурно‑сложных систем, не ограничиваясь сложными техническими системами. Технология логико‑вероятностного моделирования применима для исследования разнообразных объектов, имеющих сложную структуру и организацию. При этом вероятность может быть не только безотказной работы, но и риска возникновения опасного состояния, а также иных показателей: степени принадлежности или предпочтений, например при оценки рисков реализации проектов, кредитования и тому подобное.

In the technology of logic‑probabilistic modeling, to assess the importance of element failures of complex technical systems (CTS), indicators of one, two‑fold and k‑fold significance are used. This article presents the probability of the system's failure‑free operation in the form of a Taylor series based on k‑fold joint significances.

Читать далее

Предсказать ошибку. Как методы оценки неопределенности помогают повышать качество seq2seq-моделей

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

Всем привет! Меня зовут Артём Важенцев, я аспирант в Сколтехе и младший научный сотрудник AIRI. Наша группа занимается исследованием и разработкой новых методов оценивания неопределенности для языковых моделей. Этим летом мы опубликовали две статьи на ACL 2023

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

Читать далее

Алгоритмы. Определение последовательности на сырых данных, или восстановление после аварии

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

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

Читать далее

Часть 2. Алгоритм расчета к-кратной совместной значимости в технологии логико-вероятностного моделирования

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

Algorithm for calculating k-fold joint significance in the logical-probabilistic modeling technology

Морозов В.И. , Morozov V.I.

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

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

In the technology of logic-probabilistic modeling, to assess the importance of element failures of complex technical systems, indicators of one, two-fold and k-fold significance are used. This article provides algorithm for calculating the k-fold joint significance, which allow you to significantly reduce the amount of calculation when conducting research of the influence of a certain set of element failures on the complex technical systems.

Читать далее

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