Мне прилетел случай, когда моё решение давало ответ, на единицу отличающийся от правильного. Это выглядело странно, потому что это не могло быть эффектом ошибки на единицу — в противном случае более простые примеры давали бы ту же ошибку. Я внимательно изучил пример, пытался его модифицировать и смотреть, как меняется ответ — и в итоге свёл его до минимального примера, ломающий мой алгоритм (для наглядности я обозначил воду точками и сушу решётками):
...И тут я понял, что это как-то слишком походит по описанию на структуру непересекающихся множеств (disjoint sets aka union-find), про которую я когда-то читал в Википедии. В принципе, это структура данных напрашивалась с самого начала, но я рассчитывал, что смогу обойтись чем-то более простым. Ну что ж — делаю эту структуру (что, кстати, как ни странно, упростило код), фиксю пару мелких багов, отправляю на проверку — и — о чудо! — все тесты пройдены!
Все, кроме моего теста эффективности. На Leetcode после успешного решения задачи можно посмотреть, где твоё решение находится на гистограмме всех отправленных решений по времени. Оказывается, есть решения более быстрые. Заинтригованный, я открываю семпл из топового по времени решения. И что же я там вижу?
Depth first search.
#..#Видите ли вы тут проблему? Я вот понял её благодаря своему отладочному выводу. Перерисуем этот пример, показав, какой номер территории приписывается каждой ячейке на очередном шаге:
#.##
###.
0..1Во время обработки второй строки появляется территория с id = 2, которая сразу же становится частью территории с id = 1. После обработки второй строки связи между территориями выглядят следующим образом (стрелочкой показано отношение "является частью"):
0.21
000.
[ 0 | 1 | 2 ]С другой стороны, во время обработки третьей строки эта же территория становится частью территории с id = 0, и в итоге связи становятся такими:
^ |
| |
\---/
[ 0 | 1 | 2 ]Здесь и кроется проблема: так как у территории с id = 1 нет никаких связей, она считается отдельным островом, а не частью острова, образованного территорией с id = 0. В итоге алгоритм ошибочно считает, что на карте два острова вместо одного. В принципе, тут примерно понятно, что нужно исправить: нужно менять не только связь у территории 2, но и у территории 1, на которую первая указывает...
^ |
| |
\-------/
...И тут я понял, что это как-то слишком походит по описанию на структуру непересекающихся множеств (disjoint sets aka union-find), про которую я когда-то читал в Википедии. В принципе, это структура данных напрашивалась с самого начала, но я рассчитывал, что смогу обойтись чем-то более простым. Ну что ж — делаю эту структуру (что, кстати, как ни странно, упростило код), фиксю пару мелких багов, отправляю на проверку — и — о чудо! — все тесты пройдены!
Все, кроме моего теста эффективности. На Leetcode после успешного решения задачи можно посмотреть, где твоё решение находится на гистограмме всех отправленных решений по времени. Оказывается, есть решения более быстрые. Заинтригованный, я открываю семпл из топового по времени решения. И что же я там вижу?
Depth first search.
Wikipedia
Disjoint-set data structure
In computer science, a disjoint-set data structure, also called a union–find data structure or merge–find set, is a data structure that stores a collection of disjoint (non-overlapping) sets. Equivalently, it stores a partition of a set into disjoint subsets.…
Я уже говорил тебе, что такое безумие? Безумие — это раз за разом заходить на свой собственный канал, надеясь увидеть там новые посты
#prog #article #rust #cpp
C++ быстрее и безопаснее Rust, Yandex сделала замеры!
От создателя Go быстрее Rust, Mail.Ru Group сделала замеры
C++ быстрее и безопаснее Rust, Yandex сделала замеры!
От создателя Go быстрее Rust, Mail.Ru Group сделала замеры
Хабр
C++ быстрее и безопаснее Rust, Yandex сделала замеры
Спойлер: C++ не быстрее и не медленнее и вообще смысл не в этом. Эта статья является продолжением славных традиций развенчания мифов крупных российских компаний о языке Rust. Предыдущая была...
Блог*
#prog #article #rust #cpp C++ быстрее и безопаснее Rust, Yandex сделала замеры! От создателя Go быстрее Rust, Mail.Ru Group сделала замеры
Комментарии, конечно, замечательные
Блог*
#prog #article Конец эпохи, можно сказать. Дедфуд официально объявил, что устал от C++ и вообще выгорел. It's RESF time! habr.com/ru/post/497114/
Тем временем число комментариев перевалило за тысячу. Ух.
#prog #c #article
Как коротенькая программа выявила ошибки в трёх компиляторах C.
blog.regehr.org/archives/482
Как коротенькая программа выявила ошибки в трёх компиляторах C.
blog.regehr.org/archives/482
#article
How To Criticize Computer Scientists or Avoiding Ineffective Deprecation And Making Insults More Pointed
cs.purdue.edu/homes/dec/essay.criticize.html
How To Criticize Computer Scientists or Avoiding Ineffective Deprecation And Making Insults More Pointed
cs.purdue.edu/homes/dec/essay.criticize.html
Forwarded from Идеи неинтересных фильмов
"Небольшой Лебовски".
Раздолбай в Лос-Анджелесе бездельничает в боулинге только по выходным.
Раздолбай в Лос-Анджелесе бездельничает в боулинге только по выходным.
Блог*
#article How To Criticize Computer Scientists or Avoiding Ineffective Deprecation And Making Insults More Pointed cs.purdue.edu/homes/dec/essay.criticize.html
Там, кстати, в конце есть ссылки на переводы на другие языки, и в том числе на два русских перевода, но первая ссылка мёртвая, а вторая, кажется, вообще переведена в основном машинно
#prog #art
Наткнулся на страницу codegolf.stackexchange.com, на которой участникам предложили сгенерировать изображения, содержащее каждый из цветов RGB по одному на пиксель. Результаты выглядят просто восхитительно.
https://codegolf.stackexchange.com/questions/22144/images-with-all-colors
Наткнулся на страницу codegolf.stackexchange.com, на которой участникам предложили сгенерировать изображения, содержащее каждый из цветов RGB по одному на пиксель. Результаты выглядят просто восхитительно.
https://codegolf.stackexchange.com/questions/22144/images-with-all-colors
Code Golf Stack Exchange
Images with all colors
Similar to the images on allrgb.com, make images where each pixel is a unique color (no color is used twice and no color is missing).
Give a program that generates such an image, along with a scre...
Give a program that generates such an image, along with a scre...
Вариант, набравший наибольшее число голосов (советую всё же пройти по ссылке и заценить оригинал, потому что телега шакалит картинки).
Делаю работу за @optozorax_dev, так сказать.
Делаю работу за @optozorax_dev, так сказать.
#prog #prog #amazingopensource
Трассировщик лучей, работающий полностью на этапе компиляции.
github.com/darksv/ctrt
Трассировщик лучей, работающий полностью на этапе компиляции.
github.com/darksv/ctrt
GitHub
GitHub - darksv/ctrt: Compile-Time Ray Tracer in Rust ported from C++
Compile-Time Ray Tracer in Rust ported from C++. Contribute to darksv/ctrt development by creating an account on GitHub.