Я работаю над моделированием покера и теперь я должен эффективно ранжировать руки:быстрый покер рука рейтинг
Каждая рука представляет собой комбинацию из 5 карт и представлена как uint64_t
.
Каждый бит от 0 (Туз пик), 1 (Туз сердец) до 51 (Два из клубов) указывает, является ли соответствующая карта частью (бит == 1) или не является частью (бит == 0) рука. Биты от 52 до 63 всегда равны нулю и не содержат никакой информации.
Я уже знаю, как теоретически я мог бы создать таблицу, так что каждая действительная рука может быть отображена для отображения (представлена как uint16_t
) между 1 (2,3,4,5,7 - не одного цвета) и 7462 (Royal Flush), а остальные - до нулевого нуля.
Так наивная таблица поиска (с целочисленным значением карты в качестве индекса) будет иметь размер 2 bytes * 2^52 >= 9.007 PB
огромных.
Большая часть этой памяти будет заполнена нулями, потому что почти все uint64_t
- от 0 до 2^52-1 являются недопустимыми руками, и поэтому они имеют значение, равное нулю.
Ценные данные занимают только 2 bytes * 52!/(47!*5!) = 5.198 MB
.
Какой метод я могу использовать для сопоставления, так что мне нужно сохранить только ряды от действительных карточек и некоторые накладные расходы (не более 100 МБ) и все равно не нужно делать дорогой поиск ... должен быть как можно быстрее!
Если у вас есть другие идеи, добро пожаловать! ;)
Попробуйте хэш-таблицу. Построение его будет очень медленным, поэтому постройте его один раз и сохраните в файле. – ugoren
Интересно, что вы считаете, что только определенные карты действительны. Большинство покерных рук имеют ранг, основанный на 5 картах (возможно, все?) ... независимо от того, что эти 5 карт, каждый из них действителен. Если ваша рука - всего лишь пара двое, остальные три карты по-прежнему являются действительной частью руки (значительная только тогда, когда она против другой пары). – mah
@mah это не карты, которые действительны или нет, это руки, представленные кодировкой, которую он описывает. Как вы говорите, покерные руки обычно 5 карт; но с этой кодировкой вы можете тривиально представлять руки любого количества карт от 0 до 52. Это пустая трата пространства, на которое ссылается OP. –