【问题标题】:Efficiently "Hash" Set of Values to Indice有效地“散列”一组值以进行索引
【发布时间】:2014-05-29 20:45:35
【问题描述】:

首先,免责声明;哈希对于我的目标来说是一个有点不准确的术语,请随时提出更好的标题。

无论如何,我目前正在尝试编写一个实时运行的复杂空间算法。为了节省周期,我决定生成一个包含所有 32,000 种可能性的查找表。

如果我按照惯例这样做,值(包括范围和字段计数)2x +0 -> +15 和 3x -2 -> +2 将分别映射到两个四位和三个三位值,给我一个 2 ^ (2*4 + 3*3) = 131,072 个条目的查找表大小,几乎是 410% 的浪费

鉴于算法的性质,冲突绝对会削弱它的功能(所以没有传统的哈希函数,除非我能保证不会与所有相关值发生冲突)。除此之外,我正在使用的结构相当大(即,我/真的/希望避免分配超过 200% 的我需要的东西)。最后,由于这个表会经常被引用,我想避免传统哈希表在桶查找和过于复杂的哈希函数中的开销。

采用更传统的计算机科学方法后,我开始坚信解决方案在于我完全不知道的一些基本转换数学。知道是否是这种情况吗?

【问题讨论】:

    标签: c++ hash lookup lookup-tables


    【解决方案1】:

    您可以像计算最大组合数一样计算索引,方法是乘以每个元素。将每个元素从最高有效到最低有效,添加一个常数使其范围为 0 到 n-1,然后乘以剩余组合数。

    给定 a、b 的 0 到 15 个值(范围为 16)和 c、d、e 的 -2 到 +2 个值(范围为 5):

    index = a * 16*5*5*5 + b * 5*5*5 + (c+2) * 5*5 + (d+2) * 5 + (e+2);
    

    【讨论】:

    • 感谢您的回答,马克!我刚才也想通了,尽管我实施的解决方案略有不同。由于这两个 16 范围的值可以简单地连接并映射到单个字节,因此可以简化 U7b(c+d*5+e*5*5) 请原谅我明显缺乏学习七年级数学,我猜哈哈?
    猜你喜欢
    • 2021-10-14
    • 1970-01-01
    • 2019-12-10
    • 2015-02-09
    • 2018-09-25
    • 1970-01-01
    • 2018-01-02
    • 1970-01-01
    • 2021-12-19
    相关资源
    最近更新 更多