私の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;
ありがとうございました!私はちょうど挿入関数をboolにして、カウンタを使用しました。あなたはそれが良いと思いますか? – user977154
@ user977154:うまく動作します。しかし、なぜインサートメソッドの "純度"を損なうと、ハッシュテーブルのメソッドのすべてを隠すことができるループのコードを記述する? – Jon
bool HashTable_qp :: insert(const string&x) { \t // xをアクティブとして挿入します。 \t int currentPos = findPos(x); \t if(isActive(currentPos)) \t \t falseを返します。 \t配列[currentPos] =ハッシュエントリ(x、アクティブ); \t // Rehash;セクション5.5を参照してください。 \t if(++ currentSize> array.size()/ 2) \t \t rehash(); \tがtrueを返します。 } – user977154