Cactus Kev's Poker Hand Evaluator के माध्यम से पढ़ना, मैं निम्नलिखित बयानों देखा:जो तेजी से है - तत्वों की एक छोटी सरणी को सॉर्ट करना या गुणा करना?
सबसे पहले, मैंने सोचा था कि मैं हमेशा बस पहले यह मूल्यांकनकर्ता को पार करने से पहले हाथ को सॉर्ट कर सकता है; लेकिन सॉर्टिंग में समय लगता है, और मैं हाथों को सॉर्ट करने वाले किसी भी CPU चक्र को बर्बाद नहीं करना चाहता था। मुझे एक ऐसी विधि की आवश्यकता थी जिस पर ध्यान नहीं दिया गया कि पांच कार्ड किस क्रम के रूप में दिए गए थे।
...
बहुत सारे विचारों के बाद, मुझे मुख्य संख्याओं का उपयोग करने के लिए एक बुद्धिमान था। मैं तेरह कार्ड रैंकों में से प्रत्येक के लिए एक प्राइम नंबर वैल्यू असाइन करूंगा ... इस प्रणाली की सुंदरता यह है कि यदि आप अपने हाथ में प्रत्येक कार्ड के रैंक के प्राइम वैल्यू गुणा करते हैं, तो ऑर्डर के बावजूद आपको एक अद्वितीय उत्पाद मिलता है पांच कार्डों में से।
...
हमारे समय मिलीसेकंड के बाद से गुणा सबसे तेजी से गणना एक कंप्यूटर बना सकते हैं में से एक है, हम मुंडा है सैकड़ों हम मूल्यांकन से पहले प्रत्येक हाथ सॉर्ट करने के लिए मजबूर किया गया था।
मुझे इस पर विश्वास करने में कठिन समय है।
कैक्टस केवी प्रत्येक कार्ड को 4-बाइट पूर्णांक के रूप में दर्शाता है, और eval_5cards(int c1, int c2, int c3, int c4, int c5)
पर कॉल करके हाथों का मूल्यांकन करता है। हम एक बाइट के रूप में कार्ड और 5-बाइट सरणी के रूप में पोकर हाथ का प्रतिनिधित्व कर सकते हैं। एक अद्वितीय हाथ पाने के लिए इस 5-बाइट सरणी को सॉर्ट करना बहुत तेज़ होना चाहिए। क्या यह उनके दृष्टिकोण से तेज़ है?
क्या होगा यदि हम उसका प्रतिनिधित्व (4-बाइट पूर्णांक के रूप में कार्ड) रखें? 5 पूर्णांक की सरणी को सॉर्ट करने से उन्हें गुणा करने से तेज़ हो सकता है? यदि नहीं, तो तत्वों की एक छोटी संख्या को क्रमबद्ध करने के लिए किस तरह के निम्न-स्तरीय अनुकूलन किए जा सकते हैं?
धन्यवाद!
सभी को अच्छा जवाब दें; मैं कुछ कठिन प्रदर्शन आंकड़े प्राप्त करने के लिए सॉर्टिंग बनाम गुणा के प्रदर्शन को बेंचमार्किंग पर काम कर रहा हूं।
उसे गुणा का उपयोग करने की भी आवश्यकता नहीं है - अतिरिक्त रूप से अच्छी तरह से काम करने के लिए जोड़ा जा सकता है (रैंक का प्रतिनिधित्व करने के लिए संख्याओं के एक अलग चयन के साथ)। यह अनिवार्य रूप से केवल एक हैश फ़ंक्शन है जो इनपुट आइटम के पुनर्वितरण के तहत परिवर्तनीय है। – caf
याद रखें कि गुणा हार्डवेयर पर किया जाने वाला एक प्रारंभिक ऑपरेशन है, उसकी कहानी में योग्यता हो सकती है। ध्यान दें कि यह अनिवार्य रूप से हैशिंग है (उसका हैशिंग फ़ंक्शन एक-टू-वन है जिसे वास्तव में तेज़ गणना किया जा सकता है) – ldog
जब मैं इसे पढ़ता हूं तो भी मुझे संदेह था। इष्टतम सॉर्टिंग नेटवर्क निश्चित रूप से धीमा है, लेकिन वह सिर्फ बिटमैस्क का उपयोग कर सकता था और कार्ड को एक साथ ऑर्ड कर सकता था, जो कि आसान होता। वह कॉम्बिनाडिक्स का भी उपयोग कर सकता है, जो गणना करने के लिए अधिक जटिल है, लेकिन परिणामस्वरूप सभी वैध पोकर हाथों के लिए एक संगत सीमा है, जिसका अर्थ है कि आप हैशटेबल की आवश्यकता के बजाय एक सरणी में हाथ देख सकते हैं। –