समय में शब्द गुणनखंडन


12

दो तार को देखते हुए , हम को उनके संयोजन के लिए लिखते हैं । एक स्ट्रिंग को देखते हुए और पूर्णांक , हम लिख के संयोजन के लिए की प्रतियां । अब एक तार दिया गया है, हम इस संकेतन का उपयोग इसे 'कंप्रेस' करने के लिए कर सकते हैं, अर्थात को रूप में लिखा जा सकता है । आइए एक संपीड़न के भार को उस में दिखाई देने वाले वर्णों की संख्या कहते हैं, इसलिए का वजन दो है, और ( का एक संपीड़न) का तीन है (अलगएस 1 , एस 2S1,S2एस 1 एस 2S1S2 एस Sकश्मीर 1 k1( एस ) कश्मीर = एस एस एस (S)k=SSSकश्मीरkS SA A B A A B AABAAB( ( A ) 2 B ) 2((A)2B)2( ( ) 2 बी 2 ) ((A)2B2)( बी ) 2(AB)2Aबी बी ABABAA को अलग से गिना जाता है)।

अब किसी दिए गए स्ट्रिंग साथ 'lightest' कंप्रेशन की समस्या पर विचार करें । | कुछ सोच के बाद एक स्पष्ट गतिशील प्रोग्रामिंग दृष्टिकोण है जो सटीक दृष्टिकोण के आधार पर या में चलता है।एस S| एस | = n |S|=nO ( n 3 लॉग एन )O(n3logn)( एन 3 )O(n3)

हालाँकि, मुझे बताया गया है कि इस समस्या को समय में हल किया जा सकता है , हालांकि मुझे यह करने का कोई स्रोत नहीं मिल रहा है। विशेष रूप से, यह समस्या एक हालिया प्रोग्रामिंग प्रतियोगिता (समस्या के यहाँ , पिछले दो पृष्ठों में) में दी गई थी। विश्लेषण के दौरान एक एल्गोरिथ्म प्रस्तुत किया गया था, और अंत में छद्म द्विघात बाध्यता का उल्लेख किया गया था ( यहां चार मिनट के निशान पर)। अफसोस की बात है कि प्रस्तुतकर्ता ने केवल 'एक जटिल शब्द कॉम्बीनेटरिक्स लेम्मा' का उल्लेख किया है, इसलिए अब मैं यहां समाधान पूछने के लिए आया हूं :-)O ( n 2 log n ) O(n2logn)O ( n 3 log n )O(n3logn)


बस एक यादृच्छिक संपत्ति: यदि एक स्ट्रिंग हमारे पास , तो यह भी होना चाहिए कि [] मैंने यहाँ एक गलती तय की है], साथ लंबाई (जो कि या से अधिक लंबी नहीं हो सकती )। यह निश्चित नहीं है कि यह कितना उपयोगी है। यदि आप पहले ही यह जान चुके हैं कि और जानते हैं कि में कम से कम 2 अलग-अलग वर्ण हैं, और अब एक छोटे तलाश कर रहे हैं जैसे कि , तो आपको केवल के लंबाई वाले के उपसर्गों को आज़माना होगा। यह विभाजन।S S = X a = Y b S = Z | एस | / Gcd ( | एक्स | , | Y | ) जेड gcd ( | एक्स | , | Y | ) एक्स वाई एस = एक्स एक एस वाई एस = Y वाई एक्स | एक्स |SS=Xa=YbS=Z|S|/gcd(|X|,|Y|)Zgcd(|X|,|Y|)XYS=XaSYS=YbYX|X|
19

समस्या यह है कि सभी संभावित को कम करने के बाद भी , आपको अभी भी (यानी पर घन डीपी द्वारा उत्तर को एकत्रित करने की आवश्यकता है ), तो उसके बाद भी कुछ अतिरिक्त काम किया जाना है ...एक्स डी पी [ एल , आर ] = मिन के डी पी [ एल , के ] + डी पी [ के + , आर ]XaDP[l,r]=minkDP[l,k]+DP[k+1,r]
Timon Knigge

मुझे पता है तुम्हारा क्या मतलब है। मुझे लगता है कि आपको किसी तरह के प्रभुत्व संबंध की आवश्यकता है जो कुछ मूल्यों को परीक्षण करने की आवश्यकता से दूर करता है - लेकिन मैं एक के बारे में सोच नहीं पा रहा हूं। विशेष रूप से, मैंने निम्नलिखित पर विचार किया: मान लीजिए कि का इष्टतम कारक साथ ; क्या यह संभव है कि एक इष्टतम समाधान है जिसमें को साथ रूप में कारक बनाया गया है । दुर्भाग्य से जवाब है हाँ: के लिए , इष्टतम गुणनखंड है , लेकिन के लिए अद्वितीय इष्टतम गुणनखंड है ।k S [ 1 .. i ] S [ 1 .. i ] = X Y k k > 1 S X Y j Z j < k S = A B A B C A B C S [ 1..4 ] ( A B) ) 2 एस बी ( बी सी ) 2kS[1..i]S[1..i]=XYkk>1SXYjZj<kS=ABABCABCS[1..4](AB)2SAB(ABC)2
j_random_hacker

जवाबों:


1

अगर मुझे आपकी गलतफहमी नहीं है, तो मुझे लगता है कि न्यूनतम लागत कारक की गणना समय में की जा सकती है।( एन 2 )O(n2)

प्रत्येक सूचकांक मैं के लिए, हम मूल्यों का एक समूह की गणना करेगा के लिए इस प्रकार है। बता दें कि सबसे छोटा पूर्णांक होता है जैसे कि एक पूर्णांक संतोषजनकइस विशेष , को इस संपत्ति के साथ सबसे बड़ा होने दें । यदि ऐसा कोई मौजूद नहीं है, तो सेट करें ताकि हम जान सकें कि इस सूचकांक के लिए शून्य मान हैं।( पी मैं , आर मैं ) (pi,ri)= 1 , 2 , ... =1,2,पी 1 मैं1 p1i1r 2 r2एस [ मैं - आर पी 1 मैं + 1 , मैं - पी 1 मैं ] = एस [ मैं - ( आर - 1 ) पी 1 आई + 1 , आई ]

S[irp1i+1,ip1i]=S[i(r1)p1i+1,i].
पी1 मैंp1i r 1 मैंr1i आरrपीमैंpiएलमैं=0Li=0(पीमैं ,आरमैं )(pi,ri)

आज्ञा देना सबसे छोटा पूर्णांक है जो कड़ाई से बड़ा है संतोषजनक, इसी तरह, कुछ । पहले की तरह, को अधिकतम होने के लिए निश्चित । सामान्य तौर पर सबसे छोटी ऐसी संख्या है जो से कड़ाई से बड़ी है । यदि ऐसा कोई मौजूद नहीं है, तो ।p 2 ip2i ( r 1 i - 1 ) p 1 i(r1i1)p1i S [ i - r 2 i p 2 i + 1 , i - p 2 i ] = S [ i - ( r 2 i - 1 ) p 2 i + 1 , 1 मैं ]

S[ir2ip2i+1,ip2i]=S[i(r2i1)p2i+1,i]
आर 2 मैं2 r2i2आर 2 मैंr2i पी2ip2ipipi(r1i1)p1i(r1i1)p1ipipiLi=1Li=1

नोट प्रत्येक सूचकांक मैं के लिए, हमारे पास है कि के कारण मूल्यों के साथ ज्यामितीय बढ़ती । (यदि मौजूद है, तो यह कड़ाई से से बड़ा नहीं है, लेकिन इससे कम से कम । यह ज्यामितीय वृद्धि को स्थापित करता है। )Li=O(log(i+1))Li=O(log(i+1))pipip+1ip+1i(ri1)pi(ri1)pipi/2pi/2

मान लीजिए अब सभी मान हमें दिए गए हैं। न्यूनतम लागत पुनरावृत्ति इस समझ के साथ कि हमने । तालिका समय में भरी जा सकती है ।(pi,ri)(pi,ri)dp(i,j)=min{dp(i,j1)+1,min(dp(i,jrjpj)+dp(jrjpj+1,jpj))}

dp(i,j)=min{dp(i,j1)+1,min(dp(i,jrjpj)+dp(jrjpj+1,jpj))}
i>ji>jdp(i,j)=+dp(i,j)=+O(n2+njLj)O(n2+njLj)

हमने पहले से ही उस को शब्द द्वारा शब्द ऊपर देखा था । लेकिन वास्तव में अगर हम पूरे योग को देखें, तो हम कुछ तेज कर सकते हैं।jLj=O(jlog(j+1))=Θ(nlogn)jLj=O(jlog(j+1))=Θ(nlogn)

(यानी, के उपसर्ग वृक्ष के रिवर्स के प्रत्यय ट्री पर विचार करें । हम प्रत्येक योगदान को से एक किनारे लिए चार्ज करेंगे, ताकि प्रत्येक किनारे पर एक बार में शुल्क लिया जाए। प्रत्येक से निकलने वाले किनारे पर को चार्ज करें और । यहाँ अनुरूप उपसर्ग वृक्ष का पत्ता है और nca निकटतम सामान्य पूर्वज को दर्शाता है।T(S)T(S)SSiLiiLiT(S)T(S)pjipjinca(v(i),v(ipji))nca(v(i),v(ipji))v(ipji)v(ipji)v(i)v(i)S[1..i]S[1..i]

इससे पता चलता है कि । मान गणना समय में प्रत्यय वृक्ष के एक द्वारा की जा सकती है, लेकिन अगर किसी को दिलचस्पी है, तो मैं बाद में विवरण को छोड़ दूंगा।O(iLi)=O(n)O(iLi)=O(n)(pji,rji)(pji,rji)O(n+iLi)O(n+iLi)

मुझे पता है अगर यह समझ में आता है।


-1

लंबाई n की अपनी प्रारंभिक स्ट्रिंग S है। यहाँ विधि का छद्म कोड है।

next_end_bracket = n
for i in [0:n]: # main loop

    break if i >= length(S) # due to compression
    w = (next_end_bracket - i)# width to analyse

    for j in [w/2:0:-1]: # period loop, look for largest period first
        for r in [1:n]: # number of repetition loop
            if i+j*(r+1) > w:
                break r loop

            for k in [0:j-i]:
                # compare term to term and break at first difference
                if S[i+k] != S[i+r*j+k]:
                    break r loop

        if r > 1:
            # compress
            replace S[i:i+j*(r+1)] with ( S[i:i+j] )^r
            # don't forget to record end bracket...
            # and reduce w for the i-run, carrying on the j-loop for eventual smaller periods. 
            w = j-i

मैंने जानबूझकर "एंड ब्रैकेट्स" पर बहुत कम विवरण दिया क्योंकि इसमें स्टैक और अनस्टैक के लिए बहुत सारे कदमों की आवश्यकता होती है जो कोर पद्धति को स्पष्ट नहीं होने देते। विचार एक पहले के अंदर एक अंतिम आगे संकुचन का परीक्षण करने के लिए है। छूट के लिए ABCBCABCBC => (ABCBC)> => (A (BC) ²) AB।

इसलिए मुख्य बिंदु पहले बड़ी अवधि के लिए देखना है। ध्यान दें कि S [i] किसी भी ", (", ")" या शक्ति को छोड़ने का S का ith शब्द है।

  • i-loop O (n) है
  • j- लूप हे (n) है
  • r + k-loops O (लॉग (n)) है क्योंकि यह पहले अंतर पर रुकता है

यह विश्व स्तर पर O (n²log (n)) है।


यह मेरे लिए स्पष्ट नहीं है कि आर और के लूप ओ (लॉग एन) हैं - यहां तक ​​कि अलग से भी। क्या सुनिश्चित करता है कि अधिकांश ओ (लॉग एन) पुनरावृत्तियों के बाद एक अंतर पाया जाता है?
j_random_hacker

क्या मैं सही ढंग से समझता हूं कि आप लालच से संकुचित हो रहे हैं? क्योंकि यह गलत है, उदाहरण के लिए ABABCCCABCCC पर विचार करें जिसे आपको AB (ABC ^ 3) ^ 2 के रूप में बताना चाहिए।
टिमोन निगेज

हाँ, आप इसके बारे में पूरी तरह से सही हैं, मुझे इस बारे में सोचना है।
ऑप्टिआड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.