এমন কোনও 'স্ট্রিং স্ট্যাক' ডেটা স্ট্রাকচার রয়েছে যা এই স্ট্রিং অপারেশনগুলিকে সমর্থন করে?


28

আমি একটি ডেটা স্ট্রাকচারের সন্ধান করছি যা একটি অক্ষর সেট over এর উপরের স্ট্রিংগুলির একটি সেট সঞ্চয় করে , নিম্নলিখিত ক্রিয়াকলাপ সম্পাদন করতে সক্ষম। স্ট্রিং এস এর সেট স্টোর করে ডেটা স্ট্রাকচার হিসাবে আমরা ডি ( এস ) কে চিহ্নিত করি ।ΣD(S)S

  • Add-Prefix-Setউপর : প্রদত্ত কিছু সেট টি এর (সম্ভবত খালি) স্ট্রিং, যার আকার একটি ধ্রুবক দ্বারা বেষ্টিত এবং কার স্ট্রিং লেন্থ একটি ধ্রুবক, এর বিনিময়ে দ্বারা বেষ্টিত করা হয় ডি ( { T গুলি | টন টি , গুলি এস } ) । এই উভয় সীমাবদ্ধ ধ্রুবক বিশ্বব্যাপী: সমস্ত ইনপুট টি এর জন্য তারা একই ।D(S)TD({ts | tT,sS})T
  • Get-Prefixesঅন : ফিরুন { | a s S , a Σ } । লক্ষ্য করুন আমি সত্যিই কিছু মনে না করেন কি কাঠামো এই সেট জন্য ব্যবহার করা হয়, যতদিন আমি এটির সামগ্রীগুলি গনা করতে হে ( | Σ | ) সময়।D(S){a | asS,aΣ}O(|Σ|)
  • Remove-Prefixesউপর : রিটার্ন ডি ( { গুলি | একটি গুলি এস , একটি Σ } )D(S)D({s | asS,aΣ})
  • Merge: প্রদত্ত এবং ডি ( টি ) , রিটার্ন ডি ( এস টি )D(S)D(T)D(ST)

এখন, আমি সত্যিই সময়ে এই সমস্ত অপারেশনগুলি করতে চাই , তবে আমি এমন কাঠামোর সাথে ভাল যা এই সমস্ত অপারেশনগুলি ( এন ) সময়ে করে, যেখানে এন দীর্ঘতম স্ট্রিংয়ের দৈর্ঘ্য is কাঠামো। একত্রীকরণ ক্ষেত্রে, আমি চাই ( এন 1 + + N 2 ) চলমান সময়, যেখানে n হল 1 হয় এন প্রথম এবং জন্য এন 2 এন দ্বিতীয় গঠন জন্য।O(1)o(n)no(n1+n2)n1nn2n

একটি অতিরিক্ত প্রয়োজন হ'ল কাঠামোটি অপরিবর্তনীয় বা কমপক্ষে যে উপরের ক্রিয়াকলাপগুলি 'নতুন' স্ট্রাকচারগুলি ফিরিয়ে দেয় যা পুরানোগুলিকে নির্দেশ করে এখনও আগের মতো কাজ করে।

Orশ্বর্যকরণ সম্পর্কে একটি নোট: এটি ভাল, তবে আপনাকে অধ্যবসায়ের জন্য নজর রাখতে হবে। আমি যেমন সমস্ত সময় পুরানো কাঠামোগুলি পুনরায় ব্যবহার করি, একই কাঠামোর কিছু নির্দিষ্ট সেট অপারেশনের সাথে যদি আমি কোনও খারাপ পরিস্থিতিতে আঘাত করি তবে আমি সমস্যায় পড়ব (সুতরাং এটি তৈরি করা নতুন কাঠামো উপেক্ষা করে)।

আমি যে পার্সিং অ্যালগরিদমে কাজ করছি তাতে আমি এমন কাঠামো ব্যবহার করতে চাই; উপরের কাঠামোটি আমার কাছে আলগোরিদমের জন্য প্রয়োজন চেহারাটি ধারণ করবে।

আমি ইতিমধ্যে একটি ট্রাই ব্যবহার করে বিবেচনা করেছি , তবে মূল সমস্যাটি হ'ল কীভাবে দক্ষতার সাথে মার্জ করতে হয় তা আমি জানি না। যদি স্ট্রিংগুলির সেটটিতে Add-Prefix-Setকেবলমাত্র একক-অক্ষরযুক্ত স্ট্রিং থাকে, তবে আপনি এই সেটগুলি একটি স্ট্যাকে সঞ্চয় করতে পারেন যা আপনাকে প্রথম (তিন) ক্রিয়াকলাপের জন্য চলমান সময় দেয়। যাইহোক, এই পদ্ধতিরটি মার্জ করার জন্যও কাজ করে না।O(1)

পরিশেষে, নোট করুন আমি কারকগুলিতে আগ্রহী নই : আমার যত্নের জন্য এটি স্থির।|Σ|


স্ট্রিংগুলি কি কেবল অপারেশন দ্বারা নির্মিত Add-Prefix-Setবা আপনি একটি নির্বিচারে স্ট্রিং সেট দিয়ে শুরু করেন?
জো

2
n1=n2STo(n1+n2)

আপনি এটিতে একটি একক-চর স্ট্রিং দিয়ে একটি সেট দিয়ে শুরু করুন, তবে খালি স্ট্রিংটিও ঠিক আছে (আপনি এটি কেবল Add-Prefix-Setএটি করতে পারেন )
অ্যালেক্স টেন ব্রিংক

@ জো: এটি একটি ভাল প্রশ্ন - আমি একীভূতকরণের ক্রিয়াকলাপটি নিশ্চিত করতে শুরু করি যে এই জাতীয় কাঠামো পাওয়ার কোনও সম্ভাবনা অনেকটাই ভেঙে যায় ...
অ্যালেক্স টেন ব্রিঙ্ক

(n1,n2)

উত্তর:


5

আমি বেশ কিছু সময়ের জন্য ভেবেছিলাম, তবে ত্রি-জাতীয় ডিএজি কাঠামোর মধ্যে আপনার সমস্ত ক্রিয়াকলাপ সবচেয়ে বোকা সম্ভব উপায়ে করতে সমস্যাটি খুঁজে পেল না:

অ্যাড-উপসর্গ সেট

T

O(|T|)

মার্জ

দুটি কাঠামোর শিকড় একত্রিত করুন: সমস্ত নোডকে প্রথম নোডের দ্বিতীয় মূলের বাচ্চাদের নোড তৈরি করুন। আপনার এখন একই অক্ষরটি একই নোড থেকে আগত একাধিক প্রান্ত চিহ্নযুক্ত থাকতে পারে।

O(1)

মূলের অলস আপডেট

  1. O(|Σ|)O(1)
  2. O(1)

পান-উপসর্গ

অলস মূলটি আপডেট করুন। এখন মূলের সমস্ত বাচ্চাদের সন্ধান করুন এবং তাদের কাছে প্রান্তগুলিতে চিঠির সেট প্রতিবেদন করুন।

O(|Σ|)

সরান-উপসর্গ

অলস মূলটি আপডেট করুন। সমস্ত শিশুকে একত্রিত করুন এবং এই একত্রিত হওয়ার ফলাফলের জন্য রুট পয়েন্টারটি সেট করুন। অলস নতুন শিকড় আপডেট।

O(|Σ|)

অধ্যবসায়

O(1)O(|Σ|)O(logN)N

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