2012-05-10 21 views
6

के बिना बोरो-व्हीलर ट्रांसफॉर्म मुझे रैखिक समय में एक प्रसिद्ध बुरो-व्हीलर ट्रांसफॉर्म करने की आवश्यकता है। मुझे प्रत्यय सॉर्टिंग और ईओएफ चरित्र के साथ एक समाधान मिला, लेकिन ईओएफ को जोड़ना परिवर्तन को बदल देता है। उदाहरण के लिए: स्ट्रिंग bcababa और दो रोटेशनईओएफ चरित्र

  • एस 1 = abababc
  • s2 = ababcab

यह स्पष्ट है कि एस 1 < s2 पर विचार करें। अब एक EOF चरित्र के साथ:

  • एस 1 = अबाबा #
  • s2 बीसी = ABA # bcab

और अब < एस 1 s2। और परिणामी परिवर्तन अलग होगा। मैं ईओएफ के बिना बीडब्ल्यूटी कैसे कर सकता हूं?

उत्तर

1

आपको बीडब्ल्यूटी के काम के लिए स्ट्रिंग में ईओएफ चरित्र होना चाहिए, अन्यथा आप मूल स्ट्रिंग को वापस पाने के लिए उलटा परिवर्तन नहीं कर सकते हैं। ईओएफ के बिना, दोनों तार "बीए" और "एबी" में एक ही रूपांतरित संस्करण ("बीए") होता है। "| Ab" और बा के लिए "ख | एक" EOF के साथ, रूपांतरण

ab  ba 

a b |  a | b 
b | a  b a | 
| a b  | b a 

अर्थात अब बदल करने के लिए अलग हैं।

बीओडटी के लिए ईओएफ की आवश्यकता है क्योंकि यह उस बिंदु को चिह्नित करता है जहां चरित्र चक्र शुरू होता है।

पुन:, EOF चरित्र के बिना यह कर विकिपीडिया के अनुसार,

के बाद से इनपुट स्ट्रिंग के किसी भी रोटेशन ही तब्दील स्ट्रिंग को बढ़ावा मिलेगा, BWT एक 'EOF' जोड़े बिना उल्टे नहीं किया जा सकता इनपुट के लिए मार्कर या इनपुट के साथ आउटपुट को बढ़ाने, एक इंडेक्स के रूप में, जिससे से इसकी सभी रोटेशन की कक्षा इनपुट इनपुट को पहचानना संभव हो जाता है।

ट्रांसफॉर्म का जैविक संस्करण है, जिसके द्वारा परिवर्तित स्ट्रिंग विशिष्ट रूप से मूल की पहचान करती है। इस संस्करण में, प्रत्येक स्ट्रिंग में एक ही लंबाई के अद्वितीय उलटा होता है।

पूर्वाग्रह परिवर्तन को पहले में लिंडन शब्दों के एक बढ़ते क्रम में इनपुट करने के द्वारा गणना की जाती है; चेन-फॉक्स-लिंडन प्रमेय द्वारा इस तरह का एक कारक मौजूद है, और रैखिक समय में पाया जा सकता है। फिर, एल्गोरिदम इन सभी शब्दों के सभी घूर्णनों को एक साथ जोड़ता है; जैसा सामान्य बुरो-व्हीलर ट्रांसफॉर्म में होता है, यह 0 स्ट्रिंग्स के सॉर्ट किए गए अनुक्रम का उत्पादन करता है। इसके बाद सूची में इन स्ट्रिंग्स में से प्रत्येक के अंतिम चरित्र को चुनकर परिवर्तित स्ट्रिंग को प्राप्त किया जाता है।

+0

यह होमवर्क है और मुझे डिकोडिंग करने की आवश्यकता नहीं है। – user8078

+0

मैं ईओएफ चरित्र के साथ समस्या का समाधान करूंगा। अगर मेरे पास एक छात्र होगा जो ईओएफ चरित्र के बिना समस्या का समाधान करेगा क्योंकि "उसे केवल इसके बिना समाधान मिल सकता है", तो मैं उस छात्र को विफल कर दूंगा। –

+0

चेक स्वचालित सिस्टम द्वारा किया जाता है, अगर मैं ईओएफ का उपयोग करता हूं तो मेरे पास "गलत जवाब" होगा। – user8078

4

आप ईओएफ चरित्र के बिना रैखिक समय और स्थान में ट्रांसफॉर्म कर सकते हैं जो स्वयं के साथ संयोजित स्ट्रिंग की प्रत्यय सरणी की गणना करके कर सकते हैं। फिर प्रत्यय सरणी पर फिर से शुरू करें।यदि वर्तमान प्रत्यय सरणी मान n से कम है, तो अपने आउटपुट सरणी को प्रत्यय सरणी में वर्तमान मान द्वारा निर्दिष्ट स्थिति पर शुरू होने वाले घूर्णन के अंतिम अक्षर में जोड़ें। यह दृष्टिकोण थोड़ा अलग बीडब्ल्यूटी रूपांतरण परिणाम उत्पन्न करेगा, हालांकि, स्ट्रिंग रोटेशन को सॉर्ट नहीं किया गया है जैसे कि ईओएफ चरित्र मौजूद था।

एक अधिक गहन वर्णन यहां पाया जा सकता है: http://www.quora.com/Algorithms/How-I-can-optimize-burrows-wheeler-transform-and-inverse-transform-to-work-in-O-n-time-O-n-space

+1

अपने आप के साथ संयोजित स्ट्रिंग के बराबर एक ईओएफ चरित्र का उपयोग कर रहा है? मुझे जो उत्पादन मिलता है वह समान नहीं लगता है। एक EOF चरित्र, "\ 0" है, जो सभी अन्य पात्रों की तुलना में कम होना चाहिए का उपयोग करना, मैं 'ptr मिलती है: 13, स्ट्रिंग:" CTAAAACACGAGA \ 0GATGCAGGTATTTTATGTTAGTGATGCATTTTATGGCTCCCCGAGCATATC "' श्रेणीबद्ध इनपुट विधि का उपयोग करना, मैं मिलता है, ' पीआरटी: 12, str: "TAAAACACGAGACGATGCGGATATTTTATGTTAGTGATGCATTTTATGGCTCCCCGAGCATATC" ' भले ही हम एनयूएल टर्मिनेटर को अनदेखा करते हैं, तो आउटपुट अभी भी अलग है। – DSnet

+0

@DSnet आप किस इनपुट स्ट्रिंग का उपयोग करते थे? AGCTTTTCATTCTGACTGCAACGGGCAATATGTCTCTGTGTGGATTAAAAAAAGAGTCTCTGAC? –

+0

@DSnet ... ठीक है, मैं आपके परिणामों को पुन: उत्पन्न करने में सक्षम हूं। यदि मेरे पास समय है तो मैं बाद में जांच करूंगा। धन्यवाद! –

0

मैं जानता हूँ कि इस सूत्र काफी पुराना है, लेकिन मैं एक ही समस्या थी और निम्नलिखित समाधान के साथ आया था:

  • lexicographical न्यूनतम स्ट्रिंग का पता लगाएं घूर्णन और ऑफसेट (रिवर्स करने के लिए आवश्यक) को बचाएं (मैं लाइडन कारकलाइजेशन का उपयोग करता हूं)
  • घुमावदार स्ट्रिंग पर सामान्य बीडब्ल्यूटी एल्गोरिदम का उपयोग करें (यह सही आउटपुट उत्पन्न करता है क्योंकि सभी एल्गोस मानते हैं कि स्ट्रिंग को लेक्सिकोग्राफिक रूप से न्यूनतम चार द्वारा पीछा किया जाता है)
  • रिवर्स करने के लिए: उदा। पिछली खोज इंडेक्स 0 से शुरू होती है और सहेजे गए ऑफसेट
संबंधित मुद्दे