我正在解决一个问题,即我在内存中的数据库中始终有一个完整的表,具有低范围和高范围的9位数字。我给出了一个9位数的数字,我需要根据该数字是否在该范围内来查找表中的其余列。例如,如果范围是100,000,000到125,000,000并且我得到了数字117,123,456,那么我会知道我在100-125密耳范围内,无论指向的数据向量是我将要使用的。 / p>
现在我能想到的最好的查找时间是log(n)运行时。这是好的,充其量,但仍然很慢。该表至少有100,000个条目,每次执行此应用程序(10次以上/天)时,我需要在此表中查找数万个(如果不是数十万次)的数值。
所以我想知道是否可以使用unordered_set,编写我自己的Hash函数,ALWAYS为范围内的每个数字返回相同的哈希值。使用上面的相同示例,100,000,000到125,000,000将始终返回,例如,AB12CD的哈希值。然后,当我使用117,123,456的查找值时,我将获得相同的AB12CD哈希并且查找时间为O(1)。
这是可能的,如果有的话,任何想法如何?
提前致谢。
答案 0 :(得分:0)
是。假设您可以按顺序对间隔进行编号,则可以将多项式拟合到截止值,并从多项式中接收索引值。例如,截止值为100,000,000,125,000,000,250,000,000和327,000,000,您可以使用点(100,0),(125,1),(250,2)和(327,3),将一阶导数限制为[ 0,1]。假设你有一个表现良好的区间,你可以用N(n + 2)次多项式拟合N个截止值。
拥有所需哈希值的表格;使用floor [polynomial(i)]作为表中的索引。
答案 1 :(得分:0)
你能写出这样的哈希函数吗?是。评估它会比搜索慢吗?那就是捕获......
我个人会解决这个问题如下。我有一个所有值的排序向量。然后我会根据n >> 8
的值将索引跳转到该向量中。
所以现在你的逻辑是你在跳转表中找出你要跳到的位置以及你应该考虑多少值。 (只需看看你降落的位置与下一个索引的距离,看看范围的大小。)如果整个范围都转到同一个向量,你就完成了。如果只有少数条目,请进行线性搜索以查找您所属的位置。如果它们是很多条目,请进行二分查找。尝试使用您的数据来查找二进制搜索何时胜过线性搜索。
模糊的记忆表明,权衡大约在100左右,因为预测分支错误是昂贵的。但这是多年前的一个模糊的记忆,所以为自己进行实验。