我正在尝试使用向量创建哈希表,或者最好使用带结构的表?
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;
}
}
}
答案 0 :(得分:0)
这个问题可以更好地重新表述为:两个表中都存在两个值。看起来你正试图让T3HS保持已发现元素的指数。
您的代码:
for (int i = 0; i <= T2[0]; i++){
}
要遍历向量,我总是使用:
for (int i = 0; i <= T2.length(); i++){
}
答案 1 :(得分:0)
有N
或N+1
个哈希表向量,但您只需查看T2[0]
个哈希表向量。
顺便提一下,当T2
为T2[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
,你会好多了,因为它知道它有多长。
使用起来越容易,误用的可能性就越小。让一切尽可能明显。