<?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=428695&amp;view=findpost&amp;p=3871952</guid>
        <pubDate>Tue, 19 Jul 2022 16:20:36 +0000</pubDate>
        <title>Про хеш-таблицы и хеш-функцию для sparse array</title>
        <link>https://forum.sources.ru/index.php?showtopic=428695&amp;view=findpost&amp;p=3871952</link>
        <description><![CDATA[macomics: В приведенной мной ХФ демонстрируется &quot;пример&quot; обращения с такими данными и ничего более. Она даже, скорее всего, не рабочая (набирал от балды в браузере и не проверял). Главное что позволит ХФ - это выстроить данные в удобной для линейного алгоритма форме. Я же выбрал форму бинарного дерева - она не очень удобна для поиска элементов по строкам/столбцам.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=428695&view=findpost&p=3871933'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>FasterHarder &#064; <time class="tag-quote__quoted-time" datetime="2022-07-19T15:33:25+03:00">19.07.22, 12:33</time></span><div class='quote '>Затем надо найти мин. в каждой строке ( как тривиальный пример ). По сути о данных ничего неизвестно, кроме их типа. Сами значения лежат каким-то образом в хеш-таблице. Только известны габариты матрицы. Ничего не остается, как запускать этот двойной цикл с колоссальным кол-вом итераций.</div></div><br>
Цикл может и придется запустить двойной, но количество итераций внутреннего цикла может быть много меньше, чем количество элементов в строке.<br>
Например, если ХФ будет заполнять таблицу по порядку строк (ХТ будет отсортирована по увеличению индекса в строке т.к. старшие 18 бит индекса будут равны индексу строки), тогда достаточно следовать этому правилу и прерывать внутренний цикл, когда встречается 1-ый элемент на следующей строке (с него же и будет продолжать внутренний цикл на следующей итерации внешнего).<br>
Или ХТ будет представлять матрицу упорядоченную по строкам, а строки будут упорядочены по значениям. Тогда поиск минимальных будет сводиться к нахождению первого элемента в нужной строке из ХТ.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=428695&view=findpost&p=3871933'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>FasterHarder &#064; <time class="tag-quote__quoted-time" datetime="2022-07-19T12:33:25+00:00">19.07.22, 12:33</time></span><div class='quote '>Короче, мы ведь не ищем конкретные данные в ХФ ( дробные числа ), а пытаемся узнать, есть ли данные с заданными координатами. Из этого я делаю вывод, что ключом выступают ТОЛЬКО координаты ячейки матрицы.</div></div><br>
Опять же. В приведенном мной примере есть еще один интересный момент. Это откат хеш значения для получения из хеш индекса требуемого значения (это не обязательно должно быть так, но таблица может содержать в себе не только координаты, но и сами значения), тогда не придется хранить матрицу с кучей пустых значений. Что тоже ускорит перечисление и уменьшит количество памяти.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=428695&view=findpost&p=3871933'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>FasterHarder &#064; <time class="tag-quote__quoted-time" datetime="2022-07-19T12:33:25+00:00">19.07.22, 12:33</time></span><div class='quote '>и еще, плиз, не нужен никакой код, тем более на asm-е, ни одной команды из него не знаю</div></div><br>
На asm-е просто микширование float и int выглядит проще. Просто используй не те команды, главное, чтобы числа в длину укладывались.]]></description>
        <author>macomics</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=428695&amp;view=findpost&amp;p=3871933</guid>
        <pubDate>Tue, 19 Jul 2022 12:33:25 +0000</pubDate>
        <title>Про хеш-таблицы и хеш-функцию для sparse array</title>
        <link>https://forum.sources.ru/index.php?showtopic=428695&amp;view=findpost&amp;p=3871933</link>
        <description><![CDATA[FasterHarder: <strong class='tag-b'>macomics</strong>, сразу еще договоримся, что хеш-таблица на цепочках ( без открытой адресации ). Открытая адресация более тонкая + возникает переполнение, когда кол-во входных данных превышает емкость ХТ и требуется реорганизация ( а этот процесс не самый тривиальный и существует множество подходов ). На цепочках память выделяется для коллизий только по мере надобности + тогда ХТ становится безразмерной ( хотя ее тоже вроде могут как-то реорганизовывать, но это ладно, пока не важно ).<br>
<br>
Вот смотри, вот условно говоря, простейшая операция: нужно найти минимальный элемент в каждой строке матрицы. Матрица размером N x M ( N, M --&#62; inf ).<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">for ( i = 0; i &#60; N; i++ )</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp; for ( j = 0; j &#60; M; j++ )</div><div class="code_line">&nbsp;&nbsp; &nbsp; {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // здесь обращение к хеш-функции</div><div class="code_line">&nbsp;&nbsp; &nbsp; }</div><div class="code_line">}</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
<br>
при этом 95% ( 5% ячеек считаем, что хранят данные ) итераций будут холостыми.<br>
<br>
Далее, однозначно коллизии будут, т к создать идеальную ХФ нереал ( ну почти ), следовательно, будут цепочки отрастать)<br>
прототип ХФ ( возьмем подход №1, который мне нравится меньше ):<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">int hash( const int index_row, const int index_col, const double value, const int capacity )</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;// здесь какая-то обработка и возвращается индекс слота для вставки в ХФ</div><div class="code_line">}</div></ol></div></div></div></div><br>
но это ведь не годится.<br>
<br>
вот условно говоря. Заданы габариты матрицы. Введены какие-то данные. Как-то заполнена хеш-таблица. Ок.<br>
Затем надо найти мин. в каждой строке ( как тривиальный пример ). По сути о данных ничего неизвестно, кроме их типа. Сами значения лежат каким-то образом в хеш-таблице. Только известны габариты матрицы. Ничего не остается, как запускать этот двойной цикл с колоссальным кол-вом итераций.<br>
вот еще. Условно говоря, операция поиска должна мне сказать: есть ли число в матрице с данными координатами или нет. Если есть, то я беру его в обработку.<br>
<br>
Короче, мы ведь не ищем конкретные данные в ХФ ( дробные числа ), а пытаемся узнать, есть ли данные с заданными координатами. Из этого я делаю вывод, что ключом выступают ТОЛЬКО координаты ячейки матрицы.<br>
Но возникает коллизия, например, для A[ 193 ][ 385 ] и A[ 3882 ][ 99992 ] одинаковая хеш-сумма = 100. ок, отрастает цепочка. Но все равно придется отличать их друг от друга. Придется сохранять информацию для каждого элемента списка информацию о №строки и №колонки + линейный поиск по списку для поиска коллизионного значения.<br>
<br>
была еще мысль хешировать по №строки, а затем уже по №колонки, но что-то все это корявато как-то)<br>
<br>
и еще, плиз, не нужен никакой код, тем более на asm-е, ни одной команды из него не знаю]]></description>
        <author>FasterHarder</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=428695&amp;view=findpost&amp;p=3871928</guid>
        <pubDate>Tue, 19 Jul 2022 11:25:51 +0000</pubDate>
        <title>Про хеш-таблицы и хеш-функцию для sparse array</title>
        <link>https://forum.sources.ru/index.php?showtopic=428695&amp;view=findpost&amp;p=3871928</link>
        <description><![CDATA[macomics: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Вопрос: какой из подходов более правильный?</div></div><br>
Любой, который позволит создать таблицу с уникальными индексами для всех добавленных в нее (возможных) данных.<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Или хеш-таблицы для обработки построчной sparse array крайне неудачный выбор?</div></div><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">; Хеш функция (inline)</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov eax, [col]</div><div class="code_line">&nbsp;&nbsp; &nbsp;xor eax, [row]</div><div class="code_line">&nbsp;&nbsp; &nbsp;add eax, [num]</div><div class="code_line">&nbsp;</div><div class="code_line">; Хеш таблица</div><div class="code_line">&nbsp;&nbsp; &nbsp;lea rbx, [tbl]</div><div class="code_line">&nbsp;</div><div class="code_line">; Добавление нового элемента (поиск в уже присутствующих)</div><div class="code_line">@@:</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov rbx, [rbx]</div><div class="code_line">&nbsp;&nbsp; &nbsp;ror eax, 1</div><div class="code_line">&nbsp;&nbsp; &nbsp;sbb rdx, rdx</div><div class="code_line">&nbsp;&nbsp; &nbsp;lea rbx, [rbx + rdx * 8 + 8]</div><div class="code_line">&nbsp;&nbsp; &nbsp;cmp qword [rbx], 0</div><div class="code_line">&nbsp;&nbsp; &nbsp;loopnz @b</div><div class="code_line">&nbsp;&nbsp; &nbsp;jrcxz .exist ; Найден элемент с таким же хеш (наихудший исход. стоит изменить хеш функцию)</div><div class="code_line">&nbsp;</div><div class="code_line">; Добавление нового элемента (дополнение недостающих индексов в таблице)</div><div class="code_line">@@:</div><div class="code_line">; Выделение памяти из буфера под новый элемент хеш таблицы</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov rdx, [buf]</div><div class="code_line">&nbsp;&nbsp; &nbsp;add rdx, 16</div><div class="code_line">&nbsp;&nbsp; &nbsp;cmp rdx, [eob]</div><div class="code_line">&nbsp;&nbsp; &nbsp;jae .error ; Недостаточно памяти</div><div class="code_line">&nbsp;&nbsp; &nbsp;xchg rdx, [buf]</div><div class="code_line">; Добавление нового элемента в хеш таблицу</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov [rbx], rdx</div><div class="code_line">&nbsp;&nbsp; &nbsp;ror eax, 1</div><div class="code_line">&nbsp;&nbsp; &nbsp;sbb rdx, rdx</div><div class="code_line">&nbsp;&nbsp; &nbsp;lea rbx, [rbx + rdx * 8 + 8]</div><div class="code_line">&nbsp;&nbsp; &nbsp;loop @b</div><div class="code_line">; Выделение памяти из буфера под новый элемент хеш таблицы</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov rdx, [buf]</div><div class="code_line">&nbsp;&nbsp; &nbsp;add rdx, 16</div><div class="code_line">&nbsp;&nbsp; &nbsp;cmp rdx, [eob]</div><div class="code_line">&nbsp;&nbsp; &nbsp;jae .error ; Недостаточно памяти</div><div class="code_line">&nbsp;&nbsp; &nbsp;xchg rdx, [buf]</div><div class="code_line">; Добавление последнего элемента в хеш таблицу (он содержит координаты)</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov eax, [col]</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov ecx, [row]</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov [rdx + 0], eax</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov [rdx + 4], ecx</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov [rbx], rdx</div><div class="code_line">&nbsp;&nbsp; &nbsp;jmp .done</div><div class="code_line">&nbsp;</div><div class="code_line">; Найден элемент с таким же хеш (наихудший исход. стоит изменить хеш функцию)</div><div class="code_line">.exist:</div><div class="code_line">; Выделение памяти из буфера под новый элемент хеш таблицы</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov rdx, [buf]</div><div class="code_line">&nbsp;&nbsp; &nbsp;add rdx, 16</div><div class="code_line">&nbsp;&nbsp; &nbsp;cmp rdx, [eob]</div><div class="code_line">&nbsp;&nbsp; &nbsp;jae .error</div><div class="code_line">&nbsp;&nbsp; &nbsp;xchg rdx, [buf]</div><div class="code_line">; Заполнение данных во вновь выделенном буфере</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov eax, [col]</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov ecx, [row]</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov [rdx + 0], eax</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov [rdx + 4], ecx</div><div class="code_line">&nbsp;&nbsp; &nbsp;and qword [rdx + 8], 0</div><div class="code_line">&nbsp;</div><div class="code_line">; Пропуск всех присутствующих элементов в динамическом списке</div><div class="code_line">@@:</div><div class="code_line">&nbsp;&nbsp; &nbsp;cmp qword [rbx + 8], 0</div><div class="code_line">&nbsp;&nbsp; &nbsp;jz @f</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov rbx, [rbx + 8]</div><div class="code_line">&nbsp;&nbsp; &nbsp;jmp @b</div><div class="code_line">&nbsp;</div><div class="code_line">; Ошибка. В выделенном буфере недостаточно памяти для размещения хеш таблицы</div><div class="code_line">.error:</div><div class="code_line">&nbsp;&nbsp; &nbsp;jmp raise_error_out_of_memory</div><div class="code_line">&nbsp;</div><div class="code_line">; Добавление нового элемента в динамический список элементов с одинаковым хеш</div><div class="code_line">@@:</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov [rbx + 8], rdx</div><div class="code_line">&nbsp;</div><div class="code_line">; Новый элемент добавлен в хеш таблицу (бинарное дерево)</div><div class="code_line">.done:</div></ol></div></div></div></div>В конечном итоге при поиске будут найдены координаты в этой таблице и известен хеш. Тогда выполнив<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">mov ecx, [rdx]</div><div class="code_line">xor ecx, [rdx + 4]</div><div class="code_line">sub eax, ecx</div></ol></div></div></div></div> Можно получить из хеш число.]]></description>
        <author>macomics</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=428695&amp;view=findpost&amp;p=3871927</guid>
        <pubDate>Tue, 19 Jul 2022 11:11:13 +0000</pubDate>
        <title>Про хеш-таблицы и хеш-функцию для sparse array</title>
        <link>https://forum.sources.ru/index.php?showtopic=428695&amp;view=findpost&amp;p=3871927</link>
        <description><![CDATA[FasterHarder: Всем хай&#33; Сходу к делу&#33;<br>
<br>
У меня 2 вопроса: теоретический и практический.<br>
<br>
По теории:<br>
Почти все источники, когда рассказывают про хеш-таблицы и хеш-функции, приводят пример такой хеш-функции ( абстрактный ):<br>
i = hash( key );<br>
hash - хеш-функция<br>
key - ключ данных<br>
<br>
а вот i - типа номер слота в самой хеш-таблице.<br>
То есть по-большему счету, хеш-функция в качестве результата возвращает позицию &quot;вставки&quot; данных в хеш-таблицу.<br>
<br>
Но встретил еще одно мнение ( и интуитивно оно мне кажется очень справедливым ).<br>
Суть такая: <strong class='tag-b'><span class="tag-color tag-color-named" data-value="blue" style="color: blue">хеш-функция ДОЛЖНА ЗАВИСЕТЬ ТОЛЬКО от свойств хешируемых данных и не иметь НИКАКОГО отношения к размеру хеш-таблицы.</span></strong> ИМХО, это очень справедливо :)<br>
В этом случае получается как бы 2х этапный процесс:<br>
1. хеш-функция генерирует хеш-сумму, ни коим образом не зависящий от емкости слотов хеш-таблицы<br>
2. хеш подгоняем под размер хеш-таблицы ( по классике % capacity или как-то еще ).<br>
<br>
<span class="tag-color tag-color-named" data-value="red" style="color: red"><strong class='tag-b'>Вопрос: какой из подходов более правильный?</strong></span><br>
------------------------------------------------------------------------<br>
<br>
По практике:<br>
Допустим дана разреж. матрица, состоящая из 100 000 строк и 200 000 колонок ( 100К на 200К ) дробных чисел. Около 5% ячеек будут заполнены ( или даже меньше ).<br>
И нужна хеш-таблица ( с хеш-функцией ), которая отображает в себя эту матрицу.<br>
Основные операции, которые нужны над данными - построчная какая-то обработка с поиском первого минимального или последнего максимального и пр.<br>
И что-то не очень просто оказалось это сделать)<br>
<br>
каждый элемент матрицы характеризуется:<br>
- координатой по №строки<br>
- координатой по №колонки<br>
- самим числом<br>
<br>
Что из этого ключ? Кажется, что координаты - их пара уникальна в рамках всей матрицы.<br>
Но в любом случае все это не спасает от полного сканирования всей строки элементов ( от 0 до 199 999 ), когда делается попытка обработать элементы этой строки, например, в поиске последнего минимального.<br>
Здесь что-то концептуально не вяжется.<br>
<br>
По-большему счету, надо получить такой эффект, чтобы, например, при обработке элементов 3-й строки обрабатывались ТОЛЬКО реальные ячейки с данными. Но как в этом поможет хеш-таблица - не вижу помощи от нее)<br>
<br>
<strong class='tag-b'><span class="tag-color tag-color-named" data-value="red" style="color: red">Или хеш-таблицы для обработки построчной sparse array крайне неудачный выбор?</span></strong><br>
Подскажите, как быть-то<br>
<br>
спс. за внимание <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2022-07-19T11:22:07+00:00">19.07.22, 11:22</time></span></span><br>
если отказаться от хеш-таблицы, то понятно, что можно задействовать список списков для отображения разр.матрицы.<br>
создать одномерный массив ( количество слотов равно количеству строк ) указателей + построить цепочки для реальных данных.<br>
тогда структура, описывающая данные будет примерно такой:<br>
структура ЧИСЛО<br>
   номер колонки<br>
   само число<br>
<br>
если в какой-то i-ой строке заданной матр. нет вообще элементов, то указатель[ i ] = NULL;<br>
<br>
но это уже не хеш-таблица) и вся обработка сводится к линейному просмотру. Но вроде такой подход вполне здесь может быть приемлем, наверное или все-таки тоже нет]]></description>
        <author>FasterHarder</author>
        <category>Алгоритмы</category>
      </item>
	
      </channel>
      </rss>
	