【问题标题】:How does this insertion and deletion logic from a hashtable work?哈希表中的这种插入和删除逻辑是如何工作的?
【发布时间】:2012-09-19 20:15:26
【问题描述】:

一段时间以来,我一直在努力理解它在 gdb 中的工作原理,但我很难理解它。基本上有一个数组(elements_),其中的东西被散列,这些东西是指向包含用于链接的某些钩子的结构的指针。这是一个示例结构:

struct foo
{
    Data  data;
    foo*  next;
    foo** prevNext;
};

然后哈希表被实例化

HashTable<foo> hash;

它的插入函数看起来像这样(为了简单起见,我省略了调整大小和全部)

template <class T>
void HashTable<T>::insert(T* x)
{
    int bucket  = hashFunc(x->data);
    T** xPtr    = &elements_[bucket];
    x->next     = *xPtr;
    x->prevNext = xPtr;

    if (x->next)
        x->next->prevNext = &x->next;

    *xPtr = x;
}

去除如下

template<class T>
void HashTable<T>::remove(T* x)
{
    if (x->next)
        x->next->prevNext = x->prevNext;

    *x->prevNext = x->next;
}

作为参考,它的搜索方式是这样的:

template<class T>
T* HashTable<T>::find(Data& data)
{
    int bucket = hashFunc(data);

    T* ptr = elements_[bucket];
    while (ptr != 0)
    {
        if(ptr->data == data)
            return ptr;
        ptr = ptr->next;
    }
    return 0;
}

我一直在尝试跟踪 2-3 个碰撞元素的插入(通过将表大小设置为小开始)和删除以查看逻辑是什么,但我不明白。这是我认为删除操作(删除节点 2)正在做什么的图表,尽管我的脑海中仍然有点模糊:

【问题讨论】:

    标签: c++ pointers hashtable


    【解决方案1】:

    属于同一个桶的元素存储为双向链表(有点)。

    查找遍历该列表,直到找到与 data 值匹配的元素。

    【讨论】:

    • 是的,我不明白的是“某种双向链表”的实现
    • @PalaceChan:嗯,每个节点都包含一个指向下一个节点的指针(“下一个指针”),以及一个指向前一个节点的下一个指针的指针。
    • 下一个指针没问题,但后者是一个指向前一个节点的双指针,而不是我可以判断的下一个指针。我对此感到困惑,为什么要使用双指针以及链接/取消链接逻辑的工作原理。
    • @PalaceChan:好东西。如果你能通过这样的结构思考自己,你最终就能理解一切:-)
    猜你喜欢
    • 1970-01-01
    • 2014-05-25
    • 2016-08-29
    • 2010-10-18
    • 2014-04-28
    • 2020-12-07
    • 1970-01-01
    • 2013-09-17
    • 1970-01-01
    相关资源
    最近更新 更多