Я основываюсь на характеристиках производительности, которые я недавно узнал о Dictionary
, поэтому я использую Dictionary<type, bool>
, где bool
игнорируется, но предположительно я мог бы использовать HashSet
.
Например:
Dictionary<bounds, bool> overlap;
class bounds
{
public float top_left_x, top_left_y, width, height;
public bool equal(bounds other)
{
return upper_left_x + width > other.upper_left_x &&
upper_left_x < other.upper_left_x + other.width &&
upper_left_y + height > other.upper_left_y &&
upper_left_y < other.upper_left_y + other.height;
}
public ... GetHashCode()
{
...;
}
}
Здесь я использую не равенство для проверки на равенство, а вместо этого для перекрытия, что неизбежно раздражает в других местах, но есть причина, по которой я это делаю.
Я предполагаю, что если значение может быть найдено с помощью ключа за O (1) время, то и ключ может быть получен от самого себя.
Таким образом, я мог бы предположительно поместить тысячи границ вперекрываются и делают это:
overlap.ContainsKey(new bounds(...));
Чтобы узнать в O (1) раз, перекрывает ли данная граница какие-либо другие из коллекции.
Я также хотел бы знать, что произойдет, еслиЯ изменяю (x, y) положение границы, возможно, это похоже на удаление, а затем добавление его в набор снова с точки зрения производительности, очень дорого?
Что я помещаю в функцию GetHashCode?
гол
Если это сработает, то я нахожусь• используя механизм такого рода, чтобы выяснить, какие другие границы данной границы перекрываются.
В этой системе перемещается очень мало границ, и новые не добавляются после заполнения коллекции.Недавно добавленные границы должны иметь возможность перекрывать старые.
вывод
Подробнее см. В приведенном ниже отзыве.
В целом это невозможнодля достижения производительности O (1), поскольку, в отличие от значений по умолчанию, проверка на перекрытие не является транзитивной.
Однако, дерево интервалов является хорошим решением.