Скачиваний:
33
Добавлен:
10.05.2014
Размер:
3.63 Кб
Скачать
#include <iostream>
#include <string.h>
#define N 20 //количество строк
#define MaxStrLen 10 //максимальная длина строки

using namespace std;

//char StringMass(int i)

int hash_calc_sv2(char x[],const int size)
{
	int StringLength,HashKey,i,tmp;
	StringLength=strlen(x); //Начало вычисления ключа
	HashKey=0;
	if (StringLength%2==0) //Чётный случай
	{
		//cout<<"Ч ";
		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) //Нечётный случай
	{
		//cout<<"Н ";
		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);
}


int main(void)
{
	char st[N][MaxStrLen],InputString[MaxStrLen];
	int j,k,key,keyd[N],ht[N],ArrOfSin[N];
	bool str_chk;
	
	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");
    
    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++;
			}
		}
	}//Хэш таблица заполнена
	
	//поиск
	//cin>>InputString;
	strcpy(InputString,"nineteen");
	str_chk=false;
	//cout<<InputString<<endl;
	//cout<<strcmp(InputString,"fourteen")<<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;
	}
	else
	{
		key=hash_calc(InputString,strlen(InputString))%19; //Простое число
		if (strcmp(InputString,st[ht[key]])==0)
		{
			cout<<"found (2) "<<endl;
			str_chk=true;
		}
		else //линейный поиск
		{
			j=0;
			do
			{
				//cout<<j<<" "<<ArrOfSin[j]<<" "<<st[ArrOfSin[j]]<<endl;
				if (strcmp(InputString,st[ArrOfSin[j]])==0)
				{
					str_chk=true;
					break;
				}
				j++;
			} while (j<k);
			if (str_chk==true) {cout<<"found ("<<j+3<<")"<<endl;}
			else {cout<<"not found"<<endl;}
		}
	}
	
	return(0);
}
Соседние файлы в папке old1