দ্রুত তালিকা ম্যানিপুলেশন এবং অর্ডার ক্যোয়ারীগুলির জন্য কোনও ডেটা কাঠামো রয়েছে কি?


9

আমরা একটি সেট আছে, সেট থেকে উপাদানের তালিকা, । থেকে প্রতিটি উপাদান মধ্যে একটি তালিকাতে প্রদর্শিত হবে । আমি একটি ডেটা কাঠামো খুঁজছি যা নিম্নলিখিত আপডেটগুলি সম্পাদন করতে পারে:LN={1,2,3,...,n}NL

  1. concat(x,y) : ধারণকারী তালিকা concatenates তালিকা ধারণকারী শেষ সম্মুখেরyx

  2. split(x) : সরাসরি পরে তালিকাটি বিভক্ত করেxx

এটি নিম্নলিখিত প্রশ্নগুলি সম্পাদন করা প্রয়োজন:

  1. follows(x,y) : আয় যদি এবং একই তালিকা রয়েছে এবং পরে আসে (কিন্তু অগত্যা সংলগ্ন )truexyyxx

  2. first(x) : ধারণকারী তালিকার প্রথম উপাদানটি প্রদান করেx

  3. next(x) : পরবর্তী পরের উপাদানটি প্রদান করে x ধারণকারী তালিকায় x

আমি ইতিমধ্যে একটি ডেটা স্ট্রাকচার নিয়ে এসেছি যা এই আপডেটগুলি সম্পাদন করে O(lg2(n)) এবং প্রশ্নগুলি O(lg(n))সময়। ইতিমধ্যে কোনও ডেটা স্ট্রাকচার রয়েছে কিনা তা নিয়ে আমি বেশিরভাগ আগ্রহী যা এটি করতে পারে (আশা করি দ্রুত?)

অনুপ্রেরণা: মূলযুক্ত নির্দেশিত বনাঞ্চলগুলিকে এই দুটি তালিকার দুটি দিয়ে উপস্থাপন করা যেতে পারে এবং তারা এ জাতীয় বনাঞ্চলগুলিতে পুনঃব্যবহারের দ্রুত গণনা করার অনুমতি দেয়। আমি দেখতে চাই যে তারা কী কী ব্যবহার করতে পারে এবং যদি এই সমস্ত কিছু ইতিমধ্যে জানা থাকে।

উত্তর:


11

আপনার পূর্ণসংখ্যাগুলি এড়িয়ে যান তালিকায় Keep সাধারণ বাদ দেওয়া তালিকাগুলি কী দ্বারা অর্ডার করা হয়, তবে আমরা কেবল সেগুলি অনুক্রমের উপস্থাপনা হিসাবে ব্যবহার করব। অতিরিক্তভাবে, আকারের পয়েন্টারগুলির একটি অ্যারে বজায় রাখুনn। অ্যারের প্রতিটি উপাদান একটি এড়িয়ে যাওয়া তালিকার নোডের দিকে নির্দেশ করবে। আমি বিশ্বাস করি এটি সমর্থন করেnext ভিতরে O(1) এবং অন্যান্য সমস্ত অপারেশন O(lgn)

বিশেষ করে:

  • concatআইএন বা splitদুটি স্কিপ তালিকার টিং লাগে O(lgn) সময় এবং তাই সর্বাধিক অবৈধ O(lgn) পয়েন্টার।
  • next পাতার স্তরে সামনের দিকে এগিয়ে যাওয়ার পয়েন্টারটি অনুসরণ করে O(1) সময়।
  • first লাগে O(lgn)সময়: আপনি আটকে না যাওয়া পর্যন্ত পয়েন্টারগুলি অনুসরণ করুন, এবং তারপর বাম পয়েন্টারটি অনুসরণ করুন। আপনি যখন আর কোনও বাম পয়েন্টার অনুসরণ করতে পারবেন না, আপনি আপনার এড়িয়ে যাওয়ার তালিকার প্রধান পয়েন্টারে রয়েছেন। পাতার নিচে পয়েন্টারগুলি অনুসরণ করুন, তারপরে একটি ফরোয়ার্ড পয়েন্টার। এটি তালিকার প্রথম উপাদান।
  • followsকিছুটা কৌশলযুক্ত। হিসাবে এগিয়ে যানfirst জন্য y, তবে আপনি যে মানগুলিতে আটকা পড়েছেন তার একটি তালিকা রেকর্ড করুন (এটি, যেখানে আপনি আর কোনও পয়েন্টার অনুসরণ করতে পারবেন না)। এই তালিকাটিকে আমরা "ট্রেস" রেকর্ড করব। একই জন্যx, তবে ডান পয়েন্টারগুলি অনুসরণ করুন যখন আপনি আটকে যান, বাম না। যদিx তার আগে বসেছে y, তাদের চিহ্নগুলি ছেদ করবে। ট্রেসগুলি আকারেরO(lgn)। যদি ট্রেসের প্রতিটি উপাদান আটকে স্তরের সাথে টীকাযুক্ত হয় তবে আমরা সময়মতো ছেদটি পরীক্ষা করতে পারিO(lgn)

next সবচেয়ে খারাপ অবস্থা O(1)অন্যরা হলেন O(lgn) উচ্চ সম্ভাবনা সহ । এগুলি ডিটারমিনিস্টিক স্কিপ তালিকাগুলি ব্যবহার করে সবচেয়ে খারাপ পরিস্থিতি তৈরি করা যেতে পারে।

আমি মনে করি concat তৈরি হতে পারে O(lglgn)লিফ-লেভেল-লিঙ্কড (2,5) টি গাছ ব্যবহার করে এবং মেরুদণ্ড বুস্ট্র্যাপিং করে বুটস্ট্র্যাপিং ট্রিকের জন্য, কাপলান এবং টারজানের " কেটনেবল সাজানো তালিকার বিশুদ্ধভাবে কার্যকরী উপস্থাপনা " দেখুন।


শীতল। আমি তালিকাগুলি বাদ দেওয়ার বিষয়ে চিন্তা করছিলাম তবে কী কীভাবে সম্পর্কিত কী মানগুলি অনুসরণ করা যায় তা বেশ দেখতে পেলাম না।
সাশো নিকোলভ

এটা অসাধারণ; আমি দেখতে পাচ্ছি কীভাবে সমস্ত আপডেটগুলি নির্মূল করা যায়O(lg(n)), যা ভাল. ও (এলজি এলজি (এন)) বোঝার জন্য আমাকে পড়তে হবে। @ Jbapple পোস্টের জন্য ধন্যবাদ।
bbejot

1

অন্তত সাধারণ পূর্বপুরুষ : সমস্যা গতিশীল মূলী বৃক্ষ reachability সমস্যা সমাধানের জন্য, তাই আমি কল্পনা আপনি নিম্নলিখিত আগ্রহী হতে হবে ব্যবহার করা যেতে পারে খোঁজার জন্য সাধারণ পূর্বপুরুষদের নিকটবর্তী ডায়নামিক গাছ মধ্যে সর্বাপেক্ষা কাম্য আলগোরিদিম , Alstrup এবং Thorup দ্বারা। এই কাগজ একটি সময় সীমাবদ্ধ দেয়O(n+mloglogn) জন্য n লিঙ্ক এবং m এনসিএ একটি পয়েন্টার মেশিনে অনুসন্ধান করে।


রেফারেন্সের জন্য আপনাকে ধন্যবাদ। নিকটতম সাধারণ পূর্বপুরুষের সমস্যা অবশ্যই গাছগুলিতে পুনরুদ্ধার সমাধান করে। আপনি যে কাগজটির সাথে লিঙ্ক করেছেন সেগুলি সমস্ত ক্রিয়াকলাপ সহ একটি ইনক্রিমেন্টাল ট্রি বর্ণনা করেO(lglg(n))সময়। আমি ভাবছি এটির সাথে পুরোপুরি গতিশীল গাছগুলির সাথেও কাজ করা উন্নত করা যায় কিনা।
bbejot
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.