সন্নিবেশ, মুছুন এবং মোস্টফ্রোয়িংকে সমর্থন করে একটি কার্যকর ডেটা স্ট্রাকচার


14

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

  • সন্নিবেশ মধ্যে ,(,)ডি
  • মুছে ফেলুন সদস্য , (এটি অনুসন্ধান করার কোন প্রয়োজন , যেমন একটি সদস্য পয়েন্ট ),ডি
  • MostFrequent, যা একটি সদস্য ফেরৎ যেমন যে সবচেয়ে ঘন কি এক (নোট যে অধিকাংশ ঘন কী অনন্য হতে হবে না)।De.keyD

এই তথ্য কাঠামোর একটি কার্যকর বাস্তবায়ন কি হবে?

আমার সমাধানটি কীগুলি এবং তাদের ফ্রিকোয়েন্সিগুলির ফ্রিকোয়েন্সি প্লাস হ্যাশ টেবিল দ্বারা অগ্রাধিকারের জন্য একটি হিপ যেখানে হ্যাশ ফাংশন সদস্যদের হ্যাশ টেবিলের একই স্লুতে একই কী সহ ম্যাপ করে (প্রতিটি অংশ থেকে অন্য অংশে পয়েন্টার সহ)।

এটি প্রথম দুটি ক্রিয়াকলাপের জন্য এবং তৃতীয় (সবচেয়ে খারাপ ক্ষেত্রে চলমান সময়) ) দিতে পারে।Θ(lgn)Θ(1)

আমি ভাবছি আরও কার্যকর সমাধান আছে কিনা? (বা একই দক্ষতার সাথে একটি সহজ সমাধান?)


আপনি চাইলে হ্যাশ টেবিলের পরিবর্তে একটি সাধারণ ভারসাম্য বাইনারি অনুসন্ধান গাছ ব্যবহার করতে পারেন।
জো

হ্যাশ টেবিলটি প্রচুর অযৌক্তিক স্থান ব্যবহার করে, আমি অগ্রাধিকার সারি প্রস্তাব করব। এটি আপনাকে সন্নিবেশ করা এবং মুছতে একই সময় জটিলতা দেয় তবে মেমরির জটিলতা আরও ভাল হবে।
বার্তোসজ প্রিজিবিস্কি 21

@ জো, একটি হ্যাশ টেবিলের জায়গায় একটি বিএসটি ব্যবহার করা মোস্টফ্রেসিউন অপারেশনগুলিকে কম দক্ষ করে তুলবে, তবে এটি স্মৃতির পক্ষে যুক্তিসঙ্গত বাণিজ্য হতে পারে trade
কাভেহ

2
যদি কেবল তুলনাগুলি ব্যবহার করা হয় তবে উপাদান স্বতন্ত্রতার সমস্যাটির জন্য নিম্ন সীমাবদ্ধতার কারণে অন্তত সন্নিবেশ / সর্বাধিক ফ্রেমিংয়ের একটিতে এমোরিটাইজড করতে হবে । Ω(logn)
আর্যভট্ট

1
স্ট্রিমিং মডেলটিতে কিছু আকর্ষণীয় স্ট্রাকচারও রয়েছে। springerlink.com/content/t17nhd9hwwry909p
জো

উত্তর:


7

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

আপনি যদি তুলনা-ভিত্তিক মডেলটি ছেড়ে চলে যান এবং র‌্যাম মডেলটি অবলম্বন করেন যেখানে কীগুলি বাইনারি স্ট্রিং হিসাবে বিবেচিত হয়, প্রতিটি এক বা একাধিক মেশিন শব্দের মধ্যে রয়েছে, আপনি এ আপনার অগ্রাধিকার সারিটি প্রয়োগ করতে পারেন । প্রকৃতপক্ষে, আপনি উভয় সন্নিবেশ করান এবং অপারেশন হে ( √) মুছতে পারেন o(logn)এবংফাইন্ডমিন অপারেশনের জন্য(1)সময়। থারুপ তা প্রমাণ করলেনO(loglogn)O(1)

আমরা যদি কী অনুসারে সময় এস ( এন ) কীগুলি বাছাই করতে পারি তবে আমরা স্থির সময় এবং এস ( এন ) সময়ে আপডেটগুলি (সন্নিবেশ করান এবং মুছুন) সমর্থন করে একটি অগ্রাধিকার সারি কার্যকর করতে পারি ।nS(n)S(n)

এম থারুপ দেখুন। অগ্রাধিকারের সারি এবং বাছাইয়ের মধ্যে সমতা, 2002. প্রোকে। ফোকস 2002

যেহেতু আমরা ( n in) অনুসারে বাছাই করতে পারি প্রত্যাশিত সময় এবং লিনিয়ার স্পেস, দ্বারা দেখানো হয়েছেO(nloglogn)

ওয়াই। হান এবং এম। থারুপ। ( n Inte) তে পূর্ণসংখ্যা বাছাই করা প্রত্যাশিত সময় এবং লিনিয়ার স্পেস। প্রোকে। ফোকস 2002O(nloglogn)

আবদ্ধ প্রমাণিত হয়।


1

আপনি প্রত্যাশিত মোড়িত সময়ে এই সমস্ত কিছু করতে পারেন । অপরিহার্য কৌশলটি হ'ল আমাদের অগ্রাধিকারের সারির পূর্ণ শক্তি প্রয়োজন নেই, কারণ প্রতিটি সন্নিবেশ বা মোছার সময় মূল ফ্রিকোয়েন্সি কেবল 1 দ্বারা পরিবর্তিত হয়।O(1)

নীচের আমার সমাধানটি হ'ল এই "অক্ষম" অগ্রাধিকার সারির সাথে কেবল আপনার সমাধান যা এই ক্ষেত্রে ভাল কাজ করতে পারে: সর্বাধিক অগ্রাধিকারের সারিটি কীগুলির বালতিগুলির দ্বিগুণ লিঙ্কযুক্ত তালিকাগুলি হিসাবে প্রয়োগ করা হয়েছে ও (1) ইনসার্টমিন, ডিলিটম্যাক্স, সরানোপ্রেমকেট এবং increaseKey।


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

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

বালতিলিস্ট ছাড়াও আমাদের একটি সেটম্যাপ লাগবে, যা ভ্যালুবকেটসে একটি হ্যাশ ম্যাপ ম্যাপিং কী। একটি ভ্যালুবিকেট হ'ল একটি জুটি যা ভ্যালুসেট (একটি শূন্য হ্যাশ মানগুলির সেট) এবং একটি বালতিতে নন-নাল পয়েন্টার সমন্বিত। একটি কী এর সাথে যুক্ত ভ্যালুসেটে কে-এর সাথে সম্পর্কিত সমস্ত অনন্য মান রয়েছে। ভ্যালুসেটের সাথে জড়িত বালতি পয়েন্টারটিতে ভ্যালুসেটের আকারের সমান কোহর্ট থাকে। সেটম্যাপে কী-এর সাথে জড়িত বালতিটিও বালতিলিস্টে কী-এর সাথে যুক্ত।

সি ++ এ:

struct Bucket {
    unsigned ValCount;
    unordered_set<Key> Cohort;
    Bucket * heavier;
    Bucket * lighter;
};
Bucket * BucketListHead;
Bucket * BucketListTail;

struct ValueBucket {
  unordered_set<Value> ValueSet;
  Bucket * bucket;
};
unordered_map<Key, ValueBucket> SetMap;

সর্বাধিক-ফ্রিকোয়েন্সি কী-মান জুটির সন্ধানের জন্য, আমাদের কেবল বকেটলিস্টের মাথাটি অনুসন্ধান করা উচিত, কোহর্টে একটি কী খুঁজে পাওয়া উচিত, সেটম্যাপে সেই কীটি সন্ধান করা উচিত এবং এর ভ্যালুবকেটের ভ্যালুসেটে একটি মান পাওয়া উচিত। (রাম রাম!)

কী-মানযুক্ত জোড়গুলি সন্নিবেশ করা এবং মুছে ফেলা জটিল।

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


ধন্যবাদ। প্রকৃতপক্ষে সমাধানের জন্য আমাদের একই ধারণা ছিল তবে এটির সাথে এটি একটি সমস্যা ছিল। সমস্যাটি কী ছিল তা আমি এখনই মনে করি না কারণ আমাকে তা পরীক্ষা করে দেখতে হবে। এটি আমাদের সমাধানের যে সমস্যাটি থেকেছিল তা এড়ানো যায় কিনা তা আমি পরবর্তী সপ্তাহে আরও সতর্কতার সাথে এটি পরীক্ষা করব।
কাভেহ

আমার সমাধান সম্পর্কে ভাবার আরেকটি উপায় এখানে: এটি "অদক্ষ" অগ্রাধিকারের সারি সহ সত্যিই আপনার সমাধান যা এই ক্ষেত্রে ভালভাবে কাজ করার জন্য ঘটে। কীগুলির বালতিগুলির দ্বিগুণ লিঙ্কযুক্ত তালিকাগুলি হিসাবে প্রয়োগ করা সর্বাধিক অগ্রাধিকারের কাতারে রয়েছে ও (1) ইনসার্টমিন, ডিলিটম্যাক্স, সরানোফ্রমবকেট এবং গ্রীস কে।
jbapple

ভ্যালুবকেটসের কীগুলি থেকে ম্যাপিংটি বজায় রাখার সবচেয়ে কার্যকরী উপায় (সবচেয়ে খারাপ ক্ষেত্রে) সম্ভবত একটি অনুসন্ধানের গাছ search
রাফেল

রাফেল - আপনি কী পাচ্ছেন তা আমি নিশ্চিত নই। আপনি কি বলছেন যে হ্যাশ টেবিলগুলি অনুশীলনে ব্যয়বহুল, বা সবচেয়ে খারাপ ক্ষেত্রে তাদের খারাপ পারফরম্যান্স রয়েছে, বা কোনও তৃতীয় জিনিস?
jbapple

-3

সবচেয়ে খারাপ ক্ষেত্রে জটিলতা

Sertোকান : O(1)

সন্ধান করুন-মিনিট : O(1)

হ্রাস-কী : O(1)

O(loglogn)

O(n)

প্রমাণ

[0,N) O(log log min{n,N})

যা সংমিশ্রণে প্রতিষ্ঠিত:

τ(n,N) n[0,N) τ(n,N)τ(N,N)τ

এবং:

n[0,N)O(1+log log nlog log q)q

উল্লেখ

থরুপ, মিক্কেল "অবিচ্ছিন্ন সময় এবং একক উত্স সবচেয়ে সংক্ষিপ্ত পথের সমস্যা হ্রাস কী সহ পূর্ণসংখ্যার অগ্রাধিকারের সারিগুলি” " থিওরি অফ কম্পিউটিংয়ের ত্রিশতম-পঞ্চম বার্ষিক এসিএম সিম্পোজিয়ামের কার্যক্রমে, 149-1515। স্টক '03। নিউ ইয়র্ক, এনওয়াই, মার্কিন যুক্তরাষ্ট্র: এসিএম, 2003


নোট করুন যে সমস্ত অগ্রাধিকারের কাতারে 'গেট-মিন' এবং 'এক্সট্রাক্ট-মিনি' সমর্থনকারী কাঠামোতে 'গেট-ম্যাক্স' এবং 'এক্সট্র্যাক্ট-ম্যাক্স' সমর্থনকারী কাঠামোয় স্থানান্তর করা তুচ্ছ।

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