আমি বিশ্বাস করি যে সমস্ত প্রশ্নের জন্য লোগারিথমিক সময় অর্জনযোগ্য। মূল ধারণাটি হ'ল একটি বিরতিযুক্ত গাছ ব্যবহার করা, যেখানে গাছের প্রতিটি নোড সূচকের বিরতিতে মিলিত হয়। আমি ডেটা স্ট্রাকচারের একটি সহজ সংস্করণ দিয়ে শুরু করে মূল ধারণাগুলি তৈরি করব (যা অন্যান্য অপারেশনগুলি নয় তবে পেতে ও সেট করতে সহায়তা করে), তারপরে অন্যান্য বৈশিষ্ট্যগুলিকে সমর্থন করার জন্য বৈশিষ্ট্যগুলিও যুক্ত করব।
একটি সাধারণ স্কিম (সহায়তা পেতে এবং সেট করা সমর্থন করে তবে সংযুক্ত বা ছুরিকাঘাত নয়)
বলে যে একটি বিরতি হয় ফ্ল্যাট যদি ফাংশন চ উপর ধ্রুবক [ একটি , খ ] , অর্থাত, যদি চ ( একটি ) = চ ( একটি + + 1 ) = ⋯ = চ ( খ ) ।[a,b]f[a,b]f(a)=f(a+1)=⋯=f(b)
আমাদের সাধারণ ডেটা স্ট্রাকচারটি একটি অন্তরবৃক্ষ হবে। অন্য কথায়, আমাদের কাছে একটি বাইনারি গাছ রয়েছে, যেখানে প্রতিটি নোড একটি অন্তর (সূচকের) সাথে মিলে যায়। আমরা সংশ্লিষ্ট ব্যবধান সংরক্ষণ করব প্রতিটি নোডের মধ্যে বনাম গাছের। প্রতিটি পাতা সমতল ব্যবধানের সাথে সামঞ্জস্য করবে এবং সেগুলি এমনভাবে সাজানো হবে যাতে বাম থেকে ডানে পাতাগুলি পড়া আমাদের ধারাবাহিক সমতল অন্তরগুলির ক্রম দেয় যা বিচ্ছিন্ন এবং যার ইউনিয়ন সমস্ত [ 1 , n ] । অভ্যন্তরীণ নোডের ব্যবধানটি তার দুই সন্তানের অন্তরগুলির মিলন হবে। এছাড়াও, প্রতিটি গাছের পাতা নোড ℓ আমরা মান সংরক্ষণ করবে ভী ( ℓ )I(v)v[1,n]ℓV(ℓ)ফাংশনের ব্যবধান উপর আমি ( ℓ ) এই নোডের সংশ্লিষ্ট (নোট যে এই ব্যবধান, ফ্ল্যাট, তাই চ ব্যবধান উপর ধ্রুবক, তাই আমরা একটি একক মান সংরক্ষণ চ প্রতিটি গাছের পাতা নোডের মধ্যে)।fI(ℓ)ff
সমানভাবে, আপনি কল্পনা করতে পারেন যে আমরা সমতল অন্তরগুলিতে ভাগ করি এবং তারপরে ডেটা স্ট্রাকচার হ'ল বাইনারি অনুসন্ধান ট্রি যেখানে কীগুলি সেই অন্তরগুলির বাম প্রান্ত হয়। পাতাগুলি সূচকের কিছু পরিসরে চ এর মান ধারণ করে যেখানে চ স্থির থাকে contain[1,n]ff
তা নিশ্চিত করার জন্য বাইনারি ট্রি সুষম থাকে, মান পদ্ধতি ব্যবহার করুন অর্থাত, তার গভীরতা (যেখানে মি গন্য গাছে পাতার বর্তমান নম্বর)। অবশ্যই, m ≤ n , তাই গভীরতা সর্বদা সর্বাধিক O ( lg n ) । এটি নীচে সহায়ক হবে।O(lgm)mm≤nO(lgn)
আমরা এখন নীচে নীচে গেট এবং সেট অপারেশনগুলিকে সমর্থন করতে পারি:
সহজ: আমরা গাছ তর্ক পাতার যার ব্যবধান রয়েছে এটি আমি । এটি মূলত একটি বাইনারি অনুসন্ধান ট্রিকে অনুসরণ করছে। যেহেতু গভীরতা হে ( LG এন ) , দৌড়ানো সময় হে ( LG এন ) ।get(i)iO(lgn)O(lgn)
জটিল। এটি এর মতো কাজ করে:set([a,b],y)
[a0,b0]aa0<a[a0,a−1][a,b0]
[a1,b1]bb<b1[a1,b][b+1,b1]
[a,b]O(lgn)O(lgn)y
শেষ অবধি, যেহেতু আমরা গাছের আকার পরিবর্তন করেছি, আমরা গাছটিকে ভারসাম্য বজায় রাখতে (গাছকে ভারসাম্য বজায় রাখার জন্য কোনও মানক কৌশল ব্যবহার করে) প্রয়োজনীয় ঘোরাঘুরি করব।
O(lgn)O(lgn)O(lgn)
O(lgn)O(lgmin(n,s))s
অ্যাডের জন্য সমর্থন যোগ করা হচ্ছে
আমরা উপরের ডেটা কাঠামোটি সংশোধন করতে পারি যাতে এটি অ্যাড অপারেশনটিকেও সমর্থন করতে পারে। বিশেষত, পাতাগুলিতে ফাংশনের মান সংরক্ষণ করার পরিবর্তে, এটি নোডের সেটগুলিতে সঞ্চিত সংখ্যার যোগ হিসাবে উপস্থাপিত হবে।
আরো সঠিকভাবে, মান ইনপুট এ ফাংশনের গাছের পাতা যার ব্যবধান রয়েছে নিচে গাছের শিকড় থেকে পথে নোড সঞ্চিত মানের সমষ্টি হিসাবে আদায় করা হবে । প্রতিটি নোডে আমরা একটি মান সঞ্চয় করব ; যদি পাতার পূর্বপুরুষ প্রতিনিধিত্ব (গাছের পাতা নিজেই সহ), তারপর এ ফাংশনের মান হতে হবে ।f(i)iivV(v)v0,v1,…,vkvkI(vk)V(v0)+⋯+V(vk)
উপরে বর্ণিত কৌশলগুলির একটি বৈকল্পিক ব্যবহার করে গেট এবং সেট অপারেশনগুলিকে সমর্থন করা সহজ। মূলত, যখন আমরা গাছটিকে নীচের দিকে অতিক্রম করি আমরা মানগুলির চলমান যোগফলের উপর নজর রাখি, যাতে প্রতিটি নোড জন্য ট্র্যাভারসাল ঘুরে দেখা যায়, আমরা শিকড় থেকে পর্যন্ত পাথের নোডের মানগুলির যোগফলটি জানতে পারি । একবার আমরা এটি করার পরে, উপরে বর্ণিত গেট এবং সেট বাস্তবায়নের সহজ সমন্বয়গুলি যথেষ্ট willxx
এবং এখন আমরা দক্ষতার সাথে সমর্থন করতে পারি । প্রথমে, আমরা গাছের নোডের কিছু সেট নোডের সাথে সামঞ্জস্যপূর্ণ অন্তরগুলির হিসাবে বিরতিটি প্রকাশ করি প্রয়োজনে বাম প্রান্ত বিন্দুতে একটি নোড বিভক্ত করে এবং ডান প্রান্তে ) ঠিক যেমনটি সেট অপারেশনের 1-3 পদক্ষেপে সম্পন্ন হয়েছে। এখন, আমরা কেবলমাত্র নোডের প্রত্যেকটিতে সঞ্চিত যুক্ত করি । (আমরা তাদের বংশধরদের মুছে ফেলি না))add([a,b],δ)[a,b]O(lgn)O(lgn)δO(lgn)
এটি অপারেশন প্রতি সময়ে পেতে, সেট করতে এবং যুক্ত করতে সহায়তা করার একটি উপায় সরবরাহ করে। প্রকৃতপক্ষে, অপারেশন প্রতি চলমান সময় হ'ল যেখানে সেট অপারেশনের সংখ্যা এবং অ্যাড অপারেশনের সংখ্যাকে গণনা করে।O(lgn)O(lgmin(n,s))s
ছুরিকাঘাত অপারেশন সমর্থন
ছুরিকাঘাতে জিজ্ঞাসা সমর্থন করা সবচেয়ে চ্যালেঞ্জিং। নিম্নলিখিত অতিরিক্ত আক্রমণকারী সংরক্ষণের জন্য মূল ধারণাটি হবে উপরোক্ত ডেটা কাঠামোটি সংশোধন করা:
(*) ব্যবধান প্রতিটি গাছের পাতা সংশ্লিষ্ট একটি সর্বোচ্চ ফ্ল্যাট ব্যবধান হয়।I(ℓ)ℓ
এখানে আমি যে একটি বিরতি হয় সর্বোচ্চ ফ্ল্যাট ব্যবধান যদি (ঝ) সমতল, এবং (ii) কোন ধারণকারী ব্যবধান সমতল (অন্য কথায়, সব জন্য সন্তোষজনক , হয় বা সমতল নয়)।[a,b][a,b][a,b]a′,b′1≤a′≤a≤b≤b′≤n[a′,b′]=[a,b][a′,b′]
এটি ছুরতাইয়ের কাজটি কার্যকর করা সহজ করে তোলে:
- stab(i) পাতাগুলি খুঁজে পায় যার বিরতিতে থাকে এবং তারপরে সেই বিরতি ফিরে আসে।i
তবে, এখন আমাদের আক্রমণটি (*) বজায় রাখতে সেটটি পরিবর্তন করতে হবে এবং অপারেশন যুক্ত করতে হবে। প্রতিবার যখনই আমরা একটি পাতা দুটি ভাগে ভাগ করি তখন আমরা কিছু আক্রমণকারীকে লঙ্ঘন করতে পারি যদি কিছু সংলগ্ন জোড়া-পাতার ব্যবধানে এর একই মান থাকে । ভাগ্যক্রমে, প্রতিটি সেট / অ্যাড অপারেশন সর্বাধিক 4 টি নতুন পাতার অন্তর যুক্ত করে। এছাড়াও, প্রতিটি নতুন ব্যবধানের জন্য, এর বাম এবং ডানদিকে তাত্ক্ষণিক পাতার বিরতি খুঁজে পাওয়া সহজ। অতএব, আমরা বলতে পারি যে আক্রমণকারীকে লঙ্ঘন করা হয়েছিল কিনা; যদি এটি ছিল, তবে আমরা সংলগ্ন বিরতিগুলিকে একীভূত করি যেখানে এর একই মান রয়েছে। ভাগ্যক্রমে, দুটি সংলগ্ন বিরতি মার্জ করা ক্যাসকেডিং পরিবর্তনগুলি ট্রিগার করে না (সুতরাং আমাদের একীভূতকরণটি আক্রমণকারীটির অতিরিক্ত লঙ্ঘন চালু করেছিল কিনা তা খতিয়ে দেখার দরকার নেই)। সর্বোপরি, এর মধ্যে পরীক্ষা করা জড়িতf 12 = O ( 1 ) ও ( এলজি এন )ff12=O(1)অন্তর জোড়া এবং সম্ভবত তাদের মার্জ। পরিশেষে, যেহেতু কোনও সংহতকরণ গাছের আকার পরিবর্তন করে, যদি এটি ভারসাম্য-আক্রমণকারীদের লঙ্ঘন করে তবে গাছকে ভারসাম্য বজায় রাখতে প্রয়োজনীয় কোনও ঘূর্ণন সঞ্চালন করুন (বাইনারি গাছগুলিকে ভারসাম্য বজায় রাখার জন্য মানক কৌশল অনুসরণ করুন)। মোট, এটি সেট / অ্যাড অপারেশনগুলিতে সর্বাধিক অতিরিক্ত কাজ যুক্ত করে।O(lgn)
সুতরাং, এই চূড়ান্ত ডেটা কাঠামোটি চারটি ক্রিয়াকলাপ সমর্থন করে এবং প্রতিটি ক্রিয়াকলাপের চলমান সময় হ'ল । আরও সুনির্দিষ্ট প্রাক্কলন হ'ল অপারেশন প্রতি সময়, যেখানে সংখ্যার সংখ্যা গণনা করে এবং অপারেশন যুক্ত করে।ও ( এলজি মিনিট ( এন , গুলি ) ) এসO(lgn)O(lgmin(n,s))s
বিভাজন চিন্তাভাবনা
ভাই, এটি বেশ জটিল পরিকল্পনা ছিল। আমি আশা করি আমি কোন ভুল করি নি এই সমাধানের উপর নির্ভর করার আগে দয়া করে আমার কাজটি সাবধানতার সাথে পরীক্ষা করে দেখুন।
add
এর সাবিনটারভাল সংখ্যায় লিনিয়ার হবে ; আপনি কি অবিচ্ছিন্ন " + δ " নোড, অলসভাবে সংক্ষেপিত একটি স্প্লে গাছ সম্পর্কে চিন্তা করেছেন ?