【发布时间】:2017-11-03 15:43:42
【问题描述】:
我正在解决一个问题,即我始终在内存中拥有数据库中的整个表,其中包含 9 位数字的低范围和高范围。我得到了一个 9 位数字,我需要使用它来根据该数字是否在该范围内来查找表中的其余列。例如,如果范围是 100,000,000 到 125,000,000 并且给了我一个数字 117,123,456,那么我会知道我在 100-125 百万范围内,并且任何指向的数据向量都是我将使用的。
现在我能想到的最好的查找时间是 log(n) 运行时间。这没关系,充其量是,但仍然很慢。该表至少有 100,000 个条目,每次执行此应用程序(每天 10 次以上),我都需要在该表中查找数万次(如果不是十万次)的值。
所以我想知道是否可以使用 unordered_set 代替,编写我自己的 Hash 函数,该函数总是为范围内的每个数字返回相同的哈希值。使用上面的相同示例,从 100,000,000 到 125,000,000 将始终返回例如 AB12CD 的哈希值。然后当我使用查找值 117,123,456 时,我会得到相同的 AB12CD 哈希,并且查找时间为 O(1)。
这可能吗,如果可以,有什么想法吗?
提前致谢。
【问题讨论】:
-
范围是否等间隔?范围是连续的吗?例如:0 - 1000、1000 - 2000、2000- 3000...
-
您想编写自己的完美哈希函数以避免冲突吗?您是否尝试过使用默认的
std::unordered_map? -
@stack_n_queue 不幸的是没有。在某些情况下,范围是 1。在其他情况下,范围是数百万。
-
@Snps 我觉得你还没有理解我想要表达的想法。我正在使用无序映射,但是我不希望无序映射中有 10 亿个条目。我希望地图为每个 RANGE 条目返回不同的哈希值。
-
Log2(100,000) 大约是 17,17 次比较几乎没有。使用排序的向量,而不是地图。
标签: c++ algorithm hash hashmap