2015-05-17 15 views
6

में एक विशेष स्ट्रिंग को मैप करने के लिए कैसे करें मैं कुछ वित्तीय व्यापार कार्य कर रहा हूं। मैं स्टॉक प्रतीक का एक सेट है लेकिन वे बहुत स्पष्ट पैटर्न है: यह दो अक्षर AB, ACAD और चालू माह के जो एक चार अंकों की संख्या है से बना है: 1503, 1504, 1505। कुछ उदाहरण हैं:निर्दिष्ट पूर्णांक

AB1504 
AB1505 
AC1504 
AC1505 
AD1504 
AD1505 
.... 

चूंकि इन तार इतनी अच्छी तरह से तैयार कर रहे हैं नमूनों, मैं इतना है कि मैं तेजी से एक्सेस के लिए सरणी सूचकांक के रूप में पूर्णांक उपयोग कर सकते हैं एक अद्वितीय पूर्णांक में (हैश) मैप करने के लिए स्ट्रिंग के प्रत्येक चाहते हैं, चूंकि मेरे पास मेरे सिस्टम के अंदर बहुत सारे पुनर्प्राप्तियां हैं और std::unordered_map या कोई अन्य हैश नक्शा पर्याप्त तेज़ नहीं है। मेरे पास परीक्षण दिखाते हैं कि सामान्य हैश नक्शा सौ-नैनोसेकंड विलंबता स्तर है जबकि सरणी अनुक्रमण हमेशा 100 नैनो के अधीन होता है। मेरा आदर्श मामला होगा, उदाहरण के लिए, AB1504 नक्शा पूर्णांक 1, AB1505 मानचित्र 2 पर मानचित्र ...., तो मैं इन प्रतीकों से संबंधित जानकारी तक पहुंचने के लिए अंदर एक सरणी बना सकता हूं। मैं कुछ हैश एल्गोरिदम या अन्य विधियों को समझने की कोशिश कर रहा हूं जो मेरे लक्ष्य को प्राप्त कर सकते हैं लेकिन पता नहीं लगा सके। क्या आपके पास इस समस्या पर कोई सुझाव है?

+0

एक साधारण विचार: हेक्साडेसिमल (या उच्च काल्पनिक आधार) संख्या के रूप में अपना पैटर्न देखें और इसे अद्वितीय संख्या प्राप्त करने के लिए दशमलव में परिवर्तित करें। हालांकि यह 0 से शुरू नहीं होता है और वे परिणाम नहीं हैं – Emadpres

+0

आप डेटा को संपीड़ित करने की तरह कुछ भी कोशिश कर सकते हैं (zlib, हफमैन, lzw, आदि?) और डिकंप्रेशन डेटा को पूर्व-साझा करना (इसे अपने सभी संदेशों के लिए पुन: उपयोग करें या "विकसित करें यह "संचार के प्रत्येक पक्ष पर निश्चित रूप से) ताकि संदेश में" हेडर "डेटा ओवरहेड के रूप में न हो। –

+0

क्या आपके पास संख्या प्रारूप पर कुछ और जानकारी है? जैसा कि दो पहले अंक 2000 के बाद वर्षों का प्रतिनिधित्व करते हैं? यदि कुछ भी हो, तो अक्षरों के लिए क्या खड़ा है? क्या आपको एए 1501 (या इसी तरह) से पहले सामानों को संबोधित करने की आवश्यकता है? – holroy

उत्तर

0

यदि आप मिश्रित आधार संख्या के रूप में स्ट्रिंग को पार्स करते हैं, तो पहले 2 बेस -26 अंक और फिर 4 बेस -10 अंकों को आप प्रत्येक स्ट्रिंग के लिए तुरंत एक अद्वितीय अनुक्रमणिका प्राप्त करेंगे। एकमात्र मुद्दा यह है कि यदि आपको एक कम आबादी वाला सरणी मिल सकती है।

ऊपर वर्णित मुद्दे को कम करने के लिए सूचकांक की गणना करते समय आप हमेशा अंकों को पुन: व्यवस्थित कर सकते हैं।

चूंकि संख्याएं वास्तव में महीनों हैं, इसलिए मैं पहली प्रविष्टि से महीनों की संख्या की गणना करूंगा और उपसर्ग से 2 अंकों के बेस -26 नंबर के साथ गुणा करूँगा।

आशा है कि आप इस समय से मेरे टैबलेट पर टाइप करके इस से कुछ समझ सकते हैं। : डी

0

निम्न मान एक 32-बिट पूर्णांक द्वारा प्रदर्शनीय होना चाहिए: सीमा में

XYnnnn => (26 * X + Y) * 10000 + nnnn 

यहाँ X और रेंज [0, 26) में Y ले मूल्यों, और n मान लेता है [0 , 10)।

आपके पास कुल 6,760,000 प्रतिनिधित्व योग्य मान हैं, इसलिए यदि आप केवल इसके साथ थोड़ी मात्रा में डेटा जोड़ना चाहते हैं (उदाहरण के लिए एक गिनती या सूचक), तो आप केवल एक फ्लैट सरणी बना सकते हैं, जहां प्रत्येक प्रतीक एक सरणी पर कब्जा कर लेता है प्रवेश।

1

आप स्ट्रिंग को चर-आधार संख्या प्रतिनिधित्व के रूप में देख सकते हैं, और इसे एक पूर्णांक में परिवर्तित कर सकते हैं। उदाहरण के लिए:

AC1504: 
A (range: A-Z) 
C (range: A-Z) 
15 (range: 0-99) 
04 (range: 1-12) 

भागों को निकालें; तो एक हैश समारोह

int part1, part2, part3, part4; 
... 
part1 -= 'A'; 
part2 -= 'A'; 
part4 -= 1; 
return (((part1 * 26 + part2) * 100 + part3) * 12 + part4; 
0

मुझे लगता है प्रारूप 'AAyymm' है, जहां एक एक अपरकेस चरित्र yy एक दो अंकों वर्ष और मिमी दो अंकों महीने है हो सकता है।

इसलिए आप इसे 10 (एए) + वाई (वाई) + 4 (मिमी) बिट्स पर मैप कर सकते हैं। जहां वाई = 32 - 10 - 4 = 32 बिट प्रतिनिधित्व के लिए 18 बिट्स (या 262144 वर्ष)। ऐसा करने के बाद, आप अक्षरों को वहां स्थानांतरित करके और वर्ष और महीनों के जोड़े को एक पूर्णांक में परिवर्तित करने के बाद स्थानांतरित करके एक पूर्णांक के रूप में प्रारूप का प्रतिनिधित्व कर सकते हैं।

नोट: वहाँ हमेशा (4 मान)

से बचने के लिए द्विआधारी प्रतिनिधित्व, यहाँ वर्ण (6 + 6 मान) के लिए 5 + 5 बिट प्रतिनिधित्व में और 4 बिट महीने प्रतिनिधित्व में अंतराल हो जाएगा अंतराल एबीएमएमएम के प्रतिनिधित्व को बदलते हैं, जोड़ी एबी को 26 * ए + बी द्वारा दर्शाया गया है और एमएमएम कुछ महीनों में कुछ शून्य महीने के सापेक्ष महीने है (जिसमें 2^32/1024/12 = 349525 वर्ष शामिल हैं - 32 बिट्स)।

हालांकि, आप स्टॉक प्रतीकों और समय के विभाजन पर विचार कर सकते हैं। एक फ़ील्ड में दो मानों का संयोजन आमतौर पर परेशानी होती है (यह एक अच्छा भंडारण प्रारूप हो सकता है, लेकिन कोई अच्छा 'प्रोग्राम डेटा प्रारूप' नहीं)।

संबंधित मुद्दे