矢量没有正确填充

时间:2015-10-21 05:40:51

标签: c++ vector

我试图使用线性探测公式(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 ...

2 个答案:

答案 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!
}