我试图使用线性探测公式(h(k)= k%T,其中T是表大小)计算出在指定大小的哈希表中发生冲突之前的平均插入次数。我正在进行100次“实验”以计算碰撞前的平均插入次数。这是我为这个只有23的表格编写的代码:
#include <iostream>
#include <vector>
#include <algorithm>
#include <time.h>
using namespace std;
int main()
{
int sizeArray[7] = { 7, 11, 13, 17, 19, 23, 29 }; // ignore for now
double resultArray[7] = { 0 }; // ignore for now
vector<double> hashNumVec; // stores hash keys
int hashValue = 0;
int count = 0;
double average;
vector<double> resultVec;
int randNum;
srand(time(NULL));
for (int k = 0; k < 100; k++){ // 100 experiments
randNum = rand() % 100 + 1; // generate random number
hashValue = (randNum) % 23; // hash value for T = 23
vector<double>::iterator it;
it = find(hashNumVec.begin(), hashNumVec.end(), hashValue);
if (it == hashNumVec.end()){ //no collision
count++;
hashNumVec.push_back(hashValue);
}
else
{
resultVec.push_back(count); // add the amount of insertions to vector
break;
}
}
for (auto i = resultVec.begin(); i != resultVec.end(); ++i)
cout << *i << ' ';
return 0;
}
我期待我的矢量填充100个值。它们中的每一个都是它碰撞所需插入次数的计数值。但是当我打印出来时,它只显示我在向量中有一个值。我做错了什么?
编辑:我只是试图存储每次进行碰撞所需的插入次数。所以让我们说第一次在碰撞前需要6个插入,然后在碰撞前需要5个插入,在碰撞前需要4个插入...依此类推我希望我的矢量读取6 5 4 ...
答案 0 :(得分:2)
那是因为那段代码:
{
resultVec.push_back(count); // add the amount of insertions to vector
break;
}
在第一次检测到的碰撞中打破for
循环。因此,resultVec
中只有一个值可以显示。
修改强>
我期待我的矢量填充100个值。
目前的代码不会这样做。您随机化并创建100个值的哈希值。然后,当检测到碰撞时,仅在resultVec
中存储碰撞计数器。 100次随机化中100次碰撞的概率为0。
将break;
替换为count=0;
。它将打印碰撞之间的插入次数。换句话说,在下一次碰撞发生之前,有多少次没有碰撞的插入。
<强> EDIT2 强>
如果您要在第一次碰撞之前查找插入次数,则需要将break
替换为
count = 0;
hashNumVec.clear();
您需要清除哈希向量以及计数器,因为每次碰撞后您都希望从头开始测量(否则计数器将显示第二次碰撞前的插入次数,然后是第三次等等。 。)
答案 1 :(得分:0)
您的程序会检查100次插入中是否发生碰撞。它不进行100次试验,计算实现碰撞所需的插入次数。要做到这一点,您需要一个辅助循环:
for (int k = 0; k < 100; k++){ // 100 experiments
for(;;) { // Each experiment continues until the "break" statement in your else clause.
// The loop body, exactly as you currently have it written.
}
count = 0; // Reset for the next experiment!
}