Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
курсовая динамическое хеширование.doc
Скачиваний:
1
Добавлен:
23.09.2019
Размер:
174.08 Кб
Скачать

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);

}

}

}