Я предполагаю, что деревья равномерно распределены по лесу. Если это так, просто используйте 30x30 (или 15x15) блоков сетки в качестве хеш-ключей в закрытой хеш-таблице . Найдите ключи для всех блоков, пересекающих круг поиска, и проверьте все хеш-записи, начиная с этого ключа, пока один из них не будет помечен как последний в его «корзине».
0---------10---------20---------30--------40---------50----- address # line
(0,0) (0,30) (0,60) (30,0) (30,30) (30,60) hash key values
(1,3) (10,15) (3,46) (24,9.) (23,65.) (15,55.) tree coordinates + "." flag
Например, чтобы получить деревья в (0,0)… (30,30), сопоставить (0,0) с адресом 0
и прочитать записи (1,3), (10,15), отклонить (3,46), потому что он выходит за пределы, прочитать (24,9) и остановиться, потому что он помечен как последнее дерево в этом секторе.
Чтобы получить деревья в (0,60)… (30,90), карте (0,60) по адресу 20. Пропустите (24, 9), прочитайте (23, 65) и остановитесь, так как это последнее.
Это будет весьма эффективно с точки зрения памяти, поскольку позволит избежать хранения указателей, которые в противном случае имели бы значительный размер по сравнению с фактическими данными. Тем не менее, закрытое хеширование требует наличия некоторого пустого пространства.
Иллюстрация не "в масштабе", так как на самом деле между маркерами хеш-ключа должно быть пространство для нескольких записей. Поэтому вам не нужно пропускать какие-либо записи, если в локальном предыдущем секторе деревьев больше, чем в среднем.
Это использует коллизии хешей в ваших интересах, так что это не так случайно, как обычно это делает хеш-функция. (Не каждая запись соответствует отдельному хэш-значению.) Однако, поскольку плотные участки леса часто будут смежными, вы должны рандомизировать отображение секторов в «сегменты», так что данный плотный сектор, как мы надеемся, будет переполнен на менее плотный, или следующий, или следующий.
Кроме того, существует проблема пустых секторов и завершения итерации. Вы можете вставить фиктивное дерево в каждый сектор, чтобы пометить его как пустое, или какой-то другой простой взлом.
Извините за длинное объяснение. Такого рода вещи проще реализовать, чем документировать. Но производительность и площадь могут быть отличными.