任何人都可以解释一下,DeletedNode类正在做什么DeletedNode():HashNode(-1, -1){}
的目的。
请在此解释指针概念
HashNode ** htable = new HashNode*[Tablesize];
const int Tablesize=10;
class HashNode {
public:
int key;
int value;
HashNode(int key, int value) {
this->key=key;
this->value=value;
}
};
class DeletedNode : public HashNode {
private:
static DeletedNode * entry;
DeletedNode() : HashNode(-1, -1) {} // Please explain this
public:
static DeletedNode * getNode() {
if (entry == NULL)
entry = new DeletedNode();
return entry;
}
};
DeletedNode * DeletedNode::entry = NULL; //Why this?
class HashMap {
public:
HashNode ** htable;
HashMap() {
htable = new HashNode*[Tablesize]; // Please explain the pointer concept here
for (int i = 0; i < Tablesize; i++)
htable[i] = NULL;
}
int HashFunc(int key) { return key % Tablesize; }
};
答案 0 :(得分:1)
考虑从哈希表中删除条目时会发生什么,哈希表是“冲突群集”的一部分,“冲突群集”是一个恰好具有相同哈希值的连续元素块。
假设元素A,B和C都散列为相同的值h
。在这种情况下,它们将分别插入位置h
,h + 1
和h + 2
的表格中:
--------
A h
--------
B h + 1
--------
C h + 2
--------
如果删除B会发生什么?如果我们天真地删除,那么A和C之间会有一个漏洞:
--------
A h
--------
h + 1
--------
C h + 2
--------
现在,如果您尝试在哈希表中查找C,其哈希值将为h
,因此搜索它将从位置h
开始。但是,位置h + 1
的下一个条目现在为空,因此线性探测搜索将提前终止,您将得到错误的结果,即C不在表中。
为了防止搜索过早终止,需要在空白处插入一个特殊的“虚拟”节点,其中说“某天某些东西现在已被删除,但我是其中的一部分无论如何都是一个碰撞集群,所以继续搜索“。