मैं एक कुशल स्ट्रिंग trie कार्यान्वयन की तलाश कर रहा हूं। ज्यादातर मुझे ऐसा कोड मिला है:
जावा में प्रासंगिक कार्यान्वयन (प्रति विकिपीडिया)
मैं इन कार्यान्वयनों को ज्यादातर दो कारणों से नापसंद करता हूं:
- वे केवल 256 ASCII वर्णों का समर्थन करते हैं। मुझे सिरिलिक जैसी चीजों को कवर करने की आवश्यकता है।
- वे बेहद अक्षम हैं।
प्रत्येक नोड में 256 संदर्भों की एक सरणी होती है, जो जावा में 64 बिट मशीन पर 4096 बाइट्स होती है। इनमें से प्रत्येक नोड में 4096 बाइट्स वाले प्रत्येक के साथ 256 सबनॉड्स तक हो सकते हैं। इसलिए प्रत्येक ASCII 2 वर्ण स्ट्रिंग के लिए एक पूर्ण Trie को 1MB से अधिक की आवश्यकता होगी। तीन चरित्र तार? केवल नोड्स में सरणियों के लिए 256MB। और इसी तरह।
बेशक, मैं अपने ट्राइ में 16 मिलियन तीन कैरेक्टर स्ट्रिंग्स रखने का इरादा नहीं रखता हूं, इसलिए बहुत सारी जगह बर्बाद हो गई है। इनमें से अधिकांश सरणियाँ केवल शून्य संदर्भ हैं क्योंकि उनकी क्षमता सम्मिलित कुंजियों की वास्तविक संख्या से अधिक है। और अगर मैं यूनिकोड जोड़ता हूं, तो सरणियां और भी बड़ी हो जाती हैं (चार्ट में जावा में 256 के बजाय चारक मान हैं)।
क्या तार के लिए एक कुशल तिकड़ी बनाने की कोई उम्मीद है? मैंने इस प्रकार के कार्यान्वयन पर कुछ सुधारों पर विचार किया है:
- संदर्भों की सरणी का उपयोग करने के बजाय, मैं आदिम पूर्णांक प्रकार की एक सरणी का उपयोग कर सकता हूं, जो संदर्भों की एक सरणी में नोड्स में अनुक्रमित करता है, जिसका आकार वास्तविक नोड्स की संख्या के करीब है।
- मैं 4 बिट भागों में तारों को तोड़ सकता हूं जो कि एक गहरे पेड़ की कीमत पर आकार 16 के नोड सरणियों के लिए अनुमति देगा।