প্রতিটি সেট অন্য সেট অস্তিত্ব একটি রেকর্ড বজায় রাখে, এবং আপনি একটি মোট থাকে তাহলে সেট, আপনি সহজেই যে কোন ডাটা স্ট্রাকচার একটি সংগ্রহ জন্য (চালু করতে পারেন যেমন বাইনারি অনুসন্ধান গাছ, ইত্যাদি ) এক মধ্যে তোমাদের আহরণ থাকতে পারে যেখানে সময় ও ( লগ ) এর মধ্যে দুটি সেট ছেদ করার একটি উপাদান ।s>0O(logs)
পুরোপুরি অর্ডার করা সেট থেকে প্রতিটি সেটের একটি অনন্য শনাক্তকারী থাকা উচিত। যদি আপনি স্পষ্টভাবে আপনার সেটগুলির নাম রাখেন তবে সনাক্তকারীটি কেবল সূচক হতে পারে।S1,S2,…
আপনার সেটগুলির একটি "রেজিস্ট্রি" প্রয়োগ করা উচিত; একটি ডেটা স্ট্রাকচার যা আপনার সংজ্ঞায়িত সমস্ত সেটের সংগ্রহ বজায় রাখে। সহজ পুনরুদ্ধারের ( যেমন আপনি সেটটি মুছতে চান) এবং সেটের লিনিয়ার-সময় ট্র্যাভারসালকে অনুমতি দেওয়ার জন্য রেজিস্ট্রিটি অনুসন্ধান-গাছের ডেটা কাঠামো হিসাবে প্রয়োগ করা উচিত ।
প্রতিটি সেট অন্য সেটগুলির প্রত্যেকটির একটি "সূচক" বজায় রাখে - সেগুলির অনুলিপি নয় , বরং একটি ডেটা স্ট্রাকচার যা অন্য সেটগুলির লেবেল দ্বারা সূচিযুক্ত হয়। এই সূচকটি বজায় রাখতে ব্যবহৃত হবে, প্রতিটি সেট এস কে , এস জে ∩ এস কে এর সমস্ত উপাদানের একটি বাইনারি অনুসন্ধান গাছ । (দুটি সেট এস জে এবং এস কে সেই অনুসন্ধান গাছের একটি অনুলিপি ভাগ করে)SjSkSj∩SkSjSk
আরম্ভ
একটি সেটের সূচনা নিয়ে গঠিত হে ( 1 ) অপারেশন তার উপাদানের গাছ আরম্ভ করতে, হে ( গুলি ) অপারেশন হিসাবে আপনি আরম্ভ (রেজিস্ট্রি থেকে কপি করার) সেট জন্য সূচক টি , এবং হে ( গুলি লগ গুলি ) অপারেশনগুলি যখন আপনি অন্য সেটগুলির প্রতিটি সূচকের এস জেতে টি যুক্ত করতে রেজিস্ট্রিটি অতিক্রম করেন । টি এর সূচীতে আমরা অনুসন্ধান গাছ তৈরি করি যা টি ∩ এস জ = ∅ উপস্থাপন করে ∅T=∅O(1)O(s)TO(slogs)TSjTT∩Sj=∅অন্যান্য সেট ; আমরা এস জে এর সূচকের জন্য একই পয়েন্টারটি অনুলিপি করি ।SjSj
একটি সেট টিতে একটি উপাদান যুক্ত করাT
টি টিতে কিছু যোগ করার জন্য যথারীতি সময় ও ( লগ এন টি ) লাগে , যেখানে এন টি = | টি | । আমরা সদস্যপদ জন্য পরীক্ষার এক্স অন্যান্য সেটের প্রতিটি এস 1 , S 2 , ... , যা সময় লাগে হে ( লগ ঢ এস 1 + + লগ ইন করুন এন এস 2 + + ⋯ ) ⊆ হে ( গুলি লগ এনx∈VTO(lognT)nT=|T|xS1,S2,… যেখানে এন = | ভি | মহাবিশ্বের আকার (অথবা বৃহত্তম সেট হয় এস ঞ ) এবং গুলি রেজিস্ট্রি মধ্যে সেট সংখ্যা। প্রতিটি সেট জন্য এস ঞ যেমন যে এক্স ∈ এস ঞ , এছাড়াও সন্নিবেশ এক্স সেট জন্য সূচক মধ্যে এস ঞ ∩ টি । প্রতিটি যেমন সেট জন্য এস ঞ , এই নেয় হে ( লগ গুলি + + লগ এন টি ) সন্ধান করার সময়, এস ঞ
O(lognS1+lognS2+⋯)⊆O(slogn),
n=|V|SjsSjx∈SjxSj∩TSjO(logs+lognT)Sjএর সূচক
এবং সন্নিবেশ করতে
এক্স মধ্যে
এস ঞ ∩ টি ; সমস্ত সেট জুড়ে
এস 1 , এস 2 , … এটি সময় নেবে
O ( গুলি লগ s + গুলি লগ এন টি ) । আমরা যদি যে অনুমান করা সেট সংখ্যা
এস ঞ অনেক মহাবিশ্বের আকার কম
ভী (যেমন, যদি আমরা অনুমান
গুলি « এন ), উপাদান সন্নিবেশ জন্য মোট সময় তারপর
হে ( গুলি লগ এন )TxSj∩TS1,S2,…O(slogs+slognT)SjVs≪nO(slogn)।
আপনি যদি সেটগুলিতে সদৃশ না হয়ে থাকেন, তবে অন্যান্য সেট টি এর জন্য সদস্যপদ পরীক্ষা এবং সন্নিবেশকে রেখে আমরা ইতিমধ্যে ক্ষেত্রে সময় বাঁচাতে পারি । X ইতিমধ্যে উপস্থিত ক্ষেত্রে "সন্নিবেশ" কেবলমাত্র O ( লগ এন টি ) সময় নেয় ।x∈STxO(lognT)
মোড় পরীক্ষা
দুটি সেট এবং এস কে ছেদ করে কিনা তাড়াতাড়ি মূল্যায়নের জন্য প্রতিটি সেটের সূচকটি যথাযথভাবে বজায় রাখা হয় । একটি সেট জন্য এস ঞ , সহজভাবে সেট তার সূচক চেক করে এস ট , আমরা কেবল সময় নির্ধারণ করতে পারি না হে ( লগ গুলি ) হোক বা না হোক S ঞ ছেদ করে এস ট , কিন্তু আমরা একটি বাইনারি সমগ্র সেট ধারণকারী গাছ উদ্ধার করতে পারেন এস জ ∩ এস কে ।এসঞএসটএসঞএসটও (logগুলি )এসঞএসটএসঞ। এসট
উপাদান অপসারণ
একটি উপাদান মুছে ফেলার জন্য একটি সেট থেকে টি , আমরা এটা না শুধুমাত্র অনুসন্ধানের জন্য গাছ থেকে অপসারণ টি নিজেই কিন্তু ছেদ প্রতিটি এস ঞ ∩ টি সেটের জন্য এস ঞ তার সূচক। এটি সময় নেবে O ( গুলি লগ এন টি ) , যেখানে n টি = | টি | ।এক্সটিTSj∩TSjO(slognT)nT=|T|
বিলোপ সেট করুন
রেজিস্ট্রি অনুসন্ধানের ওভারহেডের কারণে, আপনার যদি অনেক সেট থাকে তবে একবার সেগুলির আর প্রয়োজন হয় না সেগুলি মুছে ফেলা বাঞ্ছনীয়। সমগ্র রেজিস্ট্রি ঢোঁড়ন মাধ্যমে আমরা মুছে ফেলতে পারবেন সব অন্যান্য সেট সূচি থেকে এস ঞ সময় হে ( গুলি এন টি ) , সার্চ প্রতিনিধিত্বমূলক গাছ মোছার খরচ দ্বারা প্রভাবিত এস ঞ ∩ টি অন্যান্য সেটের প্রতিটি এস ঞ , যেখানে এন টি = | টি | ।SSjO(snT)Sj∩TSjnT=|T|
মন্তব্য
যদি আপনি কেবলমাত্র ধ্রুবক সেটগুলি প্রয়োগ করার প্রত্যাশা করেন, তবে উপরের রান-সময়গুলি হ্রাস করে:
সূচনা: O(1)
উপাদান সন্নিবেশ: O(logn)
ছেদ পরীক্ষা (এবং ছেদটি পুনরুদ্ধার): O(1)
উপাদান অপসারণ: O(lognT)
মুছে ফেলা সেট: O(nS)
যেখানে বৃহত্তম সেটের আকার এবং n টি = | টি | সেট টি যা আপনার উপর কাজ করছে।nnT=|T|T
আপনি যদি সেটগুলি আশা করেন, যেখানে ভি আপনার মহাবিশ্ব, আপনি যদি এই লাইনগুলি সাব-লিনিয়ার সময়ে পরিচালনা করতে চান তবে আপনার একটি আলাদা ডেটা স্ট্রাকচারের প্রয়োজন হতে পারে। তবে, আপনার যদি এমন কয়েকটি সেট রয়েছে যার ছেদগুলি আপনি জানেন যে আপনি কখনই পরীক্ষা করতে পারবেন না, তবে আপনি সেটের জন্য সূচকগুলির আকার হ্রাস করতে সক্ষম হবেন (যে কোনও ছেদেলটি আপনি পরীক্ষা করবেন এমন কোনও সেট না করে) বা একাধিক রেজিস্ট্রি ব্যবহার করতে পারেন ( সেটগুলির প্রতিটি সংগ্রহের জন্য একটি যার ছেদটি আপনি পরীক্ষা করতে পারেন)। প্রকৃতপক্ষে, কোনও রেজিস্ট্রি কেবল তখনই কার্যকর যখন আপনি প্রতিটি জোড় সূচকে একে অপরের রেকর্ড রয়েছে কিনা তা নিশ্চিত করার কেন্দ্রীয়ভাবে নিয়ন্ত্রণ চান: এটি কিছু ক্ষেত্রে ব্যবহারিক হতে পারে, একটি সেট এসের সূচনাতে , কেবল রেকর্ড করার জন্যO(|V|)VSতদর্থক অন্যান্য সেট সূচকের প্রতিটি নতুন সেট দিয়ে যার ছেদ এস আপনি আগ্রহী।TS