使用C ++中的Vectors进行散列表搜索功能

时间:2016-10-13 19:56:46

标签: c++ vector

我正在尝试使用向量创建哈希表,或者最好使用带结构的表?

vector<int>*hashtable = new vector<int>[m];

    for(int i = 0; i<N; i++){
        temp = T1[i] % m;
        hashtable[temp].push_back(T1[i]);


    for (int i = 0; i <= T2[0]; i++){
        valuefound = 0;
    std::vector<int>::iterator it;
    for (it = hashtable[i].begin(); it != hashtable[i].end(); ++it){
        if(T2[i+1] == *it){
            T3HS[i] = i;
            valuefound = 1;
            }
        }

}

3 个答案:

答案 0 :(得分:0)

这个问题可以更好地重新表述为:两个表中都存在两个值。看起来你正试图让T3HS保持已发现元素的指数。

您的代码:

for (int i = 0; i <= T2[0]; i++){
}

要遍历向量,我总是使用:

for (int i = 0; i <= T2.length(); i++){
}

答案 1 :(得分:0)

NN+1个哈希表向量,但您只需查看T2[0]个哈希表向量。

顺便提一下,当T2T2[i+1]时,您的搜索模式循环将使用i访问T2[0]数组的末尾。

答案 2 :(得分:0)

花一点时间去那儿,忍受我。

for (int i = 0; i < N; i++)
{
    temp = T1[i] % m;
    hashtable[temp].push_back(T1[i]);
}

将数字排序到箱中并存储它们。 Groovy的。这里没问题。但是这个:

    std::vector<int>::iterator it;
    for (it = hashtable[i].begin(); it != hashtable[i].end(); ++it)
    {
        if (T2[i + 1] == *it)
        {
            T3HS[i] = i;
            valuefound = 1;
        }
    }

不会在数字中查看这些数据箱。它遍布整个地方。你想做的就是看看右边的垃圾箱。

    int searchval = T2[i + 1]; // cache the number we're looking for. Easier debugging
    int binindex = searchval % m; // get the bin for this number
    std::vector<int>::iterator it;
    // now we look just in that one bin.
    for (it = hashtable[binindex].begin(); it != hashtable[binindex].end(); ++it)
    {
        if (searchval == *it)
        {
            T3HS[i] = i;
            valuefound = 1;
            break;// found it . Stop looking.
        }
    }

在此之后,有很多改进:

从基于范围的for循环开始

    int searchval = T2[i + 1];
    int binindex = searchval % m;
    for (int val: hashtable[binindex])
    {
        if (searchval == val)
        {
            T3HS[i] = i;
            valuefound = 1;
            break;
        }
    }

接下来,将搜索算法剪切掉并将其放入自己的函数中。这摆脱了valuefound之类的糠..该函数返回是否找到该值。一个函数应该只做一件事和一件事。有时候,有一件事就是聚合了许多其他功能。首先,考虑一下你在搜索功能中构建哈希表。有一个函数来创建一个哈希表和另一个搜索它更有意义。这两个函数只做一件事。作为额外的奖励,将它们拆分意味着您可以重复使用哈希表进行多次搜索。

bool search (int searchval, vector<int>*hashtable, int m)
{
    int binindex = searchval % m;
    for (int val: hashtable[binindex])
    {
        if (searchval == val)
        {
            return true;
        }
    }
    return false;
}

并将其命名为

for (int i = 0; i <= T2[0]; i++)
{
    if (search(T2[i+1], hashtable, m))
    {
        T3HS[i] = i;
    }
    else
    {
        T3HS[i] = -1;
    }
}

然后你进一步向外扩展并填补所有内存泄漏,如

int *T3HS = new int[T2[0]];

vector<int>*hashtable = new vector<int> [m];

vectors。从来没有new,除非你绝对必须,因为你new所需要的一切delete,以及弄清楚删除东西的时间和地点都可能是一个痛苦的屁股。让编译器为你做。

接下来,您有一组描述哈希表的函数和数据。不妨将所有内容捆绑到hashtable类中。

最后想想你如何使用hashtable。你想让它变得简单明了。您不希望页面长的注释解释T2[0]包含列表的长度,并且必须始终不大于列表长度的一个。你只知道有人会读错了。你把1201ProgramAlarm吸进去犯这个错误,而且他们不是假的。使用包含长度的另一个变量或者再次使用vector,你会好多了,因为它知道它有多长。

使用起来越容易,误用的可能性就越小。让一切尽可能明显。