সময়ে শব্দ ফ্যাক্টরিকরণ


12

দুটি স্ট্রিং S1,S2 , আমরা তাদের সমবেত হওয়ার জন্য S1S2 লিখি । একটি স্ট্রিং প্রদত্ত S এবং পূর্ণসংখ্যা k1 , আমরা লিখতে (S)k=SSS এর সংযুক্তকরণের জন্য k কপি S । এখন একটি স্ট্রিং দেওয়া হয়েছে, আমরা এই সংকেতটি এটি 'সংক্ষেপণ' করতে ব্যবহার করতে পারি, অর্থাৎ AABAAB( ( A ) 2 B ) হিসাবে লেখা যেতে পারে((A)2B)2 । আসুন একটি ওজন কলকম্প্রেশন, এটা প্রদর্শনে অক্ষরের সংখ্যা তাই ওজন((A)2B2) দুই, এবং ওজন(AB)2A (ককম্প্রেশনএরABABA ) তিনটি (পৃথকA গুলি পৃথকভাবে গণনা করা হয়)।

এখন কম্পিউটিং একটি প্রদত্ত স্ট্রিং এর 'হালকা' কম্প্রেশন সমস্যা বিবেচনা S সঙ্গে |S|=n । কিছু চিন্তাভাবনার পরে একটি স্পষ্ট গতিশীল প্রোগ্রামিং অ্যাপ্রোচ আছে যা সঠিক পদ্ধতির উপর নির্ভর করে O(n3logn) বা O(n3)

তবে, আমাকে বলা হয়েছে যে এই সমস্যাটি O(n2logn) সময়ে সমাধান করা যেতে পারে , যদিও আমি কীভাবে এটি করব তার কোনও উত্স খুঁজে পাই না। বিশেষত, সাম্প্রতিক প্রোগ্রামিং প্রতিযোগিতায় এই সমস্যাটি দেওয়া হয়েছিল (সমস্যাটি কে এখানে , শেষ দুটি পৃষ্ঠায়)। বিশ্লেষণের সময় একটি O(n3logn) এলগরিদম উপস্থাপিত হয়েছিল, এবং শেষে সিউডো চতুর্ভুজটি নির্দিষ্ট করা হয়েছিল ( এখানে চার মিনিটের চিহ্নে)। দুর্ভাগ্যক্রমে উপস্থাপক কেবল 'জটিল শব্দ সংযুক্তি লেমা' হিসাবে উল্লেখ করেছেন, তাই এখন আমি সমাধানটি জিজ্ঞাসা করতে এখানে এসেছি :-)


কেবল একটি এলোমেলো সম্পত্তি: যদি স্ট্রিং আমাদের কাছে S = X a = Y b থাকে , তবে এটি অবশ্যই এস = জেড | এস | / গিসিডি ( | এক্স | , | ওয়াই | ) [আমি এখানে একটি ভুল স্থির করেছি], জেডের দৈর্ঘ্য জিসিডি ( | এক্স | , | ওয়াই | ) রয়েছে (যা X বা Y এর চেয়ে বেশি হতে পারে না )SS=Xa=YbS=Z|S|/gcd(|X|,|Y|)Zgcd(|X|,|Y|)XY)। যদিও এটি কতটা কার্যকর তা নিশ্চিত নয়। যদি আপনি ইতিমধ্যে পাওয়া যায় যে সন্দেহাতীতভাবে জেনো যে, এস অন্তত 2 স্বতন্ত্র অক্ষর রয়েছে, এবং এখন খুঁজছেন একটি সংক্ষিপ্ত ওয়াই যেমন যে এস = ওয়াই , তাহলে আপনি শুধুমাত্র উপসর্গ চেষ্টা করতে ওয়াই এর এক্স দৈর্ঘ্য থাকার যে ভাগ | এক্স | S=XaSYS=YbYX|X|
j_random_hacker

সমস্যা হলো সম্ভাব্য সব হ্রাস পরেও হয় , আপনি কি এখনও subsegments উপর একটি ঘন ডিপি দ্বারা উত্তর সমষ্টি (অর্থাৎ প্রয়োজন ডি পি [ , ] = মিনিট ডি পি [ , k ] + + ডি পি [ + + 1 , r ] ), সুতরাং এর পরেও আরও কিছু কাজ করা বাকি রয়েছে ...XaDP[l,r]=minkDP[l,k]+DP[k+1,r]
টিমন নিগেজ

আমি বুঝছি তুমি কি বলতে চাও. আমি মনে করি আপনার একধরনের আধিপত্য সম্পর্ক দরকার যা পরীক্ষার জন্য কিছু মানগুলিকে সরিয়ে দেয় - তবে আমি এর একটি ভাবতে পারিনি। বিশেষত, আমি নিম্নলিখিতগুলি বিবেচনা করেছি: ধরুন এস [ 1 .. i ] একটি অনুকূল গুণক S [ 1 .. i ] = কে > 1 সহ এক্স ওয়াই কে ; এটি একটি সন্তোষজনক সমাধান যা আছে সম্ভব এস হিসাবে factorised হয় এক্স ওয়াই জেড সঙ্গে < ? দুর্ভাগ্যক্রমে উত্তর হ্যাঁ: জন্যkS[1..i]S[1..i]=XYkk>1SXYjZj<k , এস [ ১.৪. ] এর সর্বোত্তম গুণনীয়করণ ( বি ) ২ রয়েছে , তবে এস এর জন্য অনন্য অনুকূল গুণনীয়কটিহ'লবি ( বি সি ) S=ABABCABCS[1..4](AB)2SAB(ABC)2
j_random_hacker

উত্তর:


1

আমি যদি আপনার ভুল বোঝাবুঝি না করে থাকি তবে আমি মনে করি নীচে ন্যূনতম ব্যয়ের অনুষঙ্গটি O(n2) সময়ে গণনা করা যেতে পারে ।

প্রতিটি সূচক আমি, আমরা একটি মূল্যবোধের গুচ্ছ নিরূপণ করবে (pi,ri) জন্য =1,2, যেমন অনুসরণ করে। যাক pi11 যেমন পূর্ণসংখ্যা ক্ষুদ্রতম একটি পূর্ণসংখ্যা যে সেখানে থাকা r2 পরিতৃপ্ত

S[irpi1+1,ipi1]=S[i(r1)pi1+1,i].
এই বিশেষ জন্যpi1 যাকri1 বৃহত্তম হতেr এই সম্পত্তি সঙ্গে। যদি এরকম কোনওpi বিদ্যমান না থাকে তবেLi=0 সেট করুনযাতে আমরা জানি যেএই সূচকের জন্যশূন্য(pi,ri) মান রয়েছে।

আসুন আমিpi2 সবচেয়ে ছোট পূর্ণসংখ্যার চেয়ে বড় হয়েছি (ri11)pi1 সন্তুষ্ট, একইভাবে,

S[iri2pi2+1,ipi2]=S[i(ri21)pi2+1,i]
কিছু ri22 । আগের মত গ্রহণ ri2 সর্বোচ্চ এক নির্দিষ্ট থাকার হতে pi2 । সাধারণভাবে pi ক্ষুদ্রতম যেমন সংখ্যা কঠোরভাবে চেয়ে বড় (ri11)pi1 । যদি এরকম কোনও pi বিদ্যমান না থাকে তবে Li=1

নোট প্রতিটি সূচক আমি, আমরা Li=O(log(i+1)) কারণে pi জ্যামিতিক বাড়ছে মান । (যদি pi+1 বিদ্যমান, তাই না শুধু কঠোরভাবে চেয়ে বড় (ri1)pi অন্তত দ্বারা কিন্তু যে চেয়ে বড় pi/2 । এই জ্যামিতিক বৃদ্ধি স্থাপন।)

মনে করুন এখন সমস্ত (pi,ri) মান আমাদের দেওয়া হয়েছে। সর্বনিম্ন খরচ পুনরাবৃত্তি দেওয়া হয়

dp(i,j)=min{dp(i,j1)+1,min(dp(i,jrjpj)+dp(jrjpj+1,jpj))}
বোঝার সঙ্গে যেi>jআমরা সেটdp(i,j)=+। টেবিলটিO(n2+njLj)সময়েপূরণ করা যেতে পারে।

আমরা ইতিমধ্যে উপরে লক্ষ করেছি যে jLj=O(jlog(j+1))=Θ(nlogn) যোগফলকে মেয়াদ অনুসারে সীমাবদ্ধ করে। তবে প্রকৃতপক্ষে যদি আমরা পুরো যোগফলটি দেখি, আমরা আরও তীক্ষ্ণ কিছু প্রমাণ করতে পারি।

এস এর বিপরীতে (যেমন, এস এর উপসর্গ গাছ ) প্রত্যয় গাছ T(S) বিবেচনা করুন । আমরা সমষ্টি প্রতিটি অবদান চার্জ হবে Σ আমি এল আমি একজন প্রান্ত থেকে টি ( এস ) যাতে প্রতিটি প্রান্ত সবচেয়ে একবারে চার্জ করা হবে। প্রতিটি চার্জ পি আমি প্রান্ত থেকে নির্গমনের জন্য এন একটি ( বনাম ( আমি ) , বনাম ( আমি - পি আমি ) ) এবং প্রতি যাচ্ছে বনামSiLiT(S)pijএনএকটি(বনাম(আমি),বনাম(আমি-পিআমি))বনাম(আমি-পিআমি) । এখানেবনাম(আমি) হ'লএস[1 ..আমি] সাথে সম্পর্কিত উপসর্গ গাছের পাতাএবং nca নিকটতম সাধারণ পূর্বপুরুষকে বোঝায়।

এ থেকে জানা যায় হে(Σআমিএলআমি)=হে(এন) । মানগুলি (পিআমি,Rআমি) সময় অনুসারে হে(এন+ +Σআমিএলআমি) অনুসারে গাছের প্রত্যয়টি অনুসরণ করে গণনা করা যেতে পারে তবে যদি কেউ আগ্রহী হয় তবে আমি বিশদটি পরবর্তী সম্পাদনায় রেখে দেব।

যদি এটি বোঝা যায় তবে আমাকে জানান।


-1

দৈর্ঘ্যের আপনার প্রাথমিক স্ট্রিং এস। পদ্ধতিটির সিউডো-কোডটি এখানে।

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

আমি ইচ্ছাকৃতভাবে "শেষ বন্ধনীগুলি" সম্পর্কে সামান্য বিশদ জানিয়েছি কারণ এটি স্ট্যাক এবং আনস্ট্যাক করার জন্য অনেক পদক্ষেপের প্রয়োজন যা মূল পদ্ধতিটি অস্পষ্ট করে দেয়। ধারণাটি হ'ল প্রথমটির ভিতরে আরও সংকোচনের পরীক্ষা করা। উদাহরণ হিসাবে এবিসিবিসিএবিসিবিসি => (এবিসিবিসি) ² => (এ (বিসি) ²) ² ²

সুতরাং প্রধান পয়েন্টটি হ'ল প্রথমে বড় পিরিয়ডগুলি সন্ধান করা। দ্রষ্টব্য যে এস [i] হ'ল এস "" (",") "বা পাওয়ার এড়িয়ে যাওয়ার ith পদ।

  • আই-লুপটি ও (এন)
  • জ-লুপটি ও (এন)
  • আর + কে-লুপগুলি ও (লগ (এন)) হওয়ায় এটি প্রথম পার্থক্যে থামে

এটি বিশ্বব্যাপী O (n²log (n))।


এটি আমার কাছে পরিষ্কার নয় যে r এবং কে লুপগুলি ও (লগ এন) - এমনকি পৃথকভাবে। সর্বাধিক ও (লগ এন) পুনরাবৃত্তির পরে কোন পার্থক্য খুঁজে পাওয়া যায় তা কী নিশ্চিত করে?
j_random_hacker

আপনি কি লোভ দিয়ে সংকোচ করছেন তা আমি কি সঠিকভাবে বুঝতে পারি? যেহেতু এটি ভুল, উদাহরণস্বরূপ ABABCCCABCCC বিবেচনা করুন যা আপনাকে AB (ABC ^ 3) ^ 2 হিসাবে চিহ্নিত করতে হবে।
টিমন নিগেজ

হ্যাঁ আপনি পুরোপুরি ঠিক এটি সম্পর্কে, আমি এই সম্পর্কে চিন্তা করতে হবে।
অপটিডাদ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.