C++ 如何计算哈希表中的冲突数?

C++ 如何计算哈希表中的冲突数?,c++,hash,collision-detection,C++,Hash,Collision Detection,我的insert函数已经正确地处理了冲突,但我希望能够以每种不同的散列方式(链式、线性探测和二次探测)计算冲突的数量。我该怎么做呢 到目前为止,这是我的代码: #include <iostream> #include <fstream> #include <string> #include <vector> #include <iterator> #include <ctime> #include "Chaining.h"

我的insert函数已经正确地处理了冲突,但我希望能够以每种不同的散列方式(链式、线性探测和二次探测)计算冲突的数量。我该怎么做呢

到目前为止,这是我的代码:

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <iterator>
#include <ctime>
#include "Chaining.h"
#include "QuadraticProbing.h"
#include "LinearProbing.h"

using namespace std;

int main()
{
    int collision_count = 0;
    float diff = 0.0;
    clock_t tStart, tStop;
    string ITEM_NOT_FOUND = "ITEM_NOT_FOUND";
    std::vector<std::string> DataArray;
    std::copy(std::istream_iterator<std::string>(std::ifstream("OHenry.txt")),istream_iterator<string>(),back_inserter(DataArray));
    std::vector<std::string> QueryArray;
    std::copy(std::istream_iterator<std::string>(std::ifstream("queries.txt")),istream_iterator<string>(),back_inserter(QueryArray));

    cout << "Testing chaining probing...\n";
    HashTable_chaining ChainingHT( ITEM_NOT_FOUND, 101 );
    int i = 0;
    double average_c = 0.0;
    double total_c = 0.0;
    double temp_c = 0.0;
    while(i != DataArray.size())
    {
        tStart = clock();
        ChainingHT.insert(DataArray[i]);
        tStop = clock();
        total_c = tStop - tStart;
        temp_c = total_c + temp_c;
        average_c = total_c / DataArray.size(); 
        if(DataArray[i] != DataArray[NULL])
        {
            collision_count++;
        }
        i++;
    }   

    cout<<"The number of collisions using Chaining is: "<<collision_count<<endl;
    cout<<"The average time per insertion using Chaining is: "<<average_c<<endl;
    system("pause");
    // Quadratic Probing 
    cout << "Testing quadratic probing...\n";
    HashTable_chaining QuadraticProbingHT( ITEM_NOT_FOUND, 101 );   
    int j = 0;
    int collision_count_quadratic = 0;
    double average_qp = 0;
    while(j != DataArray.size())
    {
        clock_t tStartq = clock();
        QuadraticProbingHT.insert(DataArray[j]);
        if(DataArray[j] != DataArray[NULL])
        {
            collision_count_quadratic++;
        }
        j++;
        average_qp = (((double)(clock() - tStartq)/CLOCKS_PER_SEC) + average_qp) / DataArray.size();

    }   
    cout<<"The number of collisions using Quadratic is: "<<collision_count<<endl;
    cout<<"The average time per insertion using Quadratic is: "<<average_qp<<endl;
#包括
#包括
#包括
#包括
#包括
#包括
#包括“Chaining.h”
#包括“quadraticprobling.h”
#包括“LinearProbing.h”
使用名称空间std;
int main()
{
整数碰撞计数=0;
浮差=0.0;
时钟t启动,t停止;
字符串ITEM\u NOT\u FOUND=“ITEM\u NOT\u FOUND”;
矢量数据阵列;
std::copy(std::istream_迭代器(std::ifstream(“OHenry.txt”)),istream_迭代器(),back_插入器(DataArray));
std::矢量queryaray;
std::copy(std::istream_iterator(std::ifstream(“querys.txt”))、istream_iterator()、back_inserter(QueryArray));

cout可以让哈希表本身报告它所看到的并发数,而不暴露其内部实现

对于使用探测(任何类型)的哈希表,colission的数量等于位于与其哈希代码不一致的索引处的元素数量(这是因为它们通常存储的位置已被占用)

对于使用链接的哈希表,colission的数量等于哈希表中的项数减去占用的bucket数(换句话说,计算每个bucket中除第一个之外的所有插入项)。这也是非常直观的


因此,我将以您的方式为每个哈希表提供一个
count\u colissions()
方法,该方法计算O(n)中的colissions数时间使用相应的方法并返回它。

非常感谢!我刚刚将插入函数设置为布尔函数,然后使用了计数器。你认为这会很好吗?@user977154:这会很好。但为什么会破坏“纯度”当您可以在哈希表的一个方法中隐藏所有内容时,在循环中写入代码?bool HashTable_qp::insert(const string&x){//insert x as active int currentPos=findPos(x);if(isActive(currentPos))返回false;array[currentPos]=HashEntry(x,active);//Rehash;参见第5.5节if(++currentSize>array.size()/2)rehash();return true;}@user977154:尝试实现我的建议,无论如何,请将您的代码作为问题(或另一个问题)的编辑而不是注释发布。很难理解它。