我希望能够以两种不同的方式访问大量数据。我希望基于密钥,使用一个密钥的恒定时间插入和使用另一个密钥的恒定时间删除来恒定查找。是否有这样的数据结构,我可以使用tr1中的数据结构构建一个并且可能是boost吗?
答案 0 :(得分:4)
使用两个并行哈希表。确保密钥存储在元素值中,因为在删除期间您将需要所有密钥。
答案 1 :(得分:1)
你看过Bloom Filters了吗?它们不是O(1),但我认为它们在查找所需的时间和空间方面比哈希表表现更好。
答案 2 :(得分:1)
很难找到为什么你需要这样做,但有人说尝试使用2个不同的哈希表。 这里只是伪代码:
Hashtable inHash;
Hashtable outHash;
//Hello myObj example!!
myObj.inKey="one";
myObj.outKey=1;
myObj.data="blahblah...";
//adding stuff
inHash.store(myObj.inKey,myObj.outKey);
outHash.store(myObj.outKey,myObj);
//deleting stuff
inHash.del(myObj.inKey,myObj.outKey);
outHash.del(myObj.outKey,myObj);
//findin stuff
//straight
myObj=outHash.get(1);
//the other way; still constant time
key=inHash.get("one");
myObj=outHash.get(key);
不确定,那就是你要找的东西。
答案 3 :(得分:0)
这是标准容器设计的限制之一:容器在某种意义上“拥有”所包含的数据,并期望成为唯一的所有者......容器不仅仅是“索引”。 对于您的情况,一个简单但不是100%有效的解决方案是将两个std :: maps以“Node *”作为值并将两个键存储在Node结构中(因此您将每个键存储两次)。使用这种方法,您可以以合理的开销更新数据结构(您将进行一些额外的地图搜索,但这应该足够快)。
可能“正确”的解决方案然而IMO会像
struct Node
{
Key key1;
Key key2;
Payload data;
Node *Collision1Prev, *Collision1Next;
Node *Collision2Prev, *Collision2Next;
};
基本上将每个节点同时放在两个不同的哈希表中。
标准容器不能以这种方式组合。我过去手工编码的其他示例例如是哈希表,其中所有节点也在双向链表中,或者所有节点也在数组中的树。
对于非常复杂的数据结构(例如结构网络,其中每个结构都是几个链的“所有者”,同时是几个其他链的一部分)我甚至有时采用代码生成(即生成正确指针处理代码的脚本)给出了数据结构的描述。)