У меня есть вопрос по этой алгоритмической проблеме; Я вставлю проблему, а затем перейду к моим текущим мыслям и решению.Сегменты пересечения линий
N (up to 100,000)
Есть линейные сегменты, определенные как [(x1, y1), (x2, y2)]
, где x1 < x2
и y1 < y2
(например, сегменты линии имеют положительный наклон). Никакие сегменты линии не касаются или не пересекаются даже в конечных точках. Первый сегмент имеет (x1, y1) = (0, 0)
. Представьте себе, что каждый сегмент, как двумерный холм, должен подняться.
Человек начинается от (0, 0)
и приземляется на первом холме. Всякий раз, когда человек приземляется на холм, он поднимается до конца, то есть (x2, y2)
и прыгает прямо вниз. Если он приземляется на другой холм (где-нибудь на участке), процесс продолжается: он поднимается на этот холм и прыгает. Если больше нет холмов, он падает до -INFINITY
, и процесс завершен. Каждый холм (x1, y1) -> (x2, y2)
должен быть считается содержащим точку (x1, y1)
, но не содержащую точку (x2, y2)
, чтобы человек приземлился на холм, если он падает на него сверху на с позиции x = x1
, но он не приземлится на холм если он падает на он сверху на x = x2
.
Цель состоит в том, чтобы подсчитать, сколько холмов он касается.
Мои текущие мысли
Я имею в виду подметание линию поперек плоскости вдоль оси х. Каждый сегмент состоит из события BEGIN и END; каждый раз, когда мы сталкиваемся с началом сегмента линии, мы добавляем его в набор. Каждый раз, когда мы сталкиваемся с окончанием сегмента линии, мы удаляем его из набора. И когда мы нажмем точку КОНЕЦ нынешнего холма, на котором мы остановились, мы должны проверить комплект для самого высокого холма, на который мы можем приземлиться. Однако я не знаю, как определить, как быстро это проверить, потому что в наборе могут быть потенциально N записей. Кроме того, после перехода на другой холм порядок этих изменений изменится, потому что наклоны каждого сегмента, вероятно, разные, и я не знаю, как объяснить эту разницу.
Любые мысли?
Никто не разместил ничего, что позволяет избежать прохождения списка 'O (n)' на каждом событии. Я внимательно слежу за этим вопросом. – japreiss
Не могли бы вы ссылаться на некоторые контрольные данные, чтобы мы могли попробовать различные оптимизации? – japreiss