
- •Введение
- •Глава I теоретический раздел
- •1.Актуальность
- •2.Общие основы
- •Глава II проектный раздел
- •3.2.1 Принцип построения хеш – функций
- •4.2.2 Применение хеширования
- •Глава III программная реализация
- •5.3.1 Организация структуры данных
- •6. 3.2 Реализация функций структуры
- •Глава IV экспериментальный раздел
- •7. 4.1 Руководство пользователя
- •Заключение
- •Список литературы
4.2.2 Применение хеширования
До сих пор рассматривались способы поиска в таблице по ключам, позволяющим однозначно идентифицировать запись. Такие ключи называются первичными ключами. Возможен вариант организации таблицы, при котором отдельный ключ не позволяет однозначно идентифицировать запись. Такая ситуация часто встречается в базах данных. Идентификация записи осуществляется по некоторой совокупности ключей. Ключи, не позволяющие однозначно идентифицировать запись в таблице, называются вторичными ключами.
Даже при наличии первичного ключа, для поиска записи могут быть использованы вторичные. Например, поисковые системы internet часто организованы как наборы записей, соответствующих Web-страницам. В качестве вторичных ключей для поиска выступают ключевые слова, а сама задача поиска сводится к выборке из таблицы некоторого множества записей, содержащих требуемые вторичные ключи.
Глава III программная реализация
5.3.1 Организация структуры данных
Все данные организованы в структуре представляющей собой дерево:
class BH_Tree
{
private :
BH *Head;
public :
BH_Tree();
~BH_Tree();
char *Key_Gen(String *data, int coll);
void insert(String *data,int coll);
int Past(BH *root, String *data,int coll,int pos);
void paintTree( TImage *img, int x, int y,int _x=0, int _y=0);
void paintRoot( TImage *img,BH *root,int x, int y,int
n=1,int m=1,int _x=0, int _y=0);
char * binkey (int num);
};
Каждый элемент – узел дерева является структурой:
struct BH
{
String *BH_data;
int collData;
BH *Left;
BH *Right;
BH();
};
6. 3.2 Реализация функций структуры
При внесении данных в структуру, первоначально генерируется «pseudokey», после чего алгоритм проверяет, существует ли первый элемент дерева. Если данные до этого не вводились, то выделяется память под один узел дерева и текущее значение помещается в данный узел. Если же в структуре уже имеются элементы, то данные добавляются в ближайший свободный элемент, путь к которому соответствует «pseudokey».
Функция, реализующая добавление элемента:
int Past(BH *root, String *data,int coll,int pos)
{
char *p=Key_Gen(data,coll);
if(root==NULL)
{root=new (BH);
Past(root,data,coll,pos);
return 1;
}
else
{
if(root->BH_data==NULL
&& root->Left==NULL
&& root->Right==NULL)
{root->BH_data=data;
root->collData=coll;
return 1;
}
else
{if(root->BH_data==NULL)
{
if(p[pos]=='0')
{
if(root->Right==NULL)
{
BH *tmp = new BH;
root->Right=tmp;
root->Right->BH_data=data;
root->Right->collData=coll;
return 1;
}
else
{
Past(root->Right,data,coll,++pos);
return 1;
}
}
if(p[pos]=='1')
{
if(root->Left==NULL)
{
BH *tmp =new BH;
root->Left=tmp;
root->Left->BH_data=data;
root->Left->collData=coll;
return 1;
}
else
{
Past(root->Left,data,coll,++pos);
return 1;
}
}
}
if(root->BH_data!=NULL)
{
if(*root->BH_data==*data)return 1;
if(p[pos]=='0')
{
BH * tmp =new BH;
root->Right=tmp;
root->Right->BH_data=data;
root->Right->collData=coll;
}
if(p[pos]=='1')
{
BH * tmp =new BH;
root->Left=tmp;
root->Left->BH_data=data;
root->Left->collData=coll;
}
int dd = root->collData;
String *ddd = new String;
*ddd=*root->BH_data;
delete(root->BH_data);
root->BH_data=NULL;
root->collData=0;
Past(root,ddd,dd,pos);
return 1;
}
}
}
}
При внесении данных автоматически выполняется функция прорисовки дерева:
void paintTree( TImage *img, int x, int y,int _x=0, int _y=0)
{
img->Canvas->Rectangle(0,0,img->Width,img->Height);
img->Canvas->Brush->Color=clWhite;
img->Canvas->FloodFill(0,0,clWhite,fsBorder);
img->Canvas->CleanupInstance(); paintRoot(img,Head, x, y,100,20,_x,_y)
;}
Данная функция вызывает функцию рисования узла дерева и затем посредством рекурсивных вызовов прорисовывают всё дерево:
void paintRoot( TImage *img,BH *root,int x, int y,int n=1,int m=1,int _x=0, int _y=0)
{
n-=25;
m+=10;
if(_x>=x & _x<=x+20 & _y>=y & _y<=y+20 )
{
img->Canvas->Brush->Color=clWhite;
img->Canvas->Font->Size=24;
if(root!=NULL) if(root->BH_data!=NULL) img->Canvas->TextOutA(10,10,(*root->BH_data));
}
if(root==NULL)
{
img->Canvas->Brush->Color=clRed;
img->Canvas->Ellipse(x,y,(x+10),(y+10));
}
else
{
if(root!=NULL && root->BH_data==NULL)
{
img->Canvas->Brush->Color=clBlue;
img->Canvas->Ellipse(x,y,(x+10),(y+10));
img->Canvas->MoveTo(x+5,y+5);
img->Canvas->LineTo(x-5-n,y+15+m);
paintRoot(img,root->Left,x-10-n,y+10+m,n,m,_x,_y);
img->Canvas->MoveTo(x+5,y+5);
img->Canvas->LineTo(x+15+n,y+15+m);
paintRoot(img,root->Right,x+10+n,y+10+m,n,m,_x,_y); }
else {
img->Canvas->Brush->Color=clGreen;
img->Canvas->Ellipse(x,y,x+10,y+10);
img->Canvas->MoveTo(x+5,y+5);
img->Canvas->LineTo(x-5-n,y+15+m);
paintRoot(img,root->Left,x-10-n,y+10+m,n,m,_x,_y);
img->Canvas->MoveTo(x+5,y+5);
img->Canvas->LineTo(x+15+n,y+15+m);
paintRoot(img,root->Right,x+10+n,y+10+m,n,m,_x,_y);
}
}
}