Một cỗ bài là 52. Một tay là 5 lá từ 52 (không thể có một bản sao).
Số bit ít nhất để đại diện cho một tay 5 thẻ là gì và bằng cách nào?
Một bàn tay KHÔNG phụ thuộc vào thứ tự (KQ = QK). 64329 = 96432
Có, có thể sử dụng 52 bit. Điều đó có thể đại diện cho một tay của bất kỳ số lượng thẻ.
Cho một tay là chính xác 5 thẻ có một cách để thể hiện nó với ít hơn 52 bit.
Một thẻ đơn có thể được biểu diễn với 6 bit = 64. Vì vậy, chỉ có thể sử dụng 6 bit * 5 thẻ = 30 bit. Nhưng đó sẽ là phụ thuộc vào thứ tự. Tôi chỉ có thể sắp xếp và điều này sẽ làm việc. Nếu điều đó không làm việc xin vui lòng cho tôi biết.
Có cách nào để lấy khóa từ 32 bit trở xuống và không phải sắp xếp bộ 5 thẻ.
Điều này là dành cho mô phỏng poker và việc sắp xếp sẽ tốn rất nhiều chi phí so với việc chỉ tạo tay. Nếu tôi có một từ điển với giá trị tương đối của mỗi tay thì đó là hai lần tra cứu đơn giản và so sánh để so sánh giá trị của hai tay. Nếu tôi phải sắp xếp các bàn tay lớn trước so với hai lần tra cứu và so sánh. Trong một mô phỏng sẽ so sánh hàng triệu. Tôi sẽ không nhận được bàn tay sắp xếp từ mô phỏng. Cách sắp xếp không đơn giản như 52 51 50 49 48 trước 52 51 50 49 47. Bạn có thể có các góc phẳng thẳng ....
Có 2598960 có thể 5 thẻ tay. Đó là số lượng hàng. Chìa khóa là 5 thẻ. Tôi muốn nhận một khóa có 32 bit hoặc dưới đó các thẻ không cần phải được sắp xếp trước.
Không thể chỉ cần đặt hàng danh sách như nhiều tay buộc. Suit là thuổng, câu lạc bộ, kim cương, và trái tim. 7c 8c 2d 3d 4s = 7s 8s 2c 3c 4h. Có một số lượng lớn các mối quan hệ.
Bước tiếp theo là 64 bit và sẽ thực hiện cú đánh sắp xếp thay vì tăng gấp đôi kích thước của khóa.
Tôi đã thử nghiệm và nhân SortedSet<int> quickSort = new SortedSet<int>() { i, j, k, m, n };
đôi thời gian hoạt động nhưng tôi vẫn có thể làm được.
Nó trở nên phức tạp hơn. Tôi cần phải có khả năng đại diện cho một chiếc thuyền như twos trên fives (22255). Vì vậy, sắp xếp chúng phá vỡ điều đó. Tôi biết bạn sẽ nói nhưng đó là nhanh chóng. Vâng, nó nhanh và tầm thường nhưng tôi cần càng nhanh càng tốt.
C # cho câu trả lời được chấp nhận:
private int[] DeckXOR = new int[] {0x00000001,0x00000002,0x00000004,0x00000008,0x00000010,0x00000020,0x00000040,
0x00000080,0x00000100,0x00000200,0x00000400,0x00000800,0x00001000,0x00002000,
0x00004000,0x00008000,0x00010000,0x00020000,0x00040000,0x00080000,0x00100000,
0x00200000,0x00400000,0x00800000,0x01000000,0x02000000,0x04000000,0x07fe0000,
0x07c1f000,0x0639cc00,0x01b5aa00,0x056b5600,0x04ed6900,0x039ad500,0x0717c280,
0x049b9240,0x00dd0cc0,0x06c823c0,0x07a3ef20,0x002a72e0,0x01191f10,0x02c55870,
0x007bbe88,0x05f1b668,0x07a23418,0x0569d998,0x032ade38,0x03cde534,0x060c076a,
0x04878b06,0x069b3c05,0x054089a3};
public void PokerProB()
{
Stopwatch sw = new Stopwatch();
sw.Start();
HashSet<int> cardsXOR = new HashSet<int>();
int cardXOR;
int counter = 0;
for (int i = 51; i >= 4; i--)
{
for (int j = i - 1; j >= 3; j--)
{
for (int k = j - 1; k >= 2; k--)
{
for (int m = k - 1; m >= 1; m--)
{
for (int n = m - 1; n >= 0; n--)
{
counter++;
cardXOR = DeckXOR[i] ^ DeckXOR[j] ^ DeckXOR[k] ^ DeckXOR[m] ^ DeckXOR[n];
if (!cardsXOR.Add(cardXOR))
Debug.WriteLine("problem");
}
}
}
}
}
sw.Stop();
Debug.WriteLine("Count {0} millisec {1} ", counter.ToString("N0"), sw.ElapsedMilliseconds.ToString("N0"));
Debug.WriteLine("");
}