Ищите решение, которое будет работать на складе Java 8, без библиотек.
Я пытаюсь реализовать стандартный алгоритм пересечения линейных сегментов. Это включает в себя отслеживание отсортированной коллекции (по y-координате) сегментов линии, которые в настоящее время «активны».
Часть алгоритма состоит в предположении, что TreeSet actives
и новый сегмент строки s
:
- вставка
s
в actives
- поиск ближайших соседей
s
в actives
и выполнение математических операций
У меня есть реализовал это следующим образом:
// left neighbor of s, as though already added
try {
Segment sa = actives.tailSet(s).first();
if (math(sa, s) {
...
}
} catch(NoSuchElementException ignore) {}
// right neighbor versus s, as though already added
try {
Segment sb = actives.headSet(s).last();
if (math(sb, s) {
...
}
} catch(NoSuchElementException ignore) {}
// add s => actives
actives.add(s);
Помимо усугубляющих попытки / уловки в случае неудачи first()
или last()
(что является компромиссом с первым получением подмножества в переменной, ТО проверяет, если оно пустое , ТОГДА продолжая, если нет), реальная проблема, насколько я понимаю, заключается в том, что это неэффективно, а именно:
tailSet()
, headSet()
и add()
все несут O (log (N)) работать на моем TreeSet actives
, в то время как алгоритм предполагает, что я могу вставить один раз в O (log (N)), а затем искать соседей в O (1).
Как я могу сделать что-то подобное, но выполнить O (log (N)) бинарный поиск только один раз? Я делаю в 3 раза больше работы, чем необходимо.