इंटरपोलेटेड रैंक दृष्टिकोण के साथ वास्तव में कोई समस्या नहीं है। बस अपनी खुद की संख्या प्रणाली को परिवर्तनीय लंबाई बिट वैक्टरों के आधार पर परिभाषित करें जो 0 और 1 के बीच बाइनरी भिन्नताओं का प्रतिनिधित्व नहीं करते हैं। द्विआधारी बिंदु पहले अंक के बाईं ओर है।
इस प्रणाली की एकमात्र असुविधा यह है कि न्यूनतम बिट वेक्टर द्वारा न्यूनतम संभव कुंजी 0 दी गई है। इसलिए आप इसका उपयोग केवल तभी करते हैं जब आप सकारात्मक हों, संबंधित आइटम हमेशा के लिए पहली सूची तत्व होगा। आम तौर पर, केवल पहला आइटम कुंजी 1 दें। यह 1/2 के बराबर है, इसलिए श्रेणी (0..1) में यादृच्छिक सम्मिलन बिट उपयोग को कम करने के लिए प्रवृत्त होंगे। पहले और बाद में एक आइटम को जोड़ करने के लिए,
01 < newly interpolated = 1/4
1
11 < newly interpolated = 3/4
फिर अंतर्वेशन के लिए:
001 < newly interpolated = 1/8
01
011 < newly interpolated = 3/8
1
101 < newly interpolated = 5/8
11
111 < newly interpolated = 7/8
ध्यान दें कि यदि आप चाहें तो आप अंतिम 1 भंडारण छोड़ सकते हैं! सभी कुंजियां (0 को छोड़कर जिन्हें आप आम तौर पर उपयोग नहीं करेंगे) 1 में समाप्त होता है, इसलिए इसे संग्रहीत करना उचित है।
बाइनरी अंशों की तुलना लेक्सिकल तुलना की तरह बहुत अधिक है:1 और बाएं से दाएं स्कैन में पहला अंतर अंतर आपको बताता है कि कौन सा है। यदि कोई मतभेद नहीं होता है, यानी एक वेक्टर दूसरे का सख्त उपसर्ग है, तो छोटा छोटा होता है।
इन नियमों के साथ एक एल्गोरिदम के साथ आने के लिए बहुत आसान है जो दो बिट वैक्टर स्वीकार करता है और परिणामस्वरूप गणना करता है जो लगभग (या बिल्कुल कुछ मामलों में) उनके बीच होता है। बस बिट स्ट्रिंग्स जोड़ें, और अनावश्यक पीछे की बिट्स को छोड़कर, दाएं 1 को स्थानांतरित करें, यानी बीच के बीच को विभाजित करने के लिए दोनों का औसत लें।
उपरोक्त उदाहरण में, विलोपन के साथ हमें छोड़ दिया था, तो:
01
111
और हम, इन अंतर्वेशन 1.001
प्राप्त करने के लिए 01(0)
और और 111
जोड़ने की जरूरत है, तो 1001
पाने के लिए बदलाव। यह एक interpolant के रूप में ठीक काम करता है। लेकिन ध्यान दें कि अंतिम 1
अनावश्यक रूप से इसे किसी भी ऑपरेंड से अधिक लंबा बनाता है। 1
प्राप्त करने के लिए पीछे की ओर शून्य के साथ अंतिम 1
बिट को छोड़ना एक आसान अनुकूलन है। निश्चित रूप से पर्याप्त, 1
हम उम्मीद करेंगे के बीच लगभग आधा रास्ता है।
बेशक यदि आप एक ही स्थान पर कई प्रविष्टियां करते हैं (लगता है कि सूची की शुरुआत में लगातार आवेषण के बारे में सोचें), तो थोड़ा वैक्टर लंबा हो जाएगा।बाइनरी पेड़ में एक ही बिंदु पर डालने के समान ही यह वही घटना है। यह लंबा और स्ट्रिंग बढ़ता है। इसे ठीक करने के लिए, आपको सबसे कम संभव बिट वैक्टरों के साथ पुनर्निर्मित करके सिंक्रनाइज़ेशन के दौरान "पुनर्वसन" करना होगा, उदा। 14 के लिए आप ऊपर अनुक्रम का उपयोग करेंगे।
अलावा
हालांकि मैं इसे करने की कोशिश नहीं की है, Postgres bit string type कुंजी मैं का वर्णन किया है के लिए पर्याप्त लगता है। जिस चीज को मुझे सत्यापित करने की आवश्यकता होगी वह यह है कि संयोजन आदेश सही है।
इसके अलावा, वही तर्क किसी भी k>=2
के लिए बेस-के अंकों के साथ ठीक काम करता है। पहला आइटम कुंजी k/2
प्राप्त करता है। एक सरल अनुकूलन भी है जो लम्बाई ओ (एन) की कुंजी के कारण क्रमशः अंत और मोर्चे पर तत्वों को जोड़ने और तैयार करने के बहुत आम मामलों को रोकता है। यह उन मामलों के लिए ओ (लॉग एन) को बनाए रखता है (हालांकि उसी स्थान पर डालने से आंतरिक रूप से पी प्रविष्टियों के बाद ओ (पी) कुंजी उत्पन्न हो सकती है)। मैं आपको यह काम करने दूँगा। के = 256 के साथ, आप अनिश्चित लंबाई बाइट तारों का उपयोग कर सकते हैं। एसक्यूएल में, मुझे विश्वास है कि आप varbinary(max)
चाहते हैं। एसक्यूएल सही लेक्सिकोग्राफिक सॉर्ट ऑर्डर प्रदान करता है। यदि आपके पास जावा के समान BigInteger
पैकेज है तो इंटरपोलेशन ऑप्स का कार्यान्वयन आसान है। यदि आपको मानव-पठनीय डेटा पसंद है, तो आप बाइट स्ट्रिंग को उदा। हेक्स स्ट्रिंग्स (0-9 ए-एफ) और उनको स्टोर करें। फिर सामान्य यूटीएफ 8 स्ट्रिंग सॉर्ट ऑर्डर सही है।
यदि आपके पास दोनों प्रणालियों पर '{ए, बी, सी}' है, और सिस्टम '{ए, बी, पी, सी} 'प्राप्त करने के लिए एक आवेषण' पी 'है, और सिस्टम बी'' 'प्राप्त करने के लिए ' {ए, पी, बी, सी} ', आप सिंक करते समय किस आदेश को समाप्त करना चाहते हैं? – Geoff
@ गीफ, दो पी होने की संभावना लगभग शून्य है, क्योंकि हम यादृच्छिक यूयूआईडी का उपयोग कर रहे हैं। –
क्षमा करें, आप सही हैं। मैं वास्तव में पूछना चाहता था कि आप क्रमबद्ध क्रम में टकराव कैसे संभालेंगे। इससे पहले कि मैंने इसे बदल दिया, मैंने लिखा: \t यदि आपके पास दोनों सिस्टमों पर '{ए, बी, सी}' है, और सिस्टम '{ए, बी, पी, सी} ', और सिस्टम बी प्राप्त करने के लिए एक आवेषण' पी 'है '{ए, बी, क्यू, सी}' प्राप्त करने के लिए 'q' डालें, 'पी' और' q' के लिए क्या आदेश आप सिंक करते समय समाप्त करना चाहते हैं? – Geoff