哈希表在增加大小后重新插入

Hash Table reinserting after increasing in size

本文关键字:新插入 插入 增加 哈希表      更新时间:2023-10-16

我一直在研究这个哈希表的实现,但我遇到了一个障碍。我修改了构造函数和插入函数,以便在容量达到时能够调整数组的大小,但我在调整大小时遇到了问题。现在,它似乎在无限地插入负面数据,我不知道为什么。我应该在resize中实现迭代器还是有更简单的方法?

函数如下:

调整:

template <class RecordType>
void table<RecordType>::resize( )
{
    RecordType *oldData = data;
    int oldSize = CAPACITY;
    int newSize = CAPACITY *2;
    //create a new table
    RecordType *newData;
    newData = new RecordType[CAPACITY];
    size_t i;
    used = 0;
    for (i = 0; i < CAPACITY; i++)
        newData[i].key = NEVER_USED;
    data = newData;
    delete[] newData;
    //place data from old table to new, larger table.
    for(int i = 0; i < oldSize; i++)
    {
            RecordType next = oldData[i];
            insert(next);
    }
    CAPACITY = newSize;
    delete[] oldData;
}
构造函数:

template <class RecordType>
table<RecordType>::table( )
{
    CAPACITY = 30;
    data = new RecordType[CAPACITY];
    size_t i;
    used = 0;
    for (i = 0; i < CAPACITY; ++i)
        data[i].key = NEVER_USED;
}
插入:

template <class RecordType>
void table<RecordType>::insert(const RecordType& entry)
// Library facilities used: cassert
{
    bool already_present;   // True if entry.key is already in the table
    size_t index;        // data[index] is location for the new entry
    assert(entry.key >= 0);
    // Set index so that data[index] is the spot to place the new entry.
    find_index(entry.key, already_present, index);
    // If the key wasn't already there, then find the location for the new entry.
    if (!already_present)
    {
        if (size( ) >= CAPACITY)
        {
            resize( ); // resize the table.
            insert(entry); // reinsert entry into new table.
        }
        else if (size( ) < CAPACITY)
        {
            index = hash(entry.key);
            while (!is_vacant(index))
                index = next_index(index);
            ++used;
        }
    }
    data[index] = entry;
    size_t i;
    for (i=0; i<CAPACITY; i++) cout << data[i].key << ' ';
    cout << endl;
}

谢谢你的帮助!

您的resize()正在调用将数据放入data[]insert()。然后resize()用空的(充满NEVER_USED的)newData数组覆盖data。我的猜测是,你想摆脱newData,只使用data代替。

您可能也应该重新考虑CAPACITY *= CAPACITY,因为当您尝试将此代码用于实际内容时,这将会爆炸。