C#HashSet求解相等与不等我根据最近查到的关于Dictionary的性能特点,所以我使用Dictionary,其中bool被忽略但是据说我可以使用HashSet。例如:字典重叠;类边界{publicfloattop_left_x,top_left_y,width,height;publicboolequal(boundsother){returnupper_left_x+width>other.upper_left_x&&upper_left_xother.upper_left_y&&upper_left.left_y_per;}public...GetHashCode(){...;在这里我没有使用equals来检查相等性,而是使用重叠,这在其他地方肯定很烦人,但我这样做是有原因的。我假设如果可以在O(1)时间内从键中查找一个值,那么也可以从其自身查找该键。所以我可能会重叠数千个边界并执行此操作:overlap.ContainsKey(newbounds(...));如果给定的边界与集合中的任何其他边界重叠,则在O(1)中及时找出。我也想知道如果我改变边框的(x,y)位置会发生什么,大概就像删除然后再次将其添加到集合中,性能明智,非常昂贵?我要在GetHashCode函数中输入什么?目标如果这可行,那么我会在使用此机制后找出给定边界与哪些其他边界重叠。在这个系统中,移动的边界很少,并且在填充集合后没有添加新边界。新添加的边框需要能够与旧边框重叠。结论有关详细信息,请参阅下面的反馈。总之,O(1)性能是不可能的,因为检查重叠是不可传递的,这与默认的equals不同。然而,区间树是一个很好的解决方案。在这里,我没有使用equals来检查是否相等,而是使用重叠,这在其他地方肯定会很烦人,但我这样做是有原因的。我假设这意味着您将遇到这样一种情况,其中A.Equals(B)为真,B.Equals(C)为真,但A.Equals(C)为假。换句话说,你的equals是不可传递的。这违反了Equals()的规则,因此Dictionary不适合你。Equals/GetHashCode规则是(来自http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx):如果两个对象比较相等,则每个对象的GetHashCode方法必须返回相同的值。如果您的Equals不是可传递的,那么您不可能编写高效的GetHashCode。在这里使用相等关系是完全错误的关系,因为相等需要是等价关系。也就是说,它必须是自反的-对于任何A,A==A。它必须是对称的-A==B意味着B==A。它必须是传递的-如果A==B且B==C则A==C.你提出侵犯过渡性财产;“overlap”不是传递关系,所以“overlap”不是等价关系,所以你不能把相等定义为重叠。与其尝试做这种危险的事情,不如解决真正的问题。您的目标显然是采用一组间隔,然后快速确定给定间隔是否与其中任何一个重叠。你想要的数据结构叫做区间树;它专门针对此问题进行了优化,因此请使用它。在任何情况下,您都不应尝试将哈希集用作区间树。使用正确的工具:http://wikipedia.org/wiki/Interval_tree如果您使用我上面提到的派生类方法,您需要以下内容:publicclassBounds{publicPointposition;公共点大小;//我知道宽度和高度并不真正组成一个点,但这只是为了演示publicoverrideintGetHashCode(){...}}publicclassOverlappingBounds:Bounds{publicoverrideboolEquals(objectother){//你的实现在这里}}//用法:if(_bounds.ContainsKey(newOverlappingBounds(...))){...}但由于GetHashCode()方法需要始终返回相同的值,运行时的复杂性很可能是O(n)而不是O(1)。您不能使用Dictionary或HashSet来检查边界是否重叠。为了能够使用字典(或哈希集),您需要满足以下属性的Equals()和GetHashCode()方法:Equals()方法是等价关系a.Equals(b)必须暗示a.GetHashCode()==b.GetHashCode()你不能满足这两个要求,所以你必须使用另一种数据结构:区间树。您不能保证自定义哈希码计算字典的O(1)性能。如果我在GetHashCode()方法中放置一些WebService请求,它应该控制所提供的2个项目的相等性,很明显时间永远不会像预期的那样O(1)。好吧,这是一种“边缘案例”,但只是提出一个想法。通过你正在尝试做的事情(假设这甚至是可能的),imo,你否定了Dictionary提供的好处,因此在大型集合上也有恒定的密钥恢复时间。它需要在你拥有的合理数量的对象上进行测量,但我会首先尝试使用一个List作为对象持有者,并制作如下内容:以上是C#学习教程:使用C#HashSet解决不等式问题如果它对你有用,你需要了解更多C#学习教程,希望你多多关注——varbounds=newList{....initialization...}BoundprovidedBound=//something.里面填了一些数据。varoverpedany=bounds.Any(b=>returnb.Equals(providedBound));如需转载请注明出处:
