📄 merghash.h
字号:
// MergHash.h: interface for the CMergHash class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_MERGHASH_H__BC287431_DFA6_41EB_A1E5_458B62924038__INCLUDED_)
#define AFX_MERGHASH_H__BC287431_DFA6_41EB_A1E5_458B62924038__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "MergeHashElem.h"
#include <fstream>
#include <iostream>
using std::ios;
using std::cout;
using std::fstream;
using std::endl;
#define Max 100000
class CMergHash
{
public:
CDeque<CMergeHashElem> * Index;
int ELFHash( const char * key ){
unsigned long h = 0;
while( * key ){
h = ( h << 4 ) + *key++;
unsigned long g = h & 0xF0000000L;
if(g) h^=g>>24;
h &= ~g;
}
return h%Max;
}
void insert( const CMergeHashElem & elem ){
int num = ELFHash( elem.key.c_str() );
for( int i = 0 ;i < Index[num].size(); i++ )
{
if( Index[num].at(i).key.compare( elem.key ) == 0 )
{
Index[num].at(i).pos.push_back( elem.pos.at(0));
Index[num].at(i).name.push_back( elem.name.at(0));
return;
}
}
Index[num].push_back( elem );
}
void visit( CDeque<CMergeHashElem> & Deque, fstream & out ){
for( int i = 0; i < Deque.size(); i++ )//对每一个关键码进行操作
{
int flag = 0;//标记是不是第一次
int sum = 0;//记录索引的个数
for( int k = 0; k < Deque.at(i).pos.size(); k++ )
{//统计在所有倒排文件中关键码对应的索引的个数
//if( Deque.at(k).pos.size() != Deque.at(k).name.size() )
//cout<<"error";
char temp[100];//name[100];
int num = 0;
//_itoa( k+1, name,10 );
//strcat( name,".txt");
fstream add;
add.open(Deque.at(i).name.at(k).c_str(),ios::in);
//cout<<Deque.at(i).name.at(k).c_str()<<endl;
add.seekg( Deque.at(i).pos.at(k) );//找到关键码在倒排文件中的位置
add >>temp;
add >>num;
sum+=num;//个数累加
add.close();
}
for( int j = 0; j < Deque.at(i).pos.size(); j++ )
{
char temp[100];
long num,pos;
// _itoa( j+1, name,10 );
// strcat( name,".txt");
fstream read;
read.open(Deque.at(i).name.at(j).c_str(),ios::in);
read.seekg( Deque.at(i).pos.at(j) );
read >>temp;//读关键码
if( flag == 0 )//只显示一次
{
out<<endl;
out <<temp<<' ';
out<<sum;//显示个数
}
read >> num;
for( int k = 0 ; k < num; k++ )
{
read >>temp;//读文件名
out <<endl;
out <<temp<<' ';//输出文件名
read >> pos;//读偏移量
out <<pos;//输出偏移量
}
flag = 1;//标记关键码已经输出
read.close();
}
}
}
void VisitAll(fstream & out){
for( int i = 0; i < Max; i++ )
visit( Index[i],out);
}
CMergHash(){ Index = new CDeque<CMergeHashElem>[Max]; }
virtual ~CMergHash(){ delete [] Index; }
};
#endif // !defined(AFX_MERGHASH_H__BC287431_DFA6_41EB_A1E5_458B62924038__INCLUDED_)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -