ছেদ করার জন্য ডেটা স্ট্রাকচার?


21

নিম্নলিখিত ক্রিয়াকলাপগুলি সমর্থন করে এমন কোনও সংকলন (সীমাবদ্ধ স্থল সেট) বজায় রাখার কোনও ডেটা কাঠামো রয়েছে কি? কোন sublinear চলমান সময় প্রশংসা করা হবে?

  1. একটি খালি সেট শুরু করুন।
  2. একটি সেটে একটি উপাদান যুক্ত করুন।
  3. দুটি সেট দেওয়া হয়েছে, তারা ছেদ করেছে কিনা তা রিপোর্ট করুন।

1
এটি একটি খুব সাধারণ প্রশ্ন, কারণ কোনও ডেটা স্ট্রাকচারই সীমাবদ্ধ ডোমেন সহ এই ক্রিয়াকলাপগুলিকে সমর্থন করতে পারে। আপনি একটি সামান্য আরো সুনির্দিষ্ট হতে পারে ? যেমন। আপনার কী জটিলতা দরকার, সেট অপারেশন ইত্যাদি
অর্জনের

উত্তর:


13

প্রতিটি সেট অন্য সেট অস্তিত্ব একটি রেকর্ড বজায় রাখে, এবং আপনি একটি মোট থাকে তাহলে সেট, আপনি সহজেই যে কোন ডাটা স্ট্রাকচার একটি সংগ্রহ জন্য (চালু করতে পারেন যেমন বাইনারি অনুসন্ধান গাছ, ইত্যাদি ) এক মধ্যে তোমাদের আহরণ থাকতে পারে যেখানে সময় ( লগ ) এর মধ্যে দুটি সেট ছেদ করার একটি উপাদান ।s>0O(logs)

  • পুরোপুরি অর্ডার করা সেট থেকে প্রতিটি সেটের একটি অনন্য শনাক্তকারী থাকা উচিত। যদি আপনি স্পষ্টভাবে আপনার সেটগুলির নাম রাখেন তবে সনাক্তকারীটি কেবল সূচক হতে পারে।S1,S2,

  • আপনার সেটগুলির একটি "রেজিস্ট্রি" প্রয়োগ করা উচিত; একটি ডেটা স্ট্রাকচার যা আপনার সংজ্ঞায়িত সমস্ত সেটের সংগ্রহ বজায় রাখে। সহজ পুনরুদ্ধারের ( যেমন  আপনি সেটটি মুছতে চান) এবং সেটের লিনিয়ার-সময় ট্র্যাভারসালকে অনুমতি দেওয়ার জন্য রেজিস্ট্রিটি অনুসন্ধান-গাছের ডেটা কাঠামো হিসাবে প্রয়োগ করা উচিত ।

  • প্রতিটি সেট অন্য সেটগুলির প্রত্যেকটির একটি "সূচক" বজায় রাখে - সেগুলির অনুলিপি নয় , বরং একটি ডেটা স্ট্রাকচার যা অন্য সেটগুলির লেবেল দ্বারা সূচিযুক্ত হয়। এই সূচকটি বজায় রাখতে ব্যবহৃত হবে, প্রতিটি সেট এস কে , এস জেএস কে এর সমস্ত উপাদানের একটি বাইনারি অনুসন্ধান গাছ । (দুটি সেট এস জে এবং এস কে সেই অনুসন্ধান গাছের একটি অনুলিপি ভাগ করে)SjSkSjSkSjSk

আরম্ভ

একটি সেটের সূচনা নিয়ে গঠিত হে ( 1 ) অপারেশন তার উপাদানের গাছ আরম্ভ করতে, হে ( গুলি ) অপারেশন হিসাবে আপনি আরম্ভ (রেজিস্ট্রি থেকে কপি করার) সেট জন্য সূচক টি , এবং হে ( গুলি লগ গুলি ) অপারেশনগুলি যখন আপনি অন্য সেটগুলির প্রতিটি সূচকের এস জেতে টি যুক্ত করতে রেজিস্ট্রিটি অতিক্রম করেন । টি এর সূচীতে আমরা অনুসন্ধান গাছ তৈরি করি যা টি এস = উপস্থাপন করে T=O(1)O(s)TO(slogs)TSjTTSj=অন্যান্য সেট ; আমরা এস জে এর সূচকের জন্য একই পয়েন্টারটি অনুলিপি করি ।SjSj

একটি সেট টিতে একটি উপাদান যুক্ত করাT

টি টিতে কিছু যোগ করার জন্য যথারীতি সময় ( লগ এন টি ) লাগে , যেখানে এন টি = | টি | । আমরা সদস্যপদ জন্য পরীক্ষার এক্স অন্যান্য সেটের প্রতিটি এস 1 , S 2 , ... , যা সময় লাগে হে ( লগ এস 1 + + লগ ইন করুন এন এস 2 + + ) হে ( গুলি লগ এনxVTO(lognT)nT=|T|xS1,S2, যেখানে এন = | ভি | মহাবিশ্বের আকার (অথবা বৃহত্তম সেট হয় এস ) এবং গুলি রেজিস্ট্রি মধ্যে সেট সংখ্যা। প্রতিটি সেট জন্য এস যেমন যে এক্স এস , এছাড়াও সন্নিবেশ এক্স সেট জন্য সূচক মধ্যে এস টি । প্রতিটি যেমন সেট জন্য এস , এই নেয় হে ( লগ গুলি + + লগ এন টি ) সন্ধান করার সময়, এস

O(lognS1+lognS2+)O(slogn),
n=|V|SjsSjxSjxSjTSjO(logs+lognT)Sjএর সূচক এবং সন্নিবেশ করতে এক্স মধ্যে এস টি ; সমস্ত সেট জুড়ে এস 1 , এস 2 , এটি সময় নেবে O ( গুলি লগ s + গুলি লগ এন টি ) । আমরা যদি যে অনুমান করা সেট সংখ্যা এস অনেক মহাবিশ্বের আকার কম ভী (যেমন, যদি আমরা অনুমান গুলি « এন ), উপাদান সন্নিবেশ জন্য মোট সময় তারপর হে ( গুলি লগ এন )TxSjTS1,S2,O(slogs+slognT)SjVsnO(slogn)

আপনি যদি সেটগুলিতে সদৃশ না হয়ে থাকেন, তবে অন্যান্য সেট টি এর জন্য সদস্যপদ পরীক্ষা এবং সন্নিবেশকে রেখে আমরা ইতিমধ্যে ক্ষেত্রে সময় বাঁচাতে পারি । X ইতিমধ্যে উপস্থিত ক্ষেত্রে "সন্নিবেশ" কেবলমাত্র O ( লগ এন টি ) সময় নেয় ।xSTxO(logএনটি)

মোড় পরীক্ষা

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

উপাদান অপসারণ

একটি উপাদান মুছে ফেলার জন্য একটি সেট থেকে টি , আমরা এটা না শুধুমাত্র অনুসন্ধানের জন্য গাছ থেকে অপসারণ টি নিজেই কিন্তু ছেদ প্রতিটি এস টি সেটের জন্য এস তার সূচক। এটি সময় নেবে O ( গুলি লগ এন টি ) , যেখানে n টি = | টি | এক্সটিTSjTSjO(slognT)nT=|T|

বিলোপ সেট করুন

রেজিস্ট্রি অনুসন্ধানের ওভারহেডের কারণে, আপনার যদি অনেক সেট থাকে তবে একবার সেগুলির আর প্রয়োজন হয় না সেগুলি মুছে ফেলা বাঞ্ছনীয়। সমগ্র রেজিস্ট্রি ঢোঁড়ন মাধ্যমে আমরা মুছে ফেলতে পারবেন সব অন্যান্য সেট সূচি থেকে এস সময় হে ( গুলি এন টি ) , সার্চ প্রতিনিধিত্বমূলক গাছ মোছার খরচ দ্বারা প্রভাবিত এস টি অন্যান্য সেটের প্রতিটি এস , যেখানে এন টি = | টি | SSjO(snT)SjTSjnT=|T|

মন্তব্য

যদি আপনি কেবলমাত্র ধ্রুবক সেটগুলি প্রয়োগ করার প্রত্যাশা করেন, তবে উপরের রান-সময়গুলি হ্রাস করে:

  • সূচনা: O(1)

  • উপাদান সন্নিবেশ: O(logn)

  • ছেদ পরীক্ষা (এবং ছেদটি পুনরুদ্ধার): O(1)

  • উপাদান অপসারণ: O(lognT)

  • মুছে ফেলা সেট: O(nS)

যেখানে বৃহত্তম সেটের আকার এবং n টি = | টি | সেট টি যা আপনার উপর কাজ করছে।nnT=|T|T

আপনি যদি সেটগুলি আশা করেন, যেখানে ভি আপনার মহাবিশ্ব, আপনি যদি এই লাইনগুলি সাব-লিনিয়ার সময়ে পরিচালনা করতে চান তবে আপনার একটি আলাদা ডেটা স্ট্রাকচারের প্রয়োজন হতে পারে। তবে, আপনার যদি এমন কয়েকটি সেট রয়েছে যার ছেদগুলি আপনি জানেন যে আপনি কখনই পরীক্ষা করতে পারবেন না, তবে আপনি সেটের জন্য সূচকগুলির আকার হ্রাস করতে সক্ষম হবেন (যে কোনও ছেদেলটি আপনি পরীক্ষা করবেন এমন কোনও সেট না করে) বা একাধিক রেজিস্ট্রি ব্যবহার করতে পারেন ( সেটগুলির প্রতিটি সংগ্রহের জন্য একটি যার ছেদটি আপনি পরীক্ষা করতে পারেন)। প্রকৃতপক্ষে, কোনও রেজিস্ট্রি কেবল তখনই কার্যকর যখন আপনি প্রতিটি জোড় সূচকে একে অপরের রেকর্ড রয়েছে কিনা তা নিশ্চিত করার কেন্দ্রীয়ভাবে নিয়ন্ত্রণ চান: এটি কিছু ক্ষেত্রে ব্যবহারিক হতে পারে, একটি সেট এসের সূচনাতে , কেবল রেকর্ড করার জন্যO(|V|)VSতদর্থক অন্যান্য সেট সূচকের প্রতিটি নতুন সেট দিয়ে যার ছেদ এস আপনি আগ্রহী।TS


6

এমন ডেটা স্ট্রাকচার রয়েছে যা আপনাকে লিনিয়ার সময়ের চেয়ে কম সময়ে এটি করার অনুমতি দেয় এমনকি নিকৃষ্টতম ইনপুটগুলির জন্যও। দেখুন http://research.microsoft.com/pubs/173795/vldb11intersection.pdf (এবং সেখানে কাগজপত্র রেফারেন্স)।

যদি আপনার দুটি সেট এস এবং টি এর একটি বড় ছেদ থাকে এবং আপনার এস এর জন্য একটি অভিধান রয়েছে, এলোমেলো ক্রমে টি এর উপাদানগুলি সন্ধান করা আপনাকে দ্রুত একটি সাধারণ উপাদান দেয়। ছেদ আকার 0 বা 1 হয় যখন সবচেয়ে কঠিন ক্ষেত্রে হয়।


3

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

একটি ট্রি-সেট ও (লগ এন) এ সন্নিবেশ এবং ওয়ারস্ট কেস ও (এন লগ এন) এ ছেদ করা পরীক্ষাকে সমর্থন করবে।

একটি হ্যাশ-সেট এমোরটাইজড ও (1 * এইচ) -এ সন্নিবেশকে সমর্থন করবে যেখানে 'এইচ' হ্যাশিং অ্যালগরিদমের চলমান সময় এবং ওয়ারস্ট কেস ও (এন) এর ছেদ পরীক্ষা।

বিটমাস্ক সেটগুলি সাধারণত ট্রি- এবং হ্যাশ-সেটগুলির মতো ব্যবহার হয় না।


2
এটি একটি শালীন স্ট্যাক ওভারফ্লো উত্তর হবে তবে এটি কীভাবে এবং কেন কাজ করে সে সম্পর্কে আমরা এখানে কিছু বিশদ চাই ।
রাফায়েল

3

যদি আপনার ক্ষেত্রে মিথ্যা ইতিবাচক উত্তরগুলির অনুমতি দেয় তবে আমি ব্লুম ফিল্টারটি একটি একক হ্যাশ ফাংশন সহ ব্যবহার করব ।

আপনি নিম্নলিখিত হিসাবে এটি বাস্তবায়ন করতে পারেন:

একটি খালি সেট শুরু করুন

  • বি = বিট অ্যারে এন বিটস, সমস্ত 0 এ সেটএন সম্ভাব্য উপাদানগুলির সংখ্যা অনুযায়ী চয়ন করা উচিত)

একটি সেটে একটি উপাদান যুক্ত করুন।

  • বি[একটিগুলি(মিএনটি)]=1

দুটি সেট দেওয়া (বি 1, বি 2), তারা ছেদ করেছে কিনা তা রিপোর্ট করুন।

  • যদি পরীক্ষা করে দেখুন বি1 একজনএনডি বি2 = 0

জটিলতা

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