Мелкий вопрос по хеш-таблице

Тема в разделе "Машинное отделение", создана пользователем дуп, 16 фев 2008.

  1. TopicStarter Overlay

    дуп Учаcтник

    • Участник
    Рег.:
    11.09.2007
    Сообщения:
    113
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Великий Новгород
    Оффлайн
    Я попробовал посмотреть как у меня работает хеш (шашки). Смущают некоторые числа:
    Один элемент таблицы 16 байт.
    Провел одну партию : Хеш 64 МБ, итого всего 4194304 ячейки. В партии было сделано 36 ходов. Остались обнуленными (невостребованными) 7068 ячеек.
    При записи в таблицу я считал процент несовпадений позиции, уже хранящейся в таблице, и новой, с одинаковыми ключами. Кажется это называется коллизией. Оказалось, что коллизий не возникает только в сорока процентах случаев. Вроде как многовато. Кто - нибудь проводил подобные замеры ?
  2. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Да, проводили. У Скифи коллизий не бывает вообще.
    Если позиция находится по этому адресу, и ключ совпадает - значит это она и есть.
  3. TopicStarter Overlay

    дуп Учаcтник

    • Участник
    Рег.:
    11.09.2007
    Сообщения:
    113
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Великий Новгород
    Оффлайн
    Может я чего перепутал ? Не так считал ?
    Код:
    void WriteHash(U64 key, ......)
    {
        HASH *p = &hash_tbl[key & (hash_size - 1)]; // адрес - остаток от деления
        Key1++;
        if(p->key != key)
        Key2++;
        .........
     }
       На экран выводится :   Key2 * 100 / Key1
    На экране висит число 60 ( +- 2)
  4. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Нет, не то считал.
  5. WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Если память мне не изменяет, в теории хеш-таблиц коллизией считается ситуация, когда разные объекты хотят иметь один и тот же индекс в таблице. Полное совпадение ключа это уже какая-то коллизия второго уровня.
  6. TopicStarter Overlay

    дуп Учаcтник

    • Участник
    Рег.:
    11.09.2007
    Сообщения:
    113
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Великий Новгород
    Оффлайн
    Я балда, признаю. Сейчас и сам увидел :(
    Непонятное что то я сосчитал.
    Извиняйте, пошел перечитывать "Арифметика на селе"
  7. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Частота таких коллизий совсем неинтересна.

    http://ru.wikipedia.org/wiki/Hash
    коллизия - одинаковый ключ на разных наборах данных.
  8. WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    А вот это непонятно. Мне, напротив, частота коллизий полного ключа неитересна, т.к. их очень мало (можно считать, что их нет). А вот коллизии индекса могут дать кое-какую полезную информацию для выбора стратегии замены записей в таблице.
  9. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Коллизии индекса можно посчитать (без тестов), просто предположив что у нас идеальная Хеш-функция.
  10. WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Получается, что мы через процент коллизий индекса можем определить качество хеш-функции. :)
  11. TopicStarter Overlay

    дуп Учаcтник

    • Участник
    Рег.:
    11.09.2007
    Сообщения:
    113
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Великий Новгород
    Оффлайн
    Не мог бы мне кто-нибудь из бывалых объяснить еще такую вещь :
    Как я понимаю, везде для зобриста используют числа, для получения которых лепят какие-то левые генераторы, кто во что. Не понятно, зачем доверяться случаю, ведь чисел то нужно совсем не много, для шахмат, например всего 768, для шашек и того меньше. Наверняка давно уже известны самые что ни на есть "случайные" числа. Или это у всех секрет ?
    P.S. Я тут в Крафти увидел что то подобное, это оно и есть, о чем я спрашиваю ?
  12. WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    В интернете найти такие не трудно.
    Но ГСЧ программе, для других целей, все равно нужен.
  13. WinPooh В.М.

    • Команда форума
    Рег.:
    13.02.2006
    Сообщения:
    9.492
    Симпатии:
    3.122
    Репутация:
    95
    Адрес:
    Москва
    Оффлайн
    Не то что бы совсем левые :)
    У меня, например, генератор вполне пристойный - взят не откуда-нибудь, а из Кнута. Всем нужным статистическим критериям удовлетворяет. Число Пи с его помощью до 5-6 знаков подсчитать можно без проблем, проверял.

    В некоторых программах используется Mersenne-Twister - тоже очень добротный, апробированный многочисленными тестами генератор. С очень длинным периодом - до ~2^32000.

    Впрочем, вы правы - особого качества для генерации именно Зобрист-коэффициентов не требуется. Главное, чтобы не было совсем грубого бага - когда, например, выпадает половина бит, и эффективная длина хэша резко падает.
  14. TopicStarter Overlay

    дуп Учаcтник

    • Участник
    Рег.:
    11.09.2007
    Сообщения:
    113
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Великий Новгород
    Оффлайн
    WildCat,
    WinPooh
    Спасибо, понятно.

    Это я все беспокоюсь по поводу попадания в хеш. Хотя вроде бы беспокоиться не о чем. Моей проге таблица дает прибавку очень большую. Например движок с хешем выигрывает у этого же самого без таблицы с огромным преимуществом. И только за счет большей глубины. На 3 - 4 полухода в начале партии и 5 - 15 в конце. При записи, конечно, процент попадания не имеет большого значения, все равно менее ценные не перезапишут более ценные. Другое дело при чтении из хеша. Я тут проверил, как сумел. Проверял так
    Код:
    U64 yes; // попал
    U64 no; // не попал
    Перед каждым поиском :   yes = no = 0;
     ReadHesh(U64 key, ...........)
    {
    
        HASH *p = &hash_tbl[key & (hash_size - 1)];
        if(p->key  == key)
        {  
             yes++;
             ...
         }
         else
            no++;
       ........
      }
           На экран выводится :    yes/no
    В начале партии число составляет всего около 0.2 - 0.3
    Оно по ходу плавно растет и к концу может достигать 100 - 300.
    Еденицы достигает примерно когда половины фигур нет на доске. Получается, что в начале и в середине партии процент использования хеш-таблицы очень низкий. И большая часть работы по записи и хранению проделана зря, поиск все равно пролетает мимо.
  15. TopicStarter Overlay

    дуп Учаcтник

    • Участник
    Рег.:
    11.09.2007
    Сообщения:
    113
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Великий Новгород
    Оффлайн
    В предыдущем посте это я написал в смысле как бы это дело улучшить ?

Поделиться этой страницей