क्या आपके पास कभी एक सरणी में बहुत सारा डेटा था, लेकिन हैश की तरह कुंजी/मूल्य लुकअप करने की आवश्यकता थी? सौभाग्य से, Ruby सरणियों को कुंजी-मूल्य संरचनाओं के रूप में व्यवहार करने के लिए एक तंत्र प्रदान करता है। आइए इसे देखें!
`Array#assoc` और `Array#rassoc` का परिचय
कल्पना करें कि आपको एक जादुई स्टॉक-पिकिंग मशीन दी गई है। हर कुछ मिनटों में यह खरीदने या बेचने के लिए स्टॉक की सिफारिश करता है। आप इसे अपने कंप्यूटर से जोड़ने में कामयाब रहे, और डेटा की एक स्ट्रीम प्राप्त कर रहे हैं जो इस तरह दिखती है:
picks = [ ["AAPL", "buy"], ["GOOG", "sell"], ["MSFT", "sell"] ]
Google के लिए सबसे हालिया मार्गदर्शन खोजने के लिए, आप `Array#assoc` मेथड का उपयोग कर सकते हैं। यहाँ देखें कि यह कैसा दिखता है:
# डेटा की पहली पंक्ति लौटाता है जहां row[0] == "GOOG" picks.assoc("GOOG") # => ["GOOG", "sell"]
सबसे हालिया "बेचें" सिफारिश खोजने के लिए, आप `Array#rassoc` मेथड का उपयोग कर सकते हैं।
# डेटा की पहली पंक्ति लौटाता है जहां row[1] == "sell" picks.rassoc("sell") # => ["GOOG", "sell"]
यदि कोई मेल नहीं मिलता है, तो मेथड्स nil लौटाते हैं:
picks.assoc("CSCO") # => nil picks.rassoc("hold") # => nil
ऐतिहासिक डेटा
हैश में एक कुंजी के लिए एक से अधिक मान नहीं हो सकते। लेकिन सरणियों में जितने चाहें उतने डुप्लिकेट हो सकते हैं। असोस और रासोस मेथड्स इस मामले में समझदारी भरा काम करते हैं और पहली मिलान वाली पंक्ति लौटाते हैं जो वे पाते हैं। यह हमें कुछ बहुत दिलचस्प चीजें करने देता है।
हमारी काल्पनिक स्टॉक पिकिंग मशीन डेटा की एक स्ट्रीम प्रदान करती है। अंततः, यह किसी विशेष कंपनी के बारे में अपना मन बदलने जा रही है और मुझे वह खरीदने के लिए कहेगी जो उसने पहले मुझे बेचने के लिए कहा था। उस स्थिति में हमारा डेटा ऐसा दिखता है:
picks = [ ["GOOG", "buy"], ["AAPL", "sell"], ["AAPL", "buy"], ["GOOG", "sell"], ["MSFT", "sell"] ]
यदि मैं इस सभी डेटा को हैश में डाल रहा होता, तो किसी विशेष स्टॉक के लिए सिफारिश को अपडेट करने से मुझे उस स्टॉक के लिए पिछली किसी भी सिफारिश को खोना पड़ता। सरणी के साथ ऐसा नहीं है। मैं सरणी के सामने सिफारिशें प्रीपेंड करते रह सकता हूँ, यह जानते हुए कि Array#assoc हमेशा मुझे सबसे हालिया सिफारिश देगा।
# डेटा की पहली पंक्ति लौटाता है जहां row[0] == "GOOG" picks.assoc("GOOG") # => ["GOOG", "buy"]
तो हमें हैश की कुंजी-मूल्य अच्छाई मिलती है, साथ में एक मुफ्त ऑडिट ट्रेल।
दो से अधिक कॉलम
असोस के बारे में एक और अच्छी बात यह है कि आप प्रति सरणी केवल दो कॉलम तक सीमित नहीं हैं। आप जितने चाहें उतने कॉलम रख सकते हैं। मान लीजिए आपने प्रत्येक खरीद/बिक्री सिफारिश में एक टाइमस्टैम्प जोड़ा।
picks = [ ["AAPL", "buy", "2015-08-17 12:11:55 -0700"], ["GOOG", "sell", "202207/2022070811463167.jpg" /> आप दो धनात्मक पूर्णांकों का औसत इस तरह निकाल सकते हैं: (x&y)+((x^y)>>1)
त्वरित व्युत्क्रम वर्गमूल
मैं बिट ट्विडलिंग पर एक ब्लॉग पोस्ट नहीं कर सकता बिना सबसे प्रसिद्ध उदाहरणों में से एक को शामिल किए। वह है 1999 के क्वेक 3 एरिना स्रोत कोड से जॉन कार्मैक का त्वरित व्युत्क्रम वर्गमूल सन्निकटन। एल्गोरिदम उनका नहीं है, लेकिन सबसे प्रसिद्ध कार्यान्वयन उनका है।
मैं इसे सीधे Ruby में पोर्ट करने का प्रयास नहीं करने जा रहा हूँ, क्योंकि यह एक फ्लोटिंग पॉइंट संख्या के बाइनरी प्रतिनिधित्व का निर्माण करके काम करता है जिस तरह से C से Ruby में सीधे अनुवाद योग्य नहीं है।
float Q_rsqrt( float number ) { long i; float x2, y; const float threehalfs = 1.5F; x2 = number * 0.5F; y = number; i = * ( long * ) &y; // evil floating point bit level hacking i = 0x5f3759df - ( i >> 1 ); // what the fuck? y = * ( float * ) &i; y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration // y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed return y; }