Как стать автором
Обновить
-2
0
Саша @Koioes

Пользователь

Отправить сообщение

Система непересекающихся множеств и её применения

Время на прочтение10 мин
Количество просмотров73K
Добрый день, Хабрахабр. Это еще один пост в рамках моей программы по обогащению базы данных крупнейшего IT-ресурса информацией по алгоритмам и структурам данных. Как показывает практика, этой информации многим не хватает, а необходимость встречается в самых разнообразных сферах программистской жизни.
Я продолжаю преимущественно выбирать те алгоритмы/структуры, которые легко понимаются и для которых не требуется много кода — а вот практическое значение сложно недооценить. В прошлый раз это было декартово дерево. В этот раз — система непересекающихся множеств. Она же известна под названиями disjoint set union (DSU) или Union-Find.

Условие


Поставим перед собой следующую задачу. Пускай мы оперируем элементами N видов (для простоты, здесь и далее — числами от 0 до N-1). Некоторые группы чисел объединены в множества. Также мы можем добавить в структуру новый элемент, он тем самым образует множество размера 1 из самого себя. И наконец, периодически некоторые два множества нам потребуется сливать в одно.

Формализируем задачу: создать быструю структуру, которая поддерживает следующие операции:

MakeSet(X) — внести в структуру новый элемент X, создать для него множество размера 1 из самого себя.
Find(X) — возвратить идентификатор множества, которому принадлежит элемент X. В качестве идентификатора мы будем выбирать один элемент из этого множества — представителя множества. Гарантируется, что для одного и того же множества представитель будет возвращаться один и тот же, иначе невозможно будет работать со структурой: не будет корректной даже проверка принадлежности двух элементов одному множеству if (Find(X) == Find(Y)).
Unite(X, Y) — объединить два множества, в которых лежат элементы X и Y, в одно новое.

На рисунке я продемонстрирую работу такой гипотетической структуры.


Как такое сделать и зачем оно нужно
Всего голосов 114: ↑109 и ↓5+104
Комментарии29

Дайджест научпоп-новостей за неделю, о которых мы ничего не писали

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

• Гравастары: альтернативная теория чёрных дыр

• Самая голодная чёрная дыра из когда-либо найденных съедает по солнцу каждый день

• Создан диск размером с DVD, способный вместить 1 миллион фильмов

• Учёные заявили о прорыве в области искусственного интеллекта, позволяющем генерировать безграничную энергию чистого термоядерного синтеза

• Уэбб разглядел нейтронную звезду в остатках сверхновой, взорвавшейся в 1987-м году

Читать далее
Всего голосов 13: ↑12 и ↓1+17
Комментарии5

Личный опыт: как остаться живым человеком на удалёнке

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

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

85% Нетологии работает дистанционно. Команда раскидана по всему свету: от Аргентины и Шри-Ланки до Сибири и Объединённых Арабских Эмиратов. Мы знаем, как просто бывает уйти в работу с головой, когда работаешь удалённо. Например, резко переезжаешь в другую страну, в которой нет социальных связей, и тот самый баланс может незаметно нарушиться. Есть большой риск плавно превратиться в трудоголика. 

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

Читать далее
Всего голосов 12: ↑9 и ↓3+9
Комментарии3

Курс по Ruby+Rails. Часть 8. Модели и первые шаги

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

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

Читать далее
Всего голосов 2: ↑2 и ↓0+2
Комментарии0

Вкатываемся в ангельский без репетиторов

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

Привет, {{ username }}!

Добро пожаловать в очередную статью про изучение английского.

Постараюсь емко обобщить свой опыт самостоятельного изучении языка от A1 до B2 за 1-2 года. Информация релеванта для технарей 25+ лет, однако подойдет для широкого круга интересующихся.

Мнение автора субъективно. Представленные материалы, инструменты и best practices дадут вам базовое знание языка, однако не смогут подготовить к собеседованию, IELTS/TOEFL, чтению классической литературы и т.п.

Вкатиться
Всего голосов 15: ↑13 и ↓2+12
Комментарии16

Как работает веб-браузер (с картинками)

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

Браузеры стали частью нашей повседневной жизни. Но задумывались ли вы когда-нибудь о том, как они на самом деле работают?

Эта статья приоткроет завесу магии, скрывающуюся за кулисами веб-браузеров.

Давайте начнем!

Читать далее
Всего голосов 25: ↑22 и ↓3+24
Комментарии9

Как контрибьютить в проект, о котором ничего не знаешь

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

Bun


В последнее время мне очень нравится Bun. Это новая среда исполнения JavaScript / TypeScript, схожая с Deno / Node. Она имеет одно преимущество по сравнению с другими средами исполнения, которое очень важно для меня: очень быстрый запуск (по крайней мере, для JS). Когда я впервые запустил в ней небольшой кусок кода, то просто не мог поверить.

Когда я перешёл с Ruby на Node, меня оттолкнуло то, что тесты в Node выполняются о-о-очень медленно. Написание одной и той же бизнес-логики и её тестирование на этих языках — совершенно разный опыт. Неудивительно, что сообщество JS-разработчиков ненавидит юнит-тестирование, когда нужно думать, например, распределять ли тесты на несколько файлов, или нет.

Однако на то есть причина. Как бы вы ни оптимизировали инструменты для выполнения тестов наподобие Vitest, Jest или Ava, первый прогон теста (без watch) всегда будет выполняться чрезвычайно медленно в Node, потому что для запуска V8 и разрешения модулей требуется куча времени. Когда ты распределяешь работу на несколько процессов, чтобы использовать все ядра, это требует ещё больше ресурсов!
Читать дальше →
Всего голосов 38: ↑36 и ↓2+51
Комментарии1

Математическая продлёнка. Мир треугольников

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

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

Читать далее
Всего голосов 47: ↑46 и ↓1+64
Комментарии26

Стохастический язык программирования на основе алгоритмов Маркова

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

MarkovJunior — это вероятностный язык программирования, в котором программы являются сочетаниями правил перезаписи, а инференс выполняется при помощи распространения ограничений. MarkovJunior назван в честь математика Андрея Андреевича Маркова, придумавшего и исследовавшего то, что сейчас называется алгоритмами Маркова.
Читать дальше →
Всего голосов 139: ↑139 и ↓0+139
Комментарии24

Как вкатиться в геймдев начинающему винтику

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

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

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

Если вы готовы пройти через всё это, чтобы создавать игры — добро пожаловать под кат. Я покажу путь.

Портал в ад
Всего голосов 44: ↑42 и ↓2+61
Комментарии31

Простейший полнотекстовый поиск на Python с поддержкой морфологии

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

В прошлой статье я рассказывала, что составила для своего проекта словарь «Властелина Колец», причем для каждого англоязычного терма (слова/словосочетания) хранится перевод и список глав, в которых встречается это выражение. Все это составлено вручную. Однако мне не дает покоя, что многие вхождения термов могли быть пропущены.

В первой версии MVP я частично решила эту проблему обычным поиском по подстроке (\b{term}, где \b – граница слова), что позволило найти вхождения отдельных слов без учета морфологии или с некоторыми внешними флексиями (например, -s, -ed, -ing). Фактически это поиск подстроки с джокером на конце. Но для многословных выражений и неправильных глаголов, составляющих весомую долю моего словаря, этот способ не работал.

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

Изобретение велосипеда на Python и pandas
Всего голосов 9: ↑8 и ↓1+7
Комментарии3

Распределение для рекордов, циклических перестановок и количества дел, которые вы успеете сделать за свою жизнь

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

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

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

Читать далее
Всего голосов 26: ↑26 и ↓0+26
Комментарии7

Один день из жизни JVM-инженера

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


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


Вроде бы те и другие существуют в одной Java-экосистеме, но задачи совершенно разные. Поэтому редкое место, где они пересекаются и могут что-то поведать друг другу — Java-конференции. Мы проводим их регулярно (уже в апреле будет JPoint). И на предыдущей нашей конференции Иван Углянский dbg_nsk поделился с Java-разработчиками тем, как всё выглядит с его стороны.


Чем он вообще занимается? Почему JVM-инженеры всё так медленно делают? На каком языке стоит писать рантайм, а на каком компилятор? Как «папка бога» в Windows привела к неожиданным последствиям? Может ли «обычный джавист» стать JVM-инженером?


Поскольку все эти вопросы из доклада звучат интересно, мы решили для Хабра сделать его текстовую версию (а для тех, кому удобнее видео, прикладываем ссылку на ютуб). Далее повествование идёт от лица Ивана.

Читать дальше →
Всего голосов 88: ↑88 и ↓0+88
Комментарии18

Алгоритмы быстрого умножения чисел: от столбика до Шенхаге-Штрассена

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

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

И уж конечно, никогда при написании a * b мы не задумываемся о том, как реализовано умножение чисел a и b в нашем языке. Какие вообще есть алгоритмы умножения? Это какая-то нетривиальная задача?

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

Скорее к формулам!
Всего голосов 173: ↑173 и ↓0+173
Комментарии30

Структуры данных Java #неОпятьАСнова #javaJunior

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

Эта статья, как и все последующие – моя попытка структурировать полученные знания в процессе изучения Java. Здесь тезисно собрана вся основная информация по теме и те формулировки, которые показались мне наиболее удачными и понятными.
Это мой конспект, если хотите.

Статья будет полезна тем, кто изучает или повторяет основы Java Core.
И тем, кто готовится к собеседованию.

Читать далее
Всего голосов 2: ↑1 и ↓10
Комментарии5

Spring Data JDBC и генерация ID

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

Каждый раз, когда необходимо сделать сервис на Java, работающий с реляционной базой, я не могу определиться, прямо как та обезъяна, которая хотела быть и умной, и красивой. Хочется делать запросы на обычном SQL, по-минимуму обкладываясь различными "магическими" аннотациями, но при этом лень самому писать RowMapper'ы, готовить PreparedStatement'ы или JdbcTemplate, и тому подобное, за что любят обзывать Java многословной. И каждый раз руки тянутся к Spring Data JDBC, который, вроде как, и был задуман как нечто среднее. Но с ним тоже, зачастую, можно вляпаться в какую-то ерунду на ровном месте.

Потребовалось мне сохранять новые записи в таблицу. Казалось бы, в чем вопрос - берешь CrudRepository и все у тебя работает из коробки. Но на практике возникло несколько нюансов, например:

Читать далее
Всего голосов 3: ↑2 и ↓1+2
Комментарии38

Математика для Data Science и машинного обучения за 8 месяцев. Подробный план обучения

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

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

Машинное обучение держится на трёх основных столпах:

Читать далее
Всего голосов 19: ↑18 и ↓1+22
Комментарии45

5 лучших книг по Java для новичков и профи, на которые стоит обратить внимание в 2022 году

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

Привет, Хабр! Мы поговорили с командой разработчиков Сбера и попросили поделиться книгами по Java, которые, по мнению коллег, заслуживают внимания как новичков, так и профессионалов.

Результат обсуждения ― в подборке ниже. Она будет полезной и тем, кто только начинает свой путь в мире Java, и тем, кто уже давно стал разработчиком. Если у вас есть собственный вариант хорошей книги по этому языку программирования ― делитесь в комментариях.

Читать далее
Всего голосов 10: ↑6 и ↓4+9
Комментарии7

Где скачать научную статью легко и доступно?

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

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

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

Здесь собраны совершенно бесплатные ресурсы, где вы можете найти интересующую Вас научную статью.

Читать далее
Всего голосов 90: ↑90 и ↓0+90
Комментарии26

Написать архитектуру продукта — это не сложно

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

С Вами снова Владимир и меня все еще зовут девопс.

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

Немного контекста: я живу в Санкт-Петербурге и работаю в большой компании с крайне бюрократической структурой управления, в которой девопс – это драйвер, лидер и на-все-руки-мастер.

Читать далее
Всего голосов 16: ↑14 и ↓2+13
Комментарии11

Информация

В рейтинге
Не участвует
Откуда
Казань, Татарстан, Россия
Дата рождения
Зарегистрирован
Активность