在c ++中使用线性探测进行哈希处理

时间:2015-06-29 06:17:18

标签: c++ algorithm hash

任何人都可以解释一下,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; }
};

1 个答案:

答案 0 :(得分:1)

考虑从哈希表中删除条目时会发生什么,哈希表是“冲突群集”的一部分,“冲突群集”是一个恰好具有相同哈希值的连续元素块。

假设元素A,B和C都散列为相同的值h。在这种情况下,它们将分别插入位置hh + 1h + 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不在表中。

为了防止搜索过早终止,需要在空白处插入一个特殊的“虚拟”节点,其中说“某天某些东西现在已被删除,但我是其中的一部分无论如何都是一个碰撞集群,所以继续搜索“。