Добавил:
Hist
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Программы c++ (сортировка, хэширование) / 3 / old1 / lab_3.3
.2.cpp#include <iostream>
#include <string.h>
#define N 20 //количество строк
#define MaxStrLen 10 //максимальная длина строки
using namespace std;
char st[N][MaxStrLen],ht[N],ArrOfSin[N];
int j,k;
void init_str(void)
{
strcpy(st[0],"zero");
strcpy(st[1],"one");
strcpy(st[2],"two");
strcpy(st[3],"three");
strcpy(st[4],"four");
strcpy(st[5],"five");
strcpy(st[6],"six");
strcpy(st[7],"seven");
strcpy(st[8],"eight");
strcpy(st[9],"nine");
strcpy(st[10],"ten");
strcpy(st[11],"eleven");
strcpy(st[12],"twelve");
strcpy(st[13],"thirteen");
strcpy(st[14],"fourteen");
strcpy(st[15],"fifteen");
strcpy(st[16],"sixteen");
strcpy(st[17],"seventeen");
strcpy(st[18],"eighteen");
strcpy(st[19],"nineteen");
strcpy(st[4],"");
}
/*void init_str(void)
{
for (j=0; j<N; j++)
{
strcpy(st[j],"");
}
strcpy(st[2],"000");
}*/
int hash_calc_sv2(char x[],const int size)
{
int StringLength,HashKey,i,tmp;
StringLength=strlen(x); //Начало вычисления ключа
HashKey=0;
if (StringLength%2==0) //Чётный случай
{
for (i=0; i<StringLength; i=i+2)
{
tmp=x[i];
tmp=tmp*1000;
tmp=tmp+x[i+1];
HashKey=HashKey+tmp;
}
}
if (StringLength%2!=0) //Нечётный случай
{
for (i=1; i<StringLength; i=i+2)
{
tmp=x[i];
tmp=tmp*1000;
tmp=tmp+x[i+1];
HashKey=HashKey+tmp;
}
HashKey=HashKey+x[0];
} //конец вычисления ключа
//cout<<HashKey<<"\n";
return (HashKey);
}
int hash_calc(char x[],const int size)
{
int StringLength,HashKey,i;
StringLength=strlen(x); //Начало вычисления ключа
HashKey=0;
for (i=0; i<=StringLength; i++)
{
HashKey=HashKey+x[i];
}
return (HashKey);
}
void init_hash_table(void)
{
int keyd[N];
for (j=0; j<N; j++) //Инициализация массивов
{
ht[j]=-1;
ArrOfSin[j]=-1;
}
k=0;
for (j=0; j<N; j++) //Заполнение хэш таблицы
{
keyd[j]=hash_calc_sv2(st[j],strlen(st[j]))%N; //(свёртка 2) mod (количество строк)
if (ht[keyd[j]]==-1)
{
ht[keyd[j]]=j;
//cout<<st[j]<<" "<<ht[keyd[j]]<<" "<<keyd[j]<<"(1)"<<endl;
}
else
{
keyd[j]=hash_calc(st[j],strlen(st[j]))%19; //Простое число
if (ht[keyd[j]]==-1)
{
ht[keyd[j]]=j;
//cout<<st[j]<<" "<<ht[keyd[j]]<<" "<<keyd[j]<<"(2)"<<endl;
}
else
{
ArrOfSin[k]=j;
//cout<<st[j]<<" "<<ht[keyd[j]]<<" "<<ArrOfSin[k]<<"(3)"<<endl;
k++;
}
}
}//Хэш таблица заполнена
}
int search_result(char InputString[])
{
bool str_chk;
int key,i;
str_chk=false;
//cout<<InputString<<endl;
key=hash_calc_sv2(InputString,strlen(InputString))%N; //(свёртка 2) mod (количество строк)
if (strcmp(InputString,st[ht[key]])==0)
{
//cout<<"found (1)"<<endl;
str_chk=true;
return (1);
}
else
{
key=hash_calc(InputString,strlen(InputString))%19; //Простое число
if (strcmp(InputString,st[ht[key]])==0)
{
//cout<<"found (2) "<<endl;
str_chk=true;
return (2);
}
else //линейный поиск
{
i=0;
do
{
if (strcmp(InputString,st[ArrOfSin[i]])==0)
{
str_chk=true;
break;
}
i++;
} while (i<k);
if (str_chk==true)
{
//cout<<"found ("<<i+3<<")"<<endl;
return (i+3);
}
//else {cout<<"not found"<<endl;}
}
}
if (str_chk==false) {return (-1);}
}
int main(void)
{
char InputStr[MaxStrLen];
init_str();
init_hash_table();
cin>>InputStr;
//strcpy(InputStr,st[3]);
if (search_result(InputStr)>0) {cout<<"found("<<search_result(InputStr)<<")"<<endl;}
else {cout<<"not found"<<endl;}
//for (j=0; j<N; j++) {cout<<st[j]<<endl;}
return(0);
}
Соседние файлы в папке old1