Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在cpp中创建固定大小(内存方面)的哈希表?_C++_Hash_Hashtable - Fatal编程技术网

C++ 如何在cpp中创建固定大小(内存方面)的哈希表?

C++ 如何在cpp中创建固定大小(内存方面)的哈希表?,c++,hash,hashtable,C++,Hash,Hashtable,我正在处理大量基于某些输入生成浮点的计算。如果我缓存这些数量,似乎可以优化相当数量的重复调用。问题是,我不想缓存超过一定数量的内存使用量(即10GiB)。当我定义一个散列映射时,或者在每次元素添加到映射时动态测试时,是否有一种方法来定义它?在每个条目中存储一个时间戳,并在散列表接近边界值时关注其容量,刷新旧条目。为每个条目存储一个时间戳,并密切关注哈希表的容量,当它接近边界值时,刷新旧条目。实现这一点的一种方法是实现LRU缓存(“最近最少使用”)它允许您始终修剪未引用时间最长的元素。对于某些使用

我正在处理大量基于某些输入生成浮点的计算。如果我缓存这些数量,似乎可以优化相当数量的重复调用。问题是,我不想缓存超过一定数量的内存使用量(即10GiB)。当我定义一个散列映射时,或者在每次元素添加到映射时动态测试时,是否有一种方法来定义它?

在每个条目中存储一个时间戳,并在散列表接近边界值时关注其容量,刷新旧条目。

为每个条目存储一个时间戳,并密切关注哈希表的
容量
,当它接近边界值时,刷新旧条目。

实现这一点的一种方法是实现LRU缓存(“最近最少使用”)它允许您始终修剪未引用时间最长的元素。对于某些使用模式,这优化了所需的下一项仍在缓存中的可能性

设计一个LRU缓存曾经是一个常见的面试问题(也许现在仍然是),所以有很多答案有待找到。看起来相当完整

但我不会这么做。10Gib是大量内存,您可以在该空间中保留大量条目。如果您可以消除开销并保留两倍的缓存条目,那么牺牲LRU缓存的精度可能是值得的。而且,消除开销还可以累计为您节省足够的周期,以抵消使用非最佳缓存修剪策略所需的周期。无论如何,LRU可能不是解决问题的最佳方案。谁知道呢

有了一个好的散列函数和一个大的散列表,您可以使用另一种策略:每个散列值只保留一个条目。该解决方案的优点是几乎没有开销。不需要时间戳,甚至不需要桶列表指针。不需要通过链跟踪来查看条目是否在缓存中;第一个命中的是条目或要替换的条目。实际上,如果您的条目不是太大,则很容易使可用条目数翻倍

为了获得更精确的解决方案,可以为每个哈希值保留两个条目,有点像简化的布谷鸟哈希。同样,没有存储开销(只要每个散列值最终都被使用),查找成本只会稍微高一点。(实际上很少,因为两个条目应该在同一个内存缓存线中。)要获得类似LRU行为的信息,在这个变体中,如果找到的缓存条目是哈希值的第二个条目,则交换这两个条目。(事实上,在第一个条目不是您需要的条目之后交换两个条目;然后使用或替换现在是第一个条目的条目。)

C++标准库没有一个非链表哈希表,但是数据结构太小了,几乎不需要库支持。该库可能具有的有用功能是哈希支持。(有关更多哈希值,请参阅,如果您的密钥是

std::pair
std::tuple
,则特别有用)


除此之外,您真正需要的只是一个键值对数组,它的大小可以根据您想要在缓存中抛出的内存量来确定。初始化这个数组有一个小问题:它需要初始化为某种东西,这通常是默认键和值构造函数生成的任何东西。但与默认键对应的实际插槽需要具有正确的值(不太可能是默认值),或者需要将其更改为具有不同散列值的不同键

实现这一点的一种方法是实现一个LRU缓存(“最近使用最少的”),它允许您始终修剪未引用时间最长的元素。对于某些使用模式,这优化了所需的下一项仍在缓存中的可能性

设计一个LRU缓存曾经是一个常见的面试问题(也许现在仍然是),所以有很多答案有待找到。看起来相当完整

但我不会这么做。10Gib是大量内存,您可以在该空间中保留大量条目。如果您可以消除开销并保留两倍的缓存条目,那么牺牲LRU缓存的精度可能是值得的。而且,消除开销还可以累计为您节省足够的周期,以抵消使用非最佳缓存修剪策略所需的周期。无论如何,LRU可能不是解决问题的最佳方案。谁知道呢

有了一个好的散列函数和一个大的散列表,您可以使用另一种策略:每个散列值只保留一个条目。该解决方案的优点是几乎没有开销。不需要时间戳,甚至不需要桶列表指针。不需要通过链跟踪来查看条目是否在缓存中;第一个命中的是条目或要替换的条目。实际上,如果您的条目不是太大,则很容易使可用条目数翻倍

为了获得更精确的解决方案,可以为每个哈希值保留两个条目,有点像简化的布谷鸟哈希。同样,没有存储开销(只要每个散列值最终都被使用),查找成本只会稍微高一点。(实际上很少,因为两个条目应该在同一个内存缓存线中。)要获得类似LRU行为的信息,在这个变体中,如果找到的缓存条目是哈希值的第二个条目,则交换这两个条目。(事实上,在第一个条目不是您需要的条目之后交换两个条目;然后使用或替换现在是第一个条目的条目。)

C++标准库没有一个非链表哈希表,但是数据结构太小了,以至于几乎没有。