<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=41759&amp;view=findpost&amp;p=553825</guid>
        <pubDate>Thu, 23 Dec 2004 22:35:58 +0000</pubDate>
        <title>Хеш-таблица</title>
        <link>https://forum.sources.ru/index.php?showtopic=41759&amp;view=findpost&amp;p=553825</link>
        <description><![CDATA[Суть Зла: Хэш на Pascal.<br>Реализация - готовая лаба, в ней, на мой скромный взгляд, проще разбираться..]]></description>
        <author>Суть Зла</author>
        <category>Pascal: Математика</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=41759&amp;view=findpost&amp;p=321340</guid>
        <pubDate>Sun, 21 Mar 2004 08:05:44 +0000</pubDate>
        <title>Хеш-таблица</title>
        <link>https://forum.sources.ru/index.php?showtopic=41759&amp;view=findpost&amp;p=321340</link>
        <description><![CDATA[tserega: Продолжаю эту интересную тему.<br>
Итак, существует громадное количество hash-функций. Для чисел это может быть сумма цифр, а для строк - сумма кодов символов, умноженных на их позицию в строке (например, для строки &#39;Вася&#39; hash-функция будет выглядеть так: Ord(&#39;В&#39;) * 1 + Ord(&#39;а&#39;) * 2 + Ord(&#39;с&#39;) * 3 + Ord(&#39;я&#39;) * 4).<br>
Вот модуль, в котором реализованы простейшие операции хеширования. Идея такая: создается несколько независимых групп (точнее, списков), в которые будут добавляться элементы. Hash-функция будет определять, в какой список следует добавлять элемент.<br>
Реализовано все через ООП. <strong class='tag-b'>Замечание</strong>: класс THash надо наследовать&#33; В нем описана абстрактная функция HashFunction, которую надо &quot;перекрыть&quot;.<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">{</div><div class="code_line">&nbsp;Hash operations for Borland Pascal 7.0</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">Unit Hash;</div><div class="code_line">&nbsp;</div><div class="code_line">Interface</div><div class="code_line">&nbsp;</div><div class="code_line">Const HashGroups = 1000;</div><div class="code_line">&nbsp;</div><div class="code_line">Type</div><div class="code_line">&nbsp;&nbsp; &nbsp; HashElement = Integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp; HashKey = String;</div><div class="code_line">&nbsp;&nbsp; &nbsp; PList = ^TList;</div><div class="code_line">&nbsp;&nbsp; &nbsp; TList = Record</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Key: HashKey;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Value: HashElement;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Removed: Boolean;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Next: PList;</div><div class="code_line">&nbsp;&nbsp; &nbsp; End;</div><div class="code_line">&nbsp;&nbsp; &nbsp; THash = Object</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Data: Array[1..HashGroups] Of PList;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; Public</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Constructor Init;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Function HashFunction(Key:HashKey):Longint; Virtual;{Must be overrided}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Procedure AddValue(Key:HashKey;Value:HashElement);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Function FindValue(Key:HashKey;Var Found:Boolean):HashElement;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Procedure DeleteValue(Key:HashKey);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Destructor Done; Virtual;</div><div class="code_line">&nbsp;&nbsp; &nbsp; Private</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Procedure AddToList(P:PList;Key:HashKey;Value:HashElement);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Procedure DeleteGroup(P:PList);</div><div class="code_line">&nbsp;&nbsp; &nbsp; End;</div><div class="code_line">&nbsp;</div><div class="code_line">Implementation</div><div class="code_line">&nbsp;</div><div class="code_line">Uses Objects;</div><div class="code_line">&nbsp;</div><div class="code_line">Constructor THash.Init;</div><div class="code_line">Var I:Integer;</div><div class="code_line">Begin</div><div class="code_line">&nbsp;For I:=1 To HashGroups Do</div><div class="code_line">&nbsp;&nbsp;Data[I]:=Nil;</div><div class="code_line">End;</div><div class="code_line">&nbsp;</div><div class="code_line">Destructor THash.Done;</div><div class="code_line">Var I:Integer;</div><div class="code_line">Begin</div><div class="code_line">&nbsp;For I:=1 To HashGroups Do</div><div class="code_line">&nbsp;&nbsp;DeleteGroup(Data[I]);</div><div class="code_line">End;</div><div class="code_line">&nbsp;</div><div class="code_line">Function THash.HashFunction(Key:HashKey):Longint;</div><div class="code_line">Begin</div><div class="code_line">&nbsp;Abstract;</div><div class="code_line">End;</div><div class="code_line">&nbsp;</div><div class="code_line">Procedure THash.AddValue(Key:HashKey;Value:HashElement);</div><div class="code_line">Var B:Boolean;</div><div class="code_line">Begin</div><div class="code_line">&nbsp;FindValue(Key,B);</div><div class="code_line">&nbsp;If B Then Exit;</div><div class="code_line">&nbsp;AddToList(Data[HashFunction(Key)],Key,Value);</div><div class="code_line">End;</div><div class="code_line">&nbsp;</div><div class="code_line">Procedure THash.AddToList(P:PList;Key:HashKey;Value:HashElement);</div><div class="code_line">Var N,O:PList;</div><div class="code_line">Begin</div><div class="code_line">&nbsp;While O &#60;&#62; Nil Do</div><div class="code_line">&nbsp;&nbsp;Begin</div><div class="code_line">&nbsp;&nbsp; If (O^.Key = Key) And (O^.Removed) Then</div><div class="code_line">&nbsp;&nbsp; &nbsp;Begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; O^.Removed:=False;</div><div class="code_line">&nbsp;&nbsp; &nbsp; O^.Value:=Value;</div><div class="code_line">&nbsp;&nbsp; &nbsp; Exit;</div><div class="code_line">&nbsp;&nbsp; &nbsp;End;</div><div class="code_line">&nbsp;&nbsp; O:=O^.Next;</div><div class="code_line">&nbsp;&nbsp;End;</div><div class="code_line">&nbsp;New(N);</div><div class="code_line">&nbsp;N^.Key:=Key;</div><div class="code_line">&nbsp;N^.Value:=Value;</div><div class="code_line">&nbsp;N^.Next:=P;</div><div class="code_line">&nbsp;N^.Removed:=False;</div><div class="code_line">&nbsp;Data[HashFunction(Key)]:=N;</div><div class="code_line">End;</div><div class="code_line">&nbsp;</div><div class="code_line">Procedure THash.DeleteGroup(P:PList);</div><div class="code_line">Begin</div><div class="code_line">&nbsp;If P = Nil Then Exit;</div><div class="code_line">&nbsp;If P^.Next = Nil Then</div><div class="code_line">&nbsp;&nbsp;Dispose(P)</div><div class="code_line">&nbsp;Else</div><div class="code_line">&nbsp;&nbsp;DeleteGroup(P^.Next);</div><div class="code_line">End;</div><div class="code_line">&nbsp;</div><div class="code_line">Function THash.FindValue(Key:HashKey;Var Found:Boolean):HashElement;</div><div class="code_line">Var Func: Longint;</div><div class="code_line">&nbsp;&nbsp; &nbsp;P:PList;</div><div class="code_line">Begin</div><div class="code_line">&nbsp;Func:=HashFunction(Key);</div><div class="code_line">&nbsp;P:=Data[Func];</div><div class="code_line">&nbsp;While P &#60;&#62; Nil Do</div><div class="code_line">&nbsp;&nbsp;Begin</div><div class="code_line">&nbsp;&nbsp; If (Key = P^.Key) And (Not P^.Removed) Then</div><div class="code_line">&nbsp;&nbsp; &nbsp;Begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; Found:=True;</div><div class="code_line">&nbsp;&nbsp; &nbsp; FindValue:=P^.Value;</div><div class="code_line">&nbsp;&nbsp; &nbsp; Exit;</div><div class="code_line">&nbsp;&nbsp; &nbsp;End;</div><div class="code_line">&nbsp;&nbsp; P:=P^.Next;</div><div class="code_line">&nbsp;&nbsp;End;</div><div class="code_line">&nbsp;Found:=False;</div><div class="code_line">End;</div><div class="code_line">&nbsp;</div><div class="code_line">Procedure THash.DeleteValue(Key:HashKey);</div><div class="code_line">Var P,O:PList;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Func:Longint;</div><div class="code_line">Begin</div><div class="code_line">&nbsp;Func:=HashFunction(Key);</div><div class="code_line">&nbsp;P:=Data[Func];</div><div class="code_line">&nbsp;While P &#60;&#62; Nil Do</div><div class="code_line">&nbsp;&nbsp;Begin</div><div class="code_line">&nbsp;&nbsp; If Key = P^.Key Then</div><div class="code_line">&nbsp;&nbsp; &nbsp;P^.Removed:=True;</div><div class="code_line">&nbsp;&nbsp; P:=P^.Next;</div><div class="code_line">&nbsp;&nbsp;End;</div><div class="code_line">End;</div><div class="code_line">&nbsp;</div><div class="code_line">End.</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
Вот пример использования модуля (создается объект, перекрывается метод HashFunction):<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Uses Hash;</div><div class="code_line">&nbsp;</div><div class="code_line">Type TMyHash = Object(THash)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Function HashFunction(Key:HashKey):Longint; Virtual;</div><div class="code_line">&nbsp;&nbsp; &nbsp; End;</div><div class="code_line">&nbsp;</div><div class="code_line">Function TMyHash.HashFunction(Key:HashKey):Longint;</div><div class="code_line">Var I:Integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Sum:Integer;</div><div class="code_line">Begin</div><div class="code_line">&nbsp;Sum:=0;</div><div class="code_line">&nbsp;For I:=1 To Length(Key) Do</div><div class="code_line">&nbsp;&nbsp;Sum:=Sum + (Ord(Key[I]) * I);</div><div class="code_line">&nbsp;HashFunction:=(Sum Mod HashGroups) + 1;</div><div class="code_line">End;</div><div class="code_line">&nbsp;</div><div class="code_line">Var H:TMyHash;</div><div class="code_line">&nbsp;&nbsp; &nbsp;B:Boolean;</div><div class="code_line">&nbsp;&nbsp; &nbsp;V:HashElement;</div><div class="code_line">Begin</div><div class="code_line">&nbsp;Writeln(&#39;----&#39;);</div><div class="code_line">&nbsp;Writeln(MemAvail);</div><div class="code_line">&nbsp;H.Init;</div><div class="code_line">&nbsp;H.AddValue(&#39;chislo&#39;,5);</div><div class="code_line">&nbsp;H.DeleteValue(&#39;chislo1&#39;);</div><div class="code_line">&nbsp;V:=H.FindValue(&#39;chislo&#39;,B);</div><div class="code_line">&nbsp;If B Then Writeln(V) Else Writeln(&#39;No element&#39;);</div><div class="code_line">&nbsp;H.Done;</div><div class="code_line">&nbsp;Writeln(MemAvail);</div><div class="code_line">End.</div></ol></div></div></div></div>]]></description>
        <author>tserega</author>
        <category>Pascal: Математика</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=41759&amp;view=findpost&amp;p=272149</guid>
        <pubDate>Sun, 28 Dec 2003 19:50:14 +0000</pubDate>
        <title>Хеш-таблица</title>
        <link>https://forum.sources.ru/index.php?showtopic=41759&amp;view=findpost&amp;p=272149</link>
        <description><![CDATA[Krishkinn: Допустим у нас есть некоторый словарь:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">aaasdf</div><div class="code_line">dfgbv</div><div class="code_line">sdfdsf</div><div class="code_line">ghghhj</div><div class="code_line">sdfgf</div><div class="code_line">asdser</div></ol></div></div></div></div><br>
<br>
Нам необходимо проверить входит ли слово: asdser в этот словарь.<br>
<br>
Способ №1.<br>
<br>
Просматриваем ВЕСЬ словарь и сравниваем это слово со всеми словами. <br>
На все это у нас уйдет 6 проверок.<br>
<br>
Способ №2.<br>
<br>
Будем хранить эти слова в специальной таблице (хеш-таблице).<br>
<br>
Каждому столбику сопоставим букву. <br>
И получим следующую таблицу (некоторые буквы опущены):<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">a &nbsp; &nbsp; &nbsp; &nbsp; … &nbsp; &nbsp; &nbsp; d &nbsp; &nbsp; &nbsp; &nbsp; … &nbsp; &nbsp; &nbsp; &nbsp;g &nbsp; &nbsp; &nbsp; &nbsp; … &nbsp; &nbsp; &nbsp; s</div><div class="code_line">aaasdf &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dfgbv &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ghghhj &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;sdfdsf</div><div class="code_line">asdser &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sdfgf</div></ol></div></div></div></div><br>
<br>
<br>
Нетрудно заметить, что в столбце ‘a’ мы храним все слова начинающиеся с буквы ‘a’ и т.д.<br>
И теперь для того, чтобы найти слово asdser нам необходимо просмотреть столбик ‘a’ , а это уже 2 сравнения.<br>
<br>
P.S.<br>
В данном примере мы использовали хеширование по первой букве, <br>
но есть уйма других способов хеширования, <br>
например по контрольной сумме. <br>
Но это уже другая тема.]]></description>
        <author>Krishkinn</author>
        <category>Pascal: Математика</category>
      </item>
	
      </channel>
      </rss>
	