我需要一个存储元组的数据结构,并允许我进行如下查询:给定整数的(x,y,z)
,找到下一个(它的上限)。我的意思是考虑自然顺序(a,b,c)<=(d,e,f) <=> a<=d and b<=e and c<=f
。我已经尝试过MSD基数排序,它将项目拆分为存储桶并对它们进行排序(并对元组中的所有位置进行递归处理)。有没有人有其他建议?理想情况下,我希望在O(log n)中发生abouve查询,其中n是元组的数量。
答案 0 :(得分:2)
两个选项。
对已排序的数组使用二进制搜索。如果你用(a&lt;&lt;&lt; 64)|(b&lt;&lt; 32)| c构建密钥(假设是32位int)并将它们保存在一个简单的数组中,将一个包装在另一个旁边,你可以使用二进制搜索来定位你要搜索的值(如果使用C,甚至有一个库函数来执行此操作),下一个只是一个位置。最糟糕的情况是性能是O(logN),如果你可以做http://en.wikipedia.org/wiki/Interpolation_search那么你甚至可以接近O(log log N)
二进制密钥问题可能很难添加新值,如果超出可用内存可能需要回转。但它很快,平均只有少量随机存储器访问。
或者,您可以通过以某种形式生成带有| b | c的键来构建哈希表,然后让哈希数据指向包含下一个值的结构,无论可能是什么。可能有点难以创建,因为生成表时您需要知道下一个值。
哈希方法的问题是它可能会使用比二进制搜索方法更多的内存,如果你没有得到哈希冲突,性能会很好,但是后来开始下降,尽管这种算法有一些变化可以帮助解决某些情况。插入新值可能更容易使用哈希方法。
我也看到你在这些方面有类似的问题,所以我想我所说的内容是将A,b,c结合起来产生一个长密钥,并将其用于二分搜索,哈希甚至b -树。如果密钥的长度是你的问题(用什么语言),你能把它当作字符串吗?
如果这个答案完全偏离基础,请告诉我,我会看看是否可以删除这个答案,所以你的问题仍然没有答案,而不是无用的答案。