哈希表搜索函数使用向量在c++中

Hash table search function using Vectors in C++

本文关键字:c++ 向量 搜索 函数 哈希表      更新时间:2023-10-16

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

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;
            }
        }
}

这个问题可以更好地改写为:两个表中都存在两个值。似乎你试图让T3HS保存已找到元素的索引。

代码:

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

要循环遍历vector,我总是使用:

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

NN+1哈希表向量,但您只查看其中的T2[0]

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

需要一段时间才能到达那里,所以请耐心等待。

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];

with vectors。永远不要new,除非你绝对必须这样做,因为你必须new,你必须delete,并且弄清楚何时何地删除东西可能是一个痛苦的屁股。让编译器为你做。

接下来,有一组描述哈希表的函数和数据。不妨把所有这些都打包到hashtable类中。

最后想想你是如何使用hashtable的。你想让它简单明了。您不会想要一个长达一页的注释来解释T2[0]包含列表的长度,并且必须始终不大于列表长度的1。你只知道有人会读错。是你让120programalarm犯了这个错误,他们可不是傻瓜。您最好使用另一个包含长度的变量,或者再次使用vector,因为它知道它的长度。

你做的东西越容易使用,它被误用的可能性就越小。