我有一个按键值排序的项目数组,通过二进制搜索检索项目。这些项目的简化版本看起来像这样:
struct Item
{
uint64_t key;
uint64_t data;
};
我正在寻找减少密钥开销的方法。键值不用于搜索以外的任何内容。假设插入成本不是问题,但检索成本是,我可以使用哪种替代数据结构将簿记开销减少到每件少于64位的东西?
唯一的另一个“问题”是我需要能够检测到集合中不存在密钥的情况。
答案 0 :(得分:2)
一个显而易见的可能性是将您的密钥视为8个单独的字节并从中构建一个特里结构。这组合了你的键中的公共前缀,所以如果你有(例如)一千个具有相同第一个字节的项目,你只存储第一个字节一次而不是一千次。
答案 1 :(得分:1)
为了能够检测到您的密钥中没有密钥,您需要以某种方式存储密钥。由于密钥是随机的,因此使用巧妙的数据结构无法将密钥压缩为少于64位。因此,就你的内存消耗而言,你现在这样做是最优的。
如果键有一些结构或可预测性,那将是一个不同的故事。
答案 2 :(得分:0)
如果“按键基本上是随机的”,那么除了现在使用的内容之外,你没有太多选择。对于64位整数,你甚至不能假设一组密集的密钥。
您可以利用的密钥还有什么吗? ......也许很多钥匙都在彼此附近......还是别的什么? ...在这种情况下,您可以构建多级哈希表或尝试存储数据。