У меня есть вопрос по этой алгоритмической проблеме; Я вставлю проблему, а затем перейду к моим текущим мыслям и решениям.
Есть сегменты линии 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 записей. Кроме того, после перехода на другой холм их порядок изменится, потому что наклоны каждого сегмента, вероятно, будут разными, и я не знаю, как объяснить эту разницу.
Любые мысли?