পূর্ণসংখ্যার একটি স্ট্রিম থেকে চলমান মিডিয়ানটি সন্ধান করুন


223

সম্ভাব্য সদৃশ:
সিটিতে রোলিং মিডিয়ান অ্যালগোরিদম

দেওয়া হয়েছে যে কোনও ডেটা স্ট্রিম থেকে পূর্ণসংখ্যা পড়া হয়। দক্ষ উপায়ে এ পর্যন্ত পড়া উপাদানগুলির মাঝারি সন্ধান করুন।

সমাধানটি আমি পড়েছি: কার্যকর মধ্যকের চেয়ে কম উপাদানগুলির প্রতিনিধিত্ব করতে আমরা বাম দিকে সর্বাধিক গাদা এবং কার্যকর মিডিয়েনের চেয়ে বড় যে উপাদানগুলির প্রতিনিধিত্ব করতে ডানদিকে একটি নূন্যতম গাদা ব্যবহার করতে পারি।

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

তবে আমরা কীভাবে একটি সর্বোচ্চ হিপ এবং মিনি হিপ তৈরি করব অর্থাৎ আমরা এখানে কার্যকর মিডিয়ানটি কীভাবে জানব? আমি মনে করি যে আমরা সর্বাধিক হিপতে 1 টি উপাদান এবং তারপরে ন্যূনতম apালিতে পরবর্তী 1 উপাদানটি এবং সমস্ত উপাদানগুলির জন্য sertোকাতাম। আমি এখানে ভুল হলে আমাকে সংশোধন করুন।


10
চতুর অ্যালগরিদম, গাদা ব্যবহার করে। শিরোনাম থেকে আমি সাথে সাথে সমাধানের কথা ভাবতে পারিনি।
মাকিং হাঁস

1
ভিজিয়ারের সমাধানটি আমার কাছে ভাল লাগছে, আমি ধরেই নিছিলাম (যদিও আপনি বিবৃতি দিয়েছিলেন না) যে এই প্রবাহটি নির্বিচারে দীর্ঘ হতে পারে, তাই আপনি সমস্ত কিছু স্মরণে রাখতে পারবেন না। এটাই কি?
ওয়াইল্ড

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

2
আপনি উভয় স্তূপ খালি দিয়ে শুরু করতে পারেন। প্রথম ইনট এক স্তূপে যায়; দ্বিতীয়টি হয় অন্যটিতে যায়, বা আপনি প্রথম আইটেমটিকে অন্য গাদাতে সরান এবং তারপরে .োকান। এটি "অন্যের +1 এর তুলনায় একটি গাদা বড় হওয়ার অনুমতি দেবে না"
জেনারালাইজ করে

আমি কেবল এই প্রশ্নটি একটি এমএসএফটি সাক্ষাত্কারে পেয়েছি। পোস্ট করার জন্য আপনাকে ধন্যবাদ
আর ক্লেভেন

উত্তর:


383

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

প্রশ্নটি একটি নির্দিষ্ট সমাধানের (ম্যাক্স হিপ / মিনিট হিপ সলিউশন) বিশদ সম্পর্কে, এবং কীভাবে হিপ ভিত্তিক সমাধানটি কাজ করে তা নীচে ব্যাখ্যা করা হয়েছে:

প্রথম দুটি উপাদানের জন্য বামদিকে ম্যাক্সহ্যাপে ছোট্ট একটি এবং ডানদিকে মিনিপীমের চেয়ে বড়টি যুক্ত করুন। তারপরে স্ট্রিম ডেটা একের পর এক প্রক্রিয়া করুন,

Step 1: Add next item to one of the heaps

   if next item is smaller than maxHeap root add it to maxHeap,
   else add it to minHeap

Step 2: Balance the heaps (after this step heaps will be either balanced or
   one of them will contain 1 more item)

   if number of elements in one of the heaps is greater than the other by
   more than 1, remove the root element from the one containing more elements and
   add to the other one

তারপরে যে কোনও সময় আপনি এটির মতো মধ্যম গণনা করতে পারেন:

   If the heaps contain equal amount of elements;
     median = (root of maxHeap + root of minHeap)/2
   Else
     median = root of the heap with more elements

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


6
এই স্তূপগুলি আবদ্ধ না হয়ে বেড়ে ওঠে (অর্থাত্ 100 মিলিয়ন উপাদানগুলির উপরে স্লাইডিং 100 টি উপাদানগুলির উইন্ডোতে 10 মিলিয়ন উপাদানগুলির সমস্ত স্মৃতিতে সংরক্ষণের প্রয়োজন হবে)। সূচকযোগ্য স্কিপলিস্টগুলি ব্যবহার করে অন্য উত্তরের জন্য নীচে দেখুন যা কেবলমাত্র সর্বাধিক দেখা হওয়া 100 টি উপাদান মেমরিতে রাখা দরকার।
রেমন্ড হেটিংগার

1
প্রশ্নটির নিজস্ব মন্তব্যের একটিতে যেমন ব্যাখ্যা করা হয়েছে তেমনি হ্যাপ ব্যবহার করে আপনারও একটি সীমাবদ্ধ মেমোরি সমাধান থাকতে পারে।
হাকান সেরেস

1
আপনি সিটিতে এখানে
অ্যাশেলি

1
বাহ এটি আমাকে কেবলমাত্র এই নির্দিষ্ট সমস্যাটিই সমাধান করতে সহায়তা করেছে তা নয়, এখানে পাইপথনে
প্রয়োগটি হ'ল

2
@ হকানসারেজ আপনি কি দয়া করে ব্যাখ্যা করতে পারেন যে আমরা কেন করেছি? মানে আমি এই কাজগুলি দেখতে পাচ্ছি, তবে আমি স্বজ্ঞাতভাবে এটি বুঝতে সক্ষম নই to
শিব

51

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

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

তারপরে যেকোনও মুহুর্তে, মিডিয়ানটি সন্ধান করতে, কোন পূর্ণসংখ্যাটি মাঝারি উপাদানটি নির্ধারণের জন্য কেবল গণনাগুলি ব্যবহার করুন। এটি ধ্রুবক সময় নেয় (যদিও একটি বৃহত ধ্রুবক, তবে তবুও ধ্রুবক)।


3
প্রায় সব সংখ্যার একবার যদি একবার দেখা হয় তবে একটি বিরল তালিকার চেয়ে আরও বেশি মেমরি লাগবে । এবং এটি সম্ভবত সম্ভবত মনে হয় যে আপনার যদি এতগুলি সংখ্যা থাকে তবে তারা সংখ্যায় ফিট করে না যে বেশিরভাগ সংখ্যা একবারে উপস্থিত হবে। অসন্তুষ্টির সাথে, এটি সংখ্যার বিশাল সংখ্যার জন্য একটি চতুর সমাধান ।
মাকিং হাঁস

1
একটি বিচ্ছিন্ন তালিকার জন্য, আমি সম্মত, এটি মেমরির দিক থেকে আরও খারাপ। যদিও যদি পূর্ণসংখ্যার এলোমেলোভাবে বিতরণ করা হয় তবে আপনি স্বজ্ঞাততা প্রকাশের চেয়ে খুব শীঘ্রই নকল পেতে শুরু করবেন। Mathworld.wolfram.com/BirthdayProblem.html দেখুন । সুতরাং আমি নিশ্চিত যে আপনার সাথে কয়েক গিগাবাইট ডেটা থাকার সাথে সাথে এটি কার্যকর হয়ে যাবে।
অ্যান্ড্রু সি

4
@ অ্যান্ড্রুসি আপনি কীভাবে মিডিয়ানটিকে সন্ধান করতে ধ্রুব সময় নেবেন তা আপনি ব্যাখ্যা করতে পারেন। আমি যদি এন বিভিন্ন ধরণের পূর্ণসংখ্যা দেখেছি তবে সবচেয়ে খারাপ ক্ষেত্রে শেষ উপাদানটি মধ্যস্থ হতে পারে। এটি মাঝারি সন্ধানকারী ও (এন) ক্রিয়াকলাপটিকে তৈরি করে।
shshnk

@shshnk এই ক্ষেত্রে যে উপাদানগুলির >>> 2 ^ 35 এর মোট সংখ্যা নেই?
বিশআমদি

@shshnk আপনি ঠিক বলেছেন যে এটি এখনও দেখা বিভিন্ন পূর্ণসংখ্যার সংখ্যার মধ্যে রৈখিক, যেমন বিশ্বআমদী বলেছিলেন, আমি এই সমাধানটির জন্য অনুমান করছি যে এন আপনি দেখছেন এমন সংখ্যার সংখ্যা, যা অনেক বেশি 2 ^ 33 এর চেয়ে বড়। যদি আপনি এতগুলি সংখ্যা না দেখেন তবে ম্যাক্সেপ সলিউশনটি অবশ্যই আরও ভাল।
অ্যান্ড্রু সি

49

যদি ইনপুটটির বৈকল্পিকতা পরিসংখ্যানগতভাবে বিতরণ করা হয় (উদাহরণস্বরূপ স্বাভাবিক, লগ-নরমাল ইত্যাদি) তবে জলাধার নমুনাটি নির্বিচারে দীর্ঘ সংখ্যার পার্সেন্টাইল / মিডিয়ানদের অনুমানের একটি যুক্তিসঙ্গত উপায়।

int n = 0;  // Running count of elements observed so far  
#define SIZE 10000
int reservoir[SIZE];  

while(streamHasData())
{
  int x = readNumberFromStream();

  if (n < SIZE)
  {
       reservoir[n++] = x;
  }         
  else 
  {
      int p = random(++n); // Choose a random number 0 >= p < n
      if (p < SIZE)
      {
           reservoir[p] = x;
      }
  }
}

"জলাশয়" তখন একটি চলমান, অভিন্ন (মেলা), সমস্ত ইনপুটের নমুনা - আকার নির্বিশেষে। মিডিয়ান (বা কোনও শতকরা) সন্ধান করা তারপরে জলাধারটিকে বাছাই করা এবং আকর্ষণীয় বিন্দুটি পোল করার একটি সোজা-সামনের বিষয়।

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


কৌতূহল ছাড়াই, আপনার বৈচিত্রের প্রয়োজন কেন?
অলস্যাটিক

স্ট্রিমটি জলাধারটিকে অর্ধেক ফাঁকা রেখে SIZE টিরও কম উপাদান ফিরতে পারে। মিডিয়ান গণনার সময় এটি বিবেচনা করা উচিত।
অ্যালেক্স

মিডিয়ানের পরিবর্তে পার্থক্য গণনা করে এটি আরও দ্রুত করার কোনও উপায় আছে কি? মুছে ফেলা এবং যুক্ত হওয়া নমুনা এবং আগের মিডিয়ান কি তার জন্য যথেষ্ট তথ্য?
inf3rno

30

আমি যে স্রোতের সন্ধান পেয়েছি তার পারসেন্টাইল গণনা করার সর্বাধিক দক্ষ উপায় হ'ল পি অ্যালগরিদম: রাজ জৈন, ইমরিচ চ্ল্যামটাক: কোয়ান্টাইলের ডায়নামিক গণনার জন্য হিসাবরক্ষণ ও হিস্টোগ্রামগুলি স্টোর অবজারভেশন ছাড়াই পিও অ্যালগরিদম। কলাম। এসিএম 28 (10): 1076-1085 (1985)

অ্যালগরিদম বাস্তবায়নের জন্য সরাসরি এগিয়ে এবং অত্যন্ত ভালভাবে কাজ করে। এটি একটি অনুমান, তবে, মনে রাখবেন। বিমূর্ত থেকে:

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


2
কাউন্ট-মিন স্কেচ পি ^ 2 এর চেয়ে ভাল যা এটি ত্রুটিটিকেও আবদ্ধ করে দেয় যখন উত্তরটি দেয় না।
sinoTrinity

1
গ্রিনওয়াল্ড এবং খান্নার "কোয়ান্টিল সামারিগুলির স্পেস-দক্ষ অনলাইনে গণনা" বিবেচনা করুন, যা ত্রুটির সীমাও দেয় এবং মেমরির ভাল প্রয়োজন।
পল চেরনোচ

1
এছাড়াও, একটি সম্ভাব্য পদ্ধতির জন্য, এই ব্লগ পোস্টটি দেখুন: গবেষণা. neustar.biz/2013/09/16/… এবং যে কাগজটি এটি উল্লেখ করেছে তা এখানে রয়েছে: arxiv.org/pdf/1407.1121v1.pdf এটিকে "ফ্রুগাল" বলা হয় স্ট্রিমিং "
পল চেরনোচ

27

আমরা মধ্যমা খুঁজতে চান তাহলে এন সম্প্রতি দেখা উপাদান, এই সমস্যা একটি সঠিক সমাধান শুধুমাত্র প্রয়োজন হয়েছে এন সম্প্রতি দেখা উপাদান মেমরি রাখা যাইবে। এটি দ্রুত এবং স্কেলগুলি ভাল।

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

class RunningMedian:
    'Fast running median with O(lg n) updates where n is the window size'

    def __init__(self, n, iterable):
        self.it = iter(iterable)
        self.queue = deque(islice(self.it, n))
        self.skiplist = IndexableSkiplist(n)
        for elem in self.queue:
            self.skiplist.insert(elem)

    def __iter__(self):
        queue = self.queue
        skiplist = self.skiplist
        midpoint = len(queue) // 2
        yield skiplist[midpoint]
        for newelem in self.it:
            oldelem = queue.popleft()
            skiplist.remove(oldelem)
            queue.append(newelem)
            skiplist.insert(newelem)
            yield skiplist[midpoint]

এখানে কাজের কোড পূর্ণ করার লিঙ্কগুলি রয়েছে (একটি সহজে বোঝা যায় এমন শ্রেণীর সংস্করণ এবং ইনডেক্সযোগ্য স্কিপলিস্ট কোডটি ইনলাইনড করে একটি অনুকূলিত জেনারেটর সংস্করণ):


7
যদিও আমি যদি এটি সঠিকভাবে বুঝতে পারি তবে এটি আপনাকে সর্বশেষ এন উপাদানগুলিতে একটি মধ্যমা দেয়, সমস্ত উপাদান সেই বিন্দু পর্যন্ত নয়। এটি যদিও এই অপারেশনের জন্য সত্যিই চটজলদি সমাধান হিসাবে মনে হচ্ছে।
অ্যান্ড্রু সি

16
ঠিক। উত্তরের উত্তরটি মনে হচ্ছে যেন কেবল সর্বশেষ এন উপাদানগুলিকে স্মৃতিতে রেখেই সমস্ত উপাদানগুলির মধ্যস্থতা খুঁজে পাওয়া সম্ভব - এটি সাধারণভাবে অসম্ভব। অ্যালগরিদম কেবল শেষ এন উপাদানগুলির মধ্যস্থতাকে সন্ধান করে।
হ্যান্স-পিটার স্টার

8
"চলমান মিডিয়ান" শব্দটি সাধারণত উপাত্তের উপসেটের মিডিয়ান বোঝাতে ব্যবহৃত হয় । ওপিকে একটি সাধারণ শব্দটি অ-মানক উপায়ে ব্যবহার করা হয়।
র্যাচেল হেট্টিঙ্গার

18

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

সুতরাং পরিবর্তে আমরা যা করতে পারি তা হ'ল মিডিয়ান এবং দুটি ভারসাম্য বাইনারি গাছ, একটি মধ্যকের চেয়ে কম উপাদানগুলির জন্য এবং একটি মধ্যকের চেয়ে বড় উপাদানগুলির জন্য। দুটি গাছ অবশ্যই একই আকারে রাখতে হবে।

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


আপনি কিভাবে যে কাজ করতে যাচ্ছি? "আমরা সঠিক গাছের ন্যূনতম উপাদানটি সরিয়ে
ফেলি

2
আমি বাইনারি অনুসন্ধান গাছগুলি বোঝাতে চাইছিলাম, সুতরাং মিন উপাদানটি মূল থেকে সমস্ত পথ বাকি।
আইরিন পাপাকনস্টান্টিনো

7

দক্ষ একটি শব্দ যা প্রসঙ্গে নির্ভর করে। এই সমস্যার সমাধান সন্নিবেশের পরিমাণের তুলনায় কতগুলি ক্যোয়ারী করা হয়েছে তার উপর নির্ভর করে। ধরুন আপনি মাঝারিটির প্রতি আগ্রহী হয়ে শেষের দিকে এন নম্বর এবং কে বার সন্নিবেশ করছেন? হিপ ভিত্তিক অ্যালগরিদমের জটিলতা হ'ল হে (এন লগ এন + কে)।

নিম্নলিখিত বিকল্প বিবেচনা করুন। একটি অ্যারেতে সংখ্যাগুলি নিমগ্ন করুন এবং প্রতিটি ক্যোয়ারির জন্য রৈখিক নির্বাচনের অ্যালগরিদম চালান (বলুন quicksort পিভট ব্যবহার করে)। চলমান সময় হে (কেএন) এর সাথে এখন আপনার একটি অ্যালগরিদম রয়েছে।

এখন যদি কে যথেষ্ট পরিমাণে কম হয় (বিরল প্রশ্ন) তবে পরবর্তী অ্যালগরিদম আসলে আরও দক্ষ এবং বিপরীত।


1
স্তূপ উদাহরণে, অনুসন্ধানটি ধ্রুবক সময়, সুতরাং আমি মনে করি এটি ও (এন লগ এন + কে) হওয়া উচিত তবে আপনার পয়েন্টটি এখনও ধারণ করে।
অ্যান্ড্রু সি

হ্যাঁ, ভাল কথা, এটি সম্পাদনা করবে। আপনি ঠিক বলেছেন এন লগ এন এখনও নেতৃস্থানীয় শব্দ।
পিটারিস

-2

আপনি কি কেবল একটি গাদা দিয়ে এটি করতে পারবেন না? আপডেট: না। মন্তব্য দেখুন।

আক্রমণকারী: 2*nইনপুটগুলি পড়ার পরে , মিনি-হিপগুলি nতাদের মধ্যে সবচেয়ে বেশি থাকে।

লুপ: 2 ইনপুট পড়ুন। উভয়কে গাদাতে যুক্ত করুন এবং গাদাটির মিনিট সরিয়ে দিন। এটি হানাদারকে পুনঃপ্রকাশ করে।

সুতরাং যখন 2nইনপুটগুলি পঠিত হয়েছে, তখন গাদা এর মিনিটটি নবমতম। মাঝারি অবস্থানের চারপাশে দুটি উপাদানকে গড় হিসাবে গড়ে তোলার জন্য এবং এক বিচিত্র সংখ্যার ইনপুটগুলির পরে প্রশ্নগুলি পরিচালনা করতে কিছুটা অতিরিক্ত জটিলতা দরকার।


1
কাজ করে না: আপনি এমন জিনিসগুলি ফেলে দিতে পারেন যা পরবর্তীতে শীর্ষের কাছাকাছি হয়। উদাহরণস্বরূপ, 1 থেকে 100 সংখ্যা দিয়ে আপনার অ্যালগরিদম চেষ্টা করুন তবে বিপরীতে: 100, 99, ..., 1.
জেলিন

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