Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.06.2011, 17:27   #1
Sofiko
Новичок
Джуниор
 
Регистрация: 23.06.2011
Сообщений: 2
По умолчанию Delphi (Хеширование)

Всем добрый вечер! Хочу обратиться к вам за помощью)
Имеется программа..её нужно переделать по следующие требования :

Варианты задания
1. Тип ключа:
а) целый;

2. Метод хеширования:

в) деление многочленов
k записывается в двоичной системе: k=2nbn+…+2b1+b0
и в форме многочлена: k(t)=tnbn+…+tb1+b0, M=2m;
остаток от деления его на постоянный многочлен
c(t)=tmcm+ tm-1cm-1 …+tc1+c0,
записанный в двоичной системе – h(k).
3. Разрешение коллизий:

б) метод внутренних цепочек;

Вот собственно программа , которую нужно переделать :

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids;

type
  TForm1 = class(TForm)
    SGTable: TStringGrid;
    Button1: TButton;
    Button2: TButton;
    Edit1: TEdit;
    Label1: TLabel;

    Procedure Add_Key(S : String);

    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
{
Задание 3. Хеширование

Порядок выполнения задания и требования к нему
1.	Разработать алгоритм преобразования ключа, если это необходимо.
2.	Разработать алгоритм, соответствующий хеш-функции.
3.	Разработать алгоритм разрешения коллизий.
4.	Разработать и отладить программу на Delphi, реализующую алгоритмы пп. 1-3.
5.	Интерфейс программы должен включать хеш-таблицу, поле для ввода ключа,
    счетчик коллизий, необходимые управляющие элементы и пояснения.
6.	В программе необходимо реализовать как процедуру записи ключа
    в таблицу, так и процедуру его поиска. Процедуру удаления ключа
    реализовывать не обязательно.
7.	Текст программы должен содержать количество комментариев,
    необходимое для понимания того, что автор выполнил именно то
    задание, которое ему указано.

Варианты задания
1.	Тип ключа:
    б)	строковый.
2.	Метод хеширования:
    а)	метод деления: 		h(k) = K mod M,		M - простое
3.	Разрешение коллизий:
    г)	квадратичное опробование: 	hi(k)=h0(k)+ci+di2, c, d - константы;
}


const m=19; //  РАЗМЕР ХЭШ ТАБЛИЦЫ
const c=7;  //  КОНТСАНТА, ИСПОЛЬЗУЕМАЯ ПРИ РАЗРЕШЕНИЕ КОЛИЗИЙ
const d=9;  //  КОНСТАНТА, ИСПОЛЬЗУЕМАЯ ПРИ РАЗРЕШЕНИЕ КОЛИЗИЙ

var
         Key : array[0..m] of Integer; //  ХЭШ ТАБЛИЦА
  ColizCount : Integer; // КОЛ-ВО КОЛИЗИЙ

// ПРЕДСТАВЛЕНИЕ СТРОКИ ВВИДЕ ОДНОГО ЧИСЛА (ЦЕЛОЕ)
Function StrInInt(s: string): Integer;
var
         i : integer; //
         n : integer; //
         Return : Integer; //
begin
     Return:=0;  //
     for i:=1 to Length(s) do
                Return:=Return*2+Ord(s[i]);

                StrinInt:=Return;
end;

// ХЭШ ФУНКЦИЯ
Function Hash(k : integer): Integer;
Begin
     k:=k mod m+1;

          Hash:=k;
end;

// ОТЛАДКА КОЛИЗИЙ
Function Col_solution(k : Integer): Integer;
var
     i : integer; // СЧЕТЧИК КОЛИЗИЙ
    k0 : integer; // СТАРТОВОЕ ЗНАЧЕНИЕ ХЭШ ФУНКЦИИ
begin
   i:=1;
   k0:=k;
    Repeat
        i:=i+1;
        k:=(Hash(k)+c*i+d*i*i) mod (m+1);
    //ПОКА НЕ НАШЛИ СВОБОДНУЮ СТРОКУ ИЛИ ЗНАЧЕНИЕ к НЕ РАВНО СТАРТОВОМУ ЗНАЧЕНИЮ,
    // ЧТО ОЗНАЧАЕТ ТАБЛИЦА ПЕРЕПОЛНЕНА
    until (Key[k]=0) or (K0=k);
if k0=k then k:=-1;
ColizCount:=i; // ИТОГОВОЕ КОЛИЧЕСТВО КОЛИЗИЙ

        Col_Solution:=k;
end;

//  ДОБАВИТЬ КЛЮЧ В ТАБЛИЦУ
Procedure TForm1.Add_Key(S : String);
var
    i : Integer;   //
    k : integer;  //
Begin

          k:=Hash(0);
          if key[k]<>0 then  k:=Col_solution(Hash(k));
          if k=-1 then showMessage('Таблица переполнина')
          else
             Begin
               key[k]:=StrInInt(s);
               SgTable.Cells[1,k]:=s+' - '+IntToStr(StrInInt(Edit1.Text));;
               SgTable.Cells[2,k]:=IntToStr(k);
               SgTable.Cells[3,k]:=IntToStr(ColizCount);
             End;
End;

procedure TForm1.Button2Click(Sender: TObject);
begin
close;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Add_Key(Edit1.Text);
end;

procedure TForm1.FormCreate(Sender: TObject);
var i : integer; //
begin
SGTable.RowCount:=m+1;
sgTable.ColCount:=4;
SgTable.Cells[0,0]:='Номер Строки';
SgTable.Cells[1,0]:='Ключ';
SgTable.Cells[2,0]:='Хэш значение';
SgTable.Cells[3,0]:='Кол-во колизий';

for i:=0 to m do
     begin
        sgtable.Cells[0,i+1]:=IntToStr(i+1);
        key[i]:=0;
     end;
end;

end.

Последний раз редактировалось Sofiko; 23.06.2011 в 17:38.
Sofiko вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
хеширование rowlin Общие вопросы C/C++ 1 07.05.2011 07:20
Хеширование: Necare Помощь студентам 5 21.03.2011 19:46
Delphi. Хеширование. PianeR Фриланс 2 04.02.2011 00:09
Хеширование RunForest Общие вопросы .NET 4 10.08.2009 15:21