สำรับไพ่ 52 ใบไพ่ 1 ใบจากไพ่ 52 ใบ (ไม่สามารถซ้ำกันได้)
จำนวนบิตน้อยที่สุดในการแสดงไพ่ 5 ใบและอย่างไร
มือไม่ได้เรียงตามลำดับ (KQ = QK) 64329 = 96432
ใช่สามารถใช้ 52 บิต ที่สามารถแสดงไพ่ในมือจำนวนเท่าใดก็ได้
ให้ไพ่หนึ่งใบมี 5 ใบมีวิธีแสดงว่ามีน้อยกว่า 52 บิต
บัตรเดียวสามารถแสดงด้วย 6 บิต = 64 ดังนั้นสามารถใช้ 6 บิต * 5 ใบ = 30 บิต แต่นั่นจะขึ้นอยู่กับการสั่งซื้อ ฉันสามารถเรียงลำดับและสิ่งนี้จะทำงาน หากไม่ได้ผลโปรดแจ้งให้เราทราบ
มีวิธีรับคีย์เป็น 32 บิตหรือต่ำกว่าและไม่ต้องเรียง 5 tuple การ์ด
นี่สำหรับการจำลองโป๊กเกอร์และการเรียงลำดับจะเป็นค่าใช้จ่ายจำนวนมากเมื่อเทียบกับการสร้างมือ ถ้าฉันมีพจนานุกรมที่มีค่าสัมพัทธ์ของแต่ละมือมันเป็นการค้นหาสองอย่างง่าย ๆ และการเปรียบเทียบเพื่อเปรียบเทียบค่าของสองมือ ถ้าฉันต้องเรียงมือก่อนนั้นมีขนาดใหญ่เมื่อเทียบกับการค้นหาสองรายการและการเปรียบเทียบ ในการจำลองจะเปรียบเทียบล้าน ฉันจะไม่ได้รับการเรียงลำดับมือจากการจำลอง การเรียงลำดับนั้นไม่ง่ายเช่น 52 51 50 49 48 ก่อนที่ 52 51 50 49 47 คุณสามารถมีล่ามตรงได้ ....
มีมือไพ่ 5 ใบที่เป็นไปได้ 2598960 นั่นคือจำนวนแถว กุญแจสำคัญคือไพ่ 5 ใบ ฉันต้องการรับคีย์ที่มีขนาด 32 บิตหรือต่ำกว่าซึ่งไม่จำเป็นต้องเรียงลำดับการ์ดก่อน
ไม่สามารถเรียงลำดับรายการได้เท่าที่ผูกมือกัน สูทคือพลั่วคลับเพชรและหัวใจ 7c 8c 2d 3d 4s = 7s 8s 2c 3c 4 ชม. มีความสัมพันธ์จำนวนมาก
ขั้นตอนต่อไปคือ 64 บิตและจะจัดการการเรียงลำดับแทนที่จะเป็นขนาดของคีย์
ฉันทดสอบและSortedSet<int> quickSort = new SortedSet<int>() { i, j, k, m, n };
เพิ่มเวลาการดำเนินการเป็นสองเท่า แต่ฉันก็ยังสามารถทำได้
มันซับซ้อนมากขึ้น ฉันต้องสามารถเป็นตัวแทนของเรือเป็นสองเท่าเหนือห้า (22255) ดังนั้นการเรียงลำดับพวกมันจึงแตก ฉันรู้ว่าคุณกำลังจะพูด แต่นั่นก็เร็ว ใช่มันเร็วและไม่สำคัญ แต่ฉันต้องการเร็วที่สุด
C # สำหรับคำตอบที่ยอมรับได้:
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("");
}