2014-11-18 2 views
0

Мне было интересно, знает ли кто-нибудь о хорошей реализации хэш-таблицы в C. Все, что я пытаюсь сделать, это хэш-шахматная доска. Я просто хочу, чтобы реализация была быстрой и с возможностью очистки таблицы за один раз. Любая помощь будет воспринята!C: Простой и быстрый хеш-стол для шахмат?

+0

Привет Джон, и добро пожаловать на сайт. Пожалуйста, взгляните на страницу ['как спросить'] (http://stackoverflow.com/help/how-to-ask), чтобы лучше понять, как задавать хорошие вопросы (затем увеличивая вероятность получения хорошие ответы) на stackoverflow. На данный момент ваш вопрос слишком широк и не показывает никаких исследовательских усилий и примеров. – streppel

+1

Может быть, мне что-то не хватает, но хэш не нужен, шахматная доска. Просто используйте индексы '8 * file + rank', где' file' и 'rank' имеют индексы C-стиля от 0 до 7. Хэши полезны, если ваш индекс или ключ могут быть любыми данными, которые нельзя сопоставить с маленькими целые числа. (Конечно, вы можете рассмотреть возможность индексирования через файл и ранжировать минимальный совершенный хеш с 64 ключами.) –

+0

Спасибо, я об этом не думал. – John

ответ

0

В шахматах это в основном называется «таблицей транспонирования». Это более специализированная структура данных, чем хеш-таблица.

Таблицы транспонирования больше похожи на кеши. Они быстрее, чем классические хеш-таблицы, потому что их обработка столкновений намного проще. В конечном итоге старые записи выселяются. Напротив, классическая хеш-таблица никогда не должна удалять записи, если она не запрашивается.

Я не знаю, что существует многопозиционная реализация таблиц транспонирования. Все шахматные движки, которые я видел, привносят свою собственную реализацию. Она состоит из двух аспектов:

  • Сам
  • Хэш функция hash что отображает позицию ключа таблицы транспонирования (для получения более подробной информации, посмотрите на Zobrist hashing)

Транспонирование таблицы само может быть очень легко. В начале, вы можете просто использовать один большой массив:

Entry* table = malloc(n * sizeof(Entry)); 
// ... 

// clear transposition table 
memset(table, 0, n * sizeof(Entry)); 

Position position; // the chess position 
// ... 

Key key = hash(position); 

// probe 
Entry entry = table[hash(position) % n]; 
if(entry.key == key) 
{ 
    // found something --> entry can be used 
    ... 
} 

// store 
table[hash(position) % n] = updated_entry; 

Более сложные таблицы транспозиции часто используют несколько слотов, поэтому записи из более глубоких поисков не выселили записи из меньших поисков. Предотвращение расследований данных в многопоточных механизмах также делает более сложной фактическую реализацию.

Вот некоторые дополнительные ссылки, которые должны помочь вам написать свой собственный: