如何计算哈希表中碰撞的次数?
How can i count the number of collisions in a hash table?
我的插入函数已经正确地处理了碰撞,但我希望能够在每种不同的哈希方式(链,线性探测和二次探测)中计算碰撞的数量。我该怎么做呢?
这是我目前为止的代码:
#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;
可以让哈希表本身报告它所看到的冲突数量,而根本不暴露其内部实现。
对于使用探测(任何类型)的哈希表,冲突的次数等于位于与其哈希码不一致的索引处的元素的数量(这是因为通常存储它们的位置已被占用)。
对于使用链的哈希表,冲突的次数等于哈希表中的项数减去已占用的桶数(换句话说,计算每个桶中除第一个之外的所有插入项)。这也是非常直观的。
所以我在你的情况下要做的是给每个哈希表一个count_colissions()
方法,使用相应的方法计算O(n)时间内的碰撞次数并返回它
相关文章:
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 用C++将哈希表写入文件并从文件中恢复
- C++中的并发哈希表
- 在具有开放寻址的哈希表中插入节点 [优化逻辑]
- 与C++哈希表的基础知识混淆
- 调整大小和复制哈希表数组中的元素
- 带链接的基本哈希表
- C++哈希表中,两个相同的实现,但一个给出错误
- 如果索引不是整数,我们如何在 C++ 中插入哈希表
- 查找项目在哈希表中的位置
- 为什么C++ STL 哈希表 (unordered_map) 不接受向量作为键
- C++哈希表 - 如何解决自定义数据类型作为键的unordered_map冲突?
- 使用哈希表设置实现
- 同时写入和读取哈希表
- 在 C++ 中为特定哈希表创建插入函数
- 我可以比朴素哈希表更快地将随机字符串映射到两个类吗?
- 哈希表:船舶记录
- 使用rehash的C++哈希表问题
- 如何计算哈希表中碰撞的次数?