【发布时间】:2012-02-04 15:37:25
【问题描述】:
我基于我最近发现的关于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()
{
...;
}
}
这里我没有使用 equal 来检查是否相等,而是用于重叠,这在其他地方肯定会很烦人,但我这样做是有原因的。
我假设如果一个值可以在 O(1) 时间内从一个键中查找到,那么一个键也可以从它自身中查找到。
所以我大概可以将数千个边界重叠并这样做:
overlap.ContainsKey(new bounds(...));
在 O(1) 时间内找出给定边界是否与集合中的任何其他边界重叠。
我也想知道如果我改变边界的 (x, y) 位置会发生什么,大概这就像删除然后再次将其添加到集合中一样,性能明智,非常昂贵?
我在 GetHashCode 函数中添加了什么?
目标
如果这可行,那么我在使用这种机制来找出给定边界重叠的其他边界之后。
在这个系统中移动的边界很少,并且在填充集合后不会添加新的边界。新添加的边界需要能够与旧边界重叠。
结论
有关详细信息,请参阅下面的反馈。
总而言之,不可能达到 O(1) 的性能,因为与默认的 equals 不同,重叠检查不是传递性的。
然而,区间树是一个很好的解决方案。
【问题讨论】:
-
如果您尝试添加与任何已插入的边界重叠的边界,这将不起作用。但是,如果您创建一个执行重叠检查的派生类(假设您创建了一个好的哈希码)
-
谢谢。他们确实需要能够做到。你能给出一个例子吗?
标签: c# object hash dictionary hashset