我有可变长度的列表,其中每个项目可以是四个唯一的项目之一,我需要将其用作映射中另一个对象的项目。假设每个值可以是0,1,2或3(这不是我真正的代码整数,但很多更容易解释这种方式),因此项列出的几个例子可以是:作为键的值列表
[1, 0, 2, 3]
[3, 2, 1]
[1, 0, 0, 1, 1, 3]
[2, 3, 1, 1, 2]
[1, 2]
所以,重新迭代:列表中的每个项目可以是0,1,2或3,列表中可以有任意数量的项目。
我的第一种方法是尝试散列数组的内容,使用内置的.NET中的GetHashCode()来组合每个元素的散列。但因为这将返回一个int我不得不手动处理碰撞(两个相等的int值与一个字典相同)。
所以我的第二种方法是使用四叉树,将列表中的每个项目分解成一个节点,该节点具有四个指针(每个可能值一个)到接下来的四个可能的值(根节点代表[]
,一个空表),插入[1, 0, 2] => Foo
,[1, 3] => Bar
和[1, 0] => Baz
到这棵树应该是这样的:
Quad Tree Diagram http://episerversucks.com/upload/Diagram1111.png
灰色节点的节点不被使用的指针/节点。虽然我担心这个设置的性能,但是不需要处理散列冲突,并且树不会变得很深(主要是存储2-6个项目的列表,很少超过6个)。
是否有一些其他的魔术方式来存储项目的值列表作为我已经错过的键?
这并不区分列表[0; 1; 2; 3]和列表[1; 2; 3]。 – Brian 2010-04-04 19:17:45
您可以通过将散列的初始值设置为1来解决此问题,但是您将自己限制为14个元素。这是我能想到的处理起始和尾随零的唯一方法。你可以调整它来处理15个元素。 – gradbot 2010-04-04 19:43:09
@Brian,@gradbot,我忘了标题0,并修改了我的代码,以1开始散列,以允许14个项目。感谢您指出。 – 2010-04-04 20:17:06