ও (এন) এ প্রত্যয় অ্যারে ব্যবহার করে একটি স্ট্রিংয়ের ক্ষুদ্রতম লিক্সোগ্রাফিকাল ঘূর্ণন


9

আমি এসিএম 2003 থেকে সমস্যাটি উদ্ধৃত করব:

দৈর্ঘ্যের n (1 <= n <= 100000) এর স্ট্রিং বিবেচনা করুন। এর সর্বনিম্ন লেকোগোগ্রাফিক ঘূর্ণন নির্ধারণ করুন। উদাহরণস্বরূপ, "আলাবালা" স্ট্রিংয়ের আবর্তনগুলি হ'ল:

alabala

labalaa

abalaal

balaala

alaalab

laalaba

aalabal

এবং তাদের মধ্যে ক্ষুদ্রতমটি হল "আলাবাল"।

সমাধান হিসাবে - আমি জানি আমার একটি প্রত্যয় অ্যারে তৈরি করা দরকার - এবং আসুন আমি বলি যে আমি ও (এন) এ এটি করতে পারি। আমার প্রশ্ন এখনও, আমি ও (এন) এর মধ্যে সবচেয়ে ক্ষুদ্রতর ঘূর্ণনটি কীভাবে খুঁজে পাব? (এন = একটি স্ট্রিংয়ের দৈর্ঘ্য)

আমি এই সমস্যায় খুব আগ্রহী এবং এখনও আমি কোনওভাবে সমাধান পাচ্ছি না। আমি ধারণাটি সম্পর্কে আরও আগ্রহী এবং কীভাবে সমস্যার সমাধান করবেন তা কংক্রিট বাস্তবায়নে নয়।

দ্রষ্টব্য: ন্যূনতম রোটেশন অর্থ একটি ইংরেজি অভিধানের মতো একই ক্রমে - "ডওয়ার" "শব্দের" আগে কারণ ড এর আগে ড।

সম্পাদনা: প্রত্যয় অ্যারে নির্মাণে ও (এন) লাগে

শেষ সম্পাদনা: আমি মনে করি আমি একটি সমাধান খুঁজে পেয়েছি !!! আমি যদি কেবল দুটি স্ট্রিং মার্জ করি? সুতরাং যদি স্ট্রিংটি "আলাবালা" হয় তবে নতুন স্ট্রিংটি আমাকে "আলাবালালাবালা" করবে এবং এখন আমি কেবল এটির একটি প্রত্যয় অ্যারে তৈরি করব (ও (2 এন) = ও (এন)) এবং প্রথম প্রত্যয়টি পেয়েছি? আমার ধারণা এটি সঠিক হতে পারে। আপনি কি মনে করেন? ধন্যবাদ!


আপনি কীভাবে "ন্যূনতম" সংজ্ঞায়িত করবেন? মেট্রিক কী ব্যবহৃত হয় (সম্ভবত এটি সুস্পষ্ট তবে আমি একজন বিশেষজ্ঞ নই)?
জর্জিও

নোটের জন্য ধন্যবাদ! আমি ভেবেছিলাম যে ঘূর্ণনটি ন্যূনতম (ন্যূনতম অফসেট) হতে হবে, ঘূর্ণন আর্ট লিক্সোগ্রাফিকাল ক্রমের ফলাফল নয়।
জর্জিও

আমি এখনও কিছু মিস করছি: প্রত্যয় অ্যারের নির্মাণ এবং বাছাই করা জটিলতায় অন্তর্ভুক্ত? আমি ধারণা করি অ্যারে তৈরি করতে এবং এটি বাছাই করতে (এন) এর চেয়ে বেশি লাগে ।
জর্জিও

আমি মনে করি আসল স্ট্রিং দু'বার পুনরাবৃত্তি করার ধারণাটি দুর্দান্ত! তারপরে আপনি ও (2 এন) = ও (এন) এ প্রত্যয় অ্যারে তৈরি করতে পারেন। তবে আপনার সর্বনিম্ন সন্ধানের জন্য এটি বাছাই করার দরকার নেই? এটি ও (এন) এর চেয়ে বেশি প্রয়োজন, তাই না?
জর্জিও

@ জর্জিও ভাল, প্রত্যয় অ্যারে নিজেই ইতিমধ্যে বাছাই করা প্রত্যয়গুলি ধরে রাখে । এবং অন্য নোট, সম্ভবত সামান্য অফটোপিক - ভুলে যাবেন না যে বাছাই করা জিনিসগুলি ও (এন) এর মধ্যেও কিছু সাজানো বাছাই করা বস্তুর সাথে অনুমান করা যেতে পারে (উদাহরণস্বরূপ রেডিক্সের
সারণিটি দেখুন

উত্তর:


5

দৈর্ঘ্য N এর একটি স্ট্রিংয়ের সমস্ত ঘূর্ণন নির্মাণের একটি সহজ কৌশল হ'ল স্ট্রিংটি নিজের সাথে সংযুক্ত করা।

তারপরে এই 2 এন দৈর্ঘ্যের স্ট্রিংয়ের প্রতিটি এন-দৈর্ঘ্যের স্ট্রিংটি মূল স্ট্রিংয়ের একটি ঘূর্ণন।

"লেক্সিকোগ্রাফিকলি মিনিমাম" সাবস্ট্রিং সনাক্তকরণ এরপরে আপনার ও (এন) গাছ নির্মাণের মাধ্যমে সম্পন্ন করা হবে।


0

আমি নিশ্চিত যে প্রত্যয় অ্যারেতে থাকা তথ্য আপনাকে ও (এন) এ পেতে সহায়তা করার জন্য পর্যাপ্ত নয় তবে বেশিরভাগ ক্ষেত্রে আপনাকে ও (এন লগ এন) এ সহায়তা করতে পারে। প্রত্যয়গুলির এই পরিবারটি বিবেচনা করুন:

a
aba
abacaba
abacabadabacaba
abacabadabacabaeabacabadabacaba
...

আপনি পূর্বের প্রত্যয়টি (আব্বা বলুন) গ্রহণ করে পরবর্তী অক্ষরটি ব্যবহার করেননি, পরবর্তী অক্ষরটি এখনও ব্যবহার করা হয়নি এবং তারপরে আবার পূর্বের প্রত্যয়টি যুক্ত করে (সুতরাং আবা -> আবা সি আবা)।

এখন এই স্ট্রিংগুলি বিবেচনা করুন (জোর দেওয়ার জন্য স্থানটি যুক্ত করা হয়েছে তবে স্ট্রিংয়ের অংশ নয়):

ad abacaba
bd abacaba
cd abacaba

এই তিনটি স্ট্রিংয়ের জন্য, প্রত্যয় অ্যারের শুরুটি দেখতে এইরকম হবে:

a
aba
abacaba
(other suffixes)

চেনা লাগছে? এই স্ট্রিংগুলি অবশ্যই এই প্রত্যয় অ্যারে তৈরি করতে তৈরি করা হয়েছে। এখন, শুরুর চিঠির (ক, খ বা সি) উপর নির্ভর করে 'সঠিক' সূচক (আপনার সমস্যার সমাধান) হয় উপরের তালিকার প্রথম, দ্বিতীয় বা তৃতীয় প্রত্যয় is

প্রথম বর্ণের পছন্দটি প্রত্যয় অ্যারেটিকে খুব কমই প্রভাবিত করে; বিশেষত, এটি প্রত্যয় অ্যারেতে প্রথম তিনটি প্রত্যয়ের ক্রমকে প্রভাবিত করে না। এর অর্থ হল আমাদের লগ এন স্ট্রিং রয়েছে যার জন্য প্রত্যয় অ্যারে অত্যন্ত অনুরূপ তবে 'সঠিক' সূচকটি খুব আলাদা।

যদিও আমার কাছে কোনও শক্ত প্রমাণ নেই, এটি আমার কাছে দৃ strongly়তার সাথে পরামর্শ দেয় যে আপনার লিক্সিকোগ্রাফিক ক্রমের জন্য অ্যারেতে এই প্রথম তিনটি সূচকগুলির সাথে সম্পর্কিত ঘূর্ণনগুলির তুলনা করা ছাড়া আপনার কোনও বিকল্প নেই, যার পরিবর্তে আপনার কমপক্ষে ও (এন) প্রয়োজন লগ এন) এর জন্য সময় (বিকল্প প্রথম অক্ষরের সংখ্যা হিসাবে - আমাদের ক্ষেত্রে 3 - লগ এন, এবং দুটি স্ট্রিংের তুলনা করতে ও (এন) সময় লাগে)।

এটি কোনও ও (এন) অ্যালগরিদমের সম্ভাবনা বাতিল করে না। আমার কেবল সন্দেহ আছে যে একটি প্রত্যয় অ্যারে আপনাকে এই চলমান সময় অর্জনে সহায়তা করে।


0

ক্ষুদ্রতম ঘূর্ণনটি প্রত্যয় অ্যারের থেকে প্রত্যয়টির সাথে শুরু হয়। প্রত্যয়গুলি ডিক্সিকোগ্রাফিকভাবে অর্ডার করা হয়। এটি আপনাকে একটি বড় জাম্পস্টার্ট দেয়:

  • আপনি জানেন যে একবার আপনি এইরকম কে পেয়েছেন যে প্রত্যয় কে দিয়ে শুরু হওয়া ঘূর্ণন প্রত্যয় কে +1 দিয়ে শুরু হওয়া ঘূর্ণনের চেয়ে ছোট হবে , আপনি সম্পন্ন করেছেন (প্রথমটি থেকে শুরু করে);
  • আপনি "প্রত্যয় কে দিয়ে শুরু হওয়া ঘূর্ণনটি প্রত্যয় কে +1 দিয়ে শুরু হওয়া ঘূর্ণনটির চেয়ে ছোট (ও) (1) প্রত্যয়ের দৈর্ঘ্যের তুলনা করে এবং বিকল্পভাবে, একটি চরিত্রের সাথে অন্য একটি চরিত্রের সাথে তুলনা করে তুলনা করতে পারেন can

সম্পাদনা: "একে অপরের চরিত্রের সাথে একটি চরিত্র" সর্বদা তা নাও হতে পারে, এটি একাধিক চরিত্রের হতে পারে তবে সামগ্রিকভাবে, আপনি পুরো অনুসন্ধানের প্রক্রিয়াটির মাধ্যমে n অক্ষরের বেশি পরীক্ষা করেন না, সুতরাং এটি হে (এন)।

সংক্ষিপ্ত প্রমাণ: আপনি শুধুমাত্র অক্ষর পরীক্ষা যখন প্রত্যয় + 1 প্রত্যয় চেয়ে দীর্ঘতর হয় , এবং আপনি বন্ধ এবং পাওয়া আপনার সমাধান যদি প্রত্যয় + 1 প্রত্যয় তুলনায় খাটো (পরে আপনি কি জানেন প্রত্যয় এক আপনার জন্য চাওয়া যায়)। সুতরাং আপনি যখন প্রত্যয়ের ক্রমবর্ধমান (দৈর্ঘ্য-বর্ধমান) অনুক্রমে রয়েছেন তখন আপনি কেবল অক্ষরগুলি পরীক্ষা করেন। যেহেতু আপনি কেবল অতিরিক্ত অক্ষর পরীক্ষা করেন, তাই আপনি n অক্ষরের চেয়ে বেশি পরীক্ষা করতে পারবেন না।

সম্পাদনা 2: এই অ্যালগরিদম "" যদি প্রত্যয় অ্যারেতে দুটি প্রতিবেশী প্রত্যয় হয় এবং পূর্ববর্তীটি পরবর্তীটির চেয়ে ছোট হয় তবে পূর্ববর্তীটি পরবর্তীটির উপসর্গ "এর উপর নির্ভর করে। যদি এটি সত্য না হয় তবে দুঃখিত।

সম্পাদনা 3: না, এটি ধরে না। "আবাআ" এর প্রত্যয় টেবিল "এ", "আ", "আআ", "আবা", "বা" আছে। তবে হতে পারে এই চিন্তার এই লাইনটি শেষ পর্যন্ত সমাধানের দিকে নিয়ে যেতে পারে, আরও কিছু বিশদ আরও পরিশীলিত হতে হবে। প্রাথমিক প্রশ্নটি হ'ল কম অক্ষর পরীক্ষা করে পূর্বোক্ত তুলনা করা কোনওভাবেই সম্ভব কিনা, সুতরাং এটি ও (এন) পুরোপুরি, যা আমি একরকম বিশ্বাস করি যে এটি সম্ভব হতে পারে। আমি এখন বলতে পারি না কিভাবে, এখন।


0

সমস্যা:

লেক্সিকোগ্রাফিকভাবে সর্বনিম্ন সার্কুলার সাবস্ট্রিং এ জাতীয় সমস্ত ঘূর্ণনের সর্বনিম্ন লেকোগ্রাফিকাল ক্রমযুক্ত স্ট্রিংয়ের ঘূর্ণন আবিষ্কার করার সমস্যা finding উদাহরণস্বরূপ, "bbaaccaadd" এর অভিধানের ন্যূনতম ঘূর্ণন "aaccaaddbb" হবে।

সমাধান:

এও (এন) সময়ের অ্যালগরিদম জিন পিয়েরে ডুভাল (1983) দ্বারা প্রস্তাবিত হয়েছিল।

দুটি সূচক দেওয়া হয়েছে iএবং j, ডুভালের অ্যালগোরিদম দৈর্ঘ্যের স্ট্রিং সেগমেন্টের সাথে j - iশুরু হয় iএবং j( "ডুয়েল" নামে পরিচিত ) তুলনা করে । যদি index + j - iস্ট্রিংয়ের দৈর্ঘ্যের চেয়ে বেশি হয় তবে চারপাশে মোড়ানো দ্বারা বিভাগটি গঠিত হয়।

উদাহরণস্বরূপ, s = "বাবাবাবা", i = 5 এবং j = 7. বিবেচনা করুন, যেহেতু j - i = 2, i = 5 থেকে শুরু হওয়া প্রথম বিভাগটি "আব"। জে = 7 এ শুরু হওয়া দ্বিতীয় বিভাগটি চারপাশে মোড়ানো দ্বারা তৈরি করা হয়েছে এবং এটি "আব "ও রয়েছে। যদি উপরের উদাহরণের মতো স্ট্রিংগুলি ডিক্সিকোগ্রাফিকভাবে সমান হয় তবে আমরা বিজয়ী হিসাবে i থেকে শুরু করা একটি বেছে নেব, যা i = 5।

আমাদের একক বিজয়ী না হওয়া পর্যন্ত উপরের প্রক্রিয়াটি পুনরাবৃত্তি হয়েছে। যদি ইনপুট স্ট্রিংটি বিজোড় দৈর্ঘ্যের হয় তবে সর্বশেষ অক্ষরটি প্রথম পুনরাবৃত্তির তুলনা ছাড়াই জয়ী হয়।

সময়ের জটিলতা:

প্রথম পুনরাবৃত্তি প্রতিটি দৈর্ঘ্যের 1 (এন / 2 তুলনা) এর স্ট্রিংগুলির সাথে তুলনা করে, দ্বিতীয় পুনরাবৃত্তির দৈর্ঘ্য 2 (এন / 2 তুলনা) এর n / 2 স্ট্রিংগুলির সাথে তুলনা করতে পারে, এবং অন্যদিকে, i-th পুনরাবৃত্তির 2 টি স্ট্রিংয়ের তুলনা করা হয় দৈর্ঘ্য এন / 2 (এন / 2 তুলনা)। যেহেতু প্রতিবার বিজয়ীর সংখ্যা অর্ধেক হয়ে গেছে, পুনরাবৃত্তি গাছের উচ্চতা লগ (এন) হয়, সুতরাং এটি আমাদের ও (এন লগ (এন)) অ্যালগরিদম দেয়। ছোট এন এর জন্য এটি প্রায় ও (এন)।

স্পেস জটিলতা ও (এন) হ'ল, প্রথম পুনরাবৃত্তির পরে, আমাদের এন / 2 বিজয়ী, দ্বিতীয় পুনরাবৃত্তি এন / 4 বিজয়ী এবং আরও অনেক কিছু সঞ্চয় করতে হবে। (উইকিপিডিয়া দাবি করে যে এই অ্যালগরিদম ধ্রুবক স্থান ব্যবহার করে, আমি বুঝতে পারি না কীভাবে)।

এখানে একটি স্কাল বাস্তবায়ন; আপনার প্রিয় প্রোগ্রামিং ভাষায় রূপান্তর করতে নির্দ্বিধায়

def lexicographicallyMinRotation(s: String): String = {
 @tailrec
 def duel(winners: Seq[Int]): String = {
   if (winners.size == 1) s"${s.slice(winners.head, s.length)}${s.take(winners.head)}"
   else {
     val newWinners: Seq[Int] = winners
       .sliding(2, 2)
       .map {
         case Seq(x, y) =>
           val range = y - x
           Seq(x, y)
             .map { i =>
               val segment = if (s.isDefinedAt(i + range - 1)) s.slice(i, i + range)
               else s"${s.slice(i, s.length)}${s.take(s.length - i)}"
               (i, segment)
             }
             .reduce((a, b) => if (a._2 <= b._2) a else b)
             ._1
         case xs => xs.head
       }
       .toSeq
     duel(newWinners)
   }
 }

 duel(s.indices)
}

-1

আমি ও (N²) এর চেয়ে ভাল কিছু দেখতে পাচ্ছি না।

আপনার যদি এন পূর্ণসংখ্যার একটি তালিকা থাকে তবে আপনি ও (এন) তুলনাতে সবচেয়ে ছোট বাছাই করতে পারেন।

এখানে আপনার আকারের এন স্ট্রিংগুলির একটি তালিকা রয়েছে N (এগুলি নির্মাণের জন্য কোনও মূল্য ব্যয় হয় না, একটি স্ট্রিং তার সূচক সূচক দ্বারা সম্পূর্ণ নির্ধারিত হয়)। আপনি ও (এন) তুলনা মধ্যে সবচেয়ে ছোট চয়ন করতে পারেন। তবে প্রতিটি তুলনা ও (এন) বেসিক ক্রিয়াকলাপ। সুতরাং জটিলতাটি হ'ল O (N²)।

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