Показать сообщение отдельно
  #1  
Старый 30.12.2009, 11:20
Аватар для Aidar
Aidar Aidar вне форума
Прохожий
 
Регистрация: 30.12.2008
Сообщения: 7
Репутация: 10
По умолчанию Хеш - Функции

Помогите пожалуйста исправить прогу.
Задание:
Реализовать метод внутреннего хеширования. Исходные ключи – любые слова (например – фамилии). Размер хеш-таблицы должен задаваться в программе с помощью константы m. В случае возникновения конфликта при попытке размещения в таблице нового ключа, для него ищется первое свободное по порядку место по формуле
j = (( h (ключ) + i ) mod m ) + 1, где i = 0, 1, 2, . . . , m-2
Программа должна выполнять следующие действия:
• добавление нового ключа в таблицу с подсчетом сделанных при этом сравнений
• поиск заданного ключа в таблице с подсчетом сделанных при этом сравнений
• вывод текущего состояния таблицы на экран


Ошибка состоит в том, что при добавлении ключей (например добавляем var, avr, arv и avr) программа выводит одинаковые ключи. По сути при вводе одинаковых ключей должен выводить сообщение "Kluch uge dobavlalsa!!.".

Фрагмент программы:

Код:
function AddToHAsh(str : String; var arr : array of String) : Integer;
var hsh, cmp, r, i, m, j : Integer;
    Free : Boolean;
begin
  hsh := Hash(str);
  Cmp := 0;
  j := 0;
  R := 1;
  Inc(Cmp);
  Free := False;
  If (arr[hsh] = str)
  then
    begin
    writeln('Kluch uge dobavlalsa!!.');
    end
  else
    begin
    if (Arr[hsh] = '')
    then
      begin
      arr[hsh] := str;
      end
    else
      begin
      for i := 1 to (m - 1) do
        begin
        Inc(Cmp);
        j := (hsh + i) mod m;
        if (Arr[j] = '')
        then
          begin
          Arr[j] := str;
          Break;
          end;
        end;
      end;
    end;
  writeln('Comparies: ',  Cmp);
  Result := R;
end;
Admin: Не забываем про теги!
Ответить с цитированием