Самый быстрый тип коллекции индексированных сложных объектов - PullRequest
0 голосов
/ 05 ноября 2019

Я ищу самый элегантный, быстрый и эффективный способ хранения нескольких объектов класса Point с индексом / ключом в любом виде коллекции.

Point содержит такие атрибуты, как index, posX, posY, area, neighborPoints[], AdjacentTriangles[] и т. Д. И используются для создания триангуляции Делоне и сетки Вороного.
По причинам выбора отдельные точки должны иметь индекс в коллекции, но их не нужно упорядочивать.
Во время триангуляции я создаю и , удаляя точек. Также я хочу пройти через все точки в коллекции. Следовательно, тип сбора должен быть оптимизирован для этих операций.

Вначале я использовал List<Point> для хранения точек, и вхождение в списке было идентично индексу точки. В случае удаления одной точки списка мне пришлось уменьшить все индексы высших точек. Это звучит довольно неудобно и отнимает много времени.

Именно поэтому я попробовал Dictionary<int, Point> впоследствии. Здесь индексы являются фиксированными, и если я удалю, например, вторую точку, то все более высокие точки, может быть, Point[5] останутся Point[5], просто Point[1] больше не будет (возврат null). Тем не менее, мое время выполнения теперь стало еще длиннее (см. Рисунок), хотя мне больше не нужно выполнять сдвиг индекса. (Почему это так?) runtimes

Использование Hashmap не имеет смысла для меня, так как тогда я не смог бы использовать вызовы типа Point.posX (код ошибки CS1061), потому что в Hashmap тип данных не задан.

Есть ли у вас какие-либо предложения относительно эффективного типа сбора с более высокой производительностью?

1 Ответ

0 голосов
/ 08 ноября 2019

Вы можете отсортировать точки по кривой Гильберта. В основном алгоритм Бойера-Ватсона использует кривую Гильберта.

...