একটি কালো বাক্স ব্যবহার করে বাছাই করা


20

অনুমান আমরা তালিকা বাছাই করতে চান এর এন বাস্তব নম্বর। ধরে নিন যে আমাদের একটি কালো বাক্স দেওয়া হয়েছে যা sort বাছাই করতে পারে Sn বাস্তব অবিলম্বে নম্বর। এই ব্ল্যাক বক্সটি ব্যবহার করে আমরা কতটা সুবিধা অর্জন করতে পারি?n

উদাহরণস্বরূপ, আমরা কেবল ( √) দিয়ে সংখ্যাগুলি বাছাই করতে পারি ব্ল্যাক বক্সে কল? আমি যে সেরা অ্যালগরিদম পেয়েছিতা কালো বাক্সেএনকলগুলিব্যবহার করে। তবে আমি এর থেকে আরও উন্নতি করতে পারিনি। এখানে আমার অ্যালগরিদম যা মার্জ-সাজানোর অনুরূপ:O(n)n

প্রথম পার্টিশন তালিকা মধ্যে S তালিকাগুলি1,গুলি2,,গুলিn প্রায়√ সহs1,s2,...,sn আকার। তারপরে use ব্যবহার করুনnn কালো বাক্স কল এই তালিকাগুলি সাজাতে হয়। অবশেষে, ব্ল্যাক বক্স ব্যবহার করে বাছাই করা তালিকা নীচের হিসাবে মার্জ করুন:

তালিকাগুলির ক্ষুদ্রতম উপাদানগুলিকে একটি নতুন তালিকা , তারপরে ব্ল্যাক বক্সটি বাছাই করুন sort নম্বর এল [ 1 ] (প্রথম এবং ক্ষুদ্রতম উপাদান এল ) ক্ষুদ্রতম সংখ্যা হতে হবে এস । আমরা এটিকে আউটপুট তালিকার প্রথম স্থানে রাখতে পারি। উপাদানটিকে এস জে থেকে বেছে নেওয়া হয়েছে বলে ধরে নিচ্ছি , আমরা এল [ 1 ] কে সকারের তালিকার দ্বিতীয় জনের ছোট ছোট উপাদানের সাথে প্রতিস্থাপন করব এবং এরপরে আবার ব্ল্যাক বক্সটি চালিয়ে এস এর দ্বিতীয় বৃহত্তম সদস্যকে গণনা করতে পারি ।LL[1]LS
sjL[1]sjS
সমস্ত উপাদান বাছাই না হওয়া পর্যন্ত আমরা চালিয়ে যাচ্ছি। এই অংশের জন্য মোট ব্ল্যাক বক্স কলগুলির সংখ্যা n - be হবে । সুতরাং সামগ্রিকভাবে মোট কলগুলির সংখ্যাএন হবেnnn

অন্যদিকে, এটা পছন্দ আমরা প্রাপ্ত করতে সক্ষম হওয়া উচিত দেখায় একটি নিম্ন-বাউন্ড ব্যবহার কম-বাউন্ড বাছাই নিম্নরূপ জন্য প্রয়োজনীয় সংখ্যা তুলনা করুন: আমরা ব্যবহার কালো বাক্স বাস্তবায়ন করতে পারে তুলনা। যদি আমরা( √) দিয়ে সমস্যাটি সমাধান করতে পারিnlgn=12nlgnকালো বাক্স কল এবং রৈখিক টাইমে আমরা সাজানোর মার্জ করতেএনসঙ্গে বাস্তব সংখ্যার(এনএলজিএন)তুলনা যা অসম্ভব।o(n)no(nlgn)

আমি অনুমান করি যে আমরা প্রমাণ করতে পারি যে ব্ল্যাক বক্সে কল করার সংখ্যার জন্য হ'ল একটি নিম্ন-সীমাবদ্ধ, যেহেতু কালো বাক্সে প্রচুর তুলনা ভাগ করা হবে এবং তাই আমাদের যুক্তিতে পুনরুক্ত করা হয়।Ω(n)

আপডেট: অন্যান্য পোস্টে যেমন পরামর্শ দেওয়া হয়, তেমন একটি এছাড়াও অর্জনযোগ্য।nlgn


2
আপনার মন্তব্যে একটি টাইপো আছে বলে মনে হচ্ছে। আপনি কি বলতে চেয়েছেন: " √ এর চেয়ে কম অ্যালগরিদম ব্যবহার হচ্ছে না মেশিন কল সাজানোর করতেএনকম সঙ্গে বাস্তব সংখ্যারএনএলজিএনতুলনা "PS: আপনার কাছে সত্য যে বিষয়ে সতর্ক হওয়া উচিত?এনএলজিএননিম্ন-বাউন্ড শুধুমাত্র তুলনা জন্য ভিত্তি ঝুলিতে বাছাই আলগোরিদিম।NNNlgNNlgN
Kaveh

8
আমি মনে করি আমরা এমনকি ( √) পেতে পারি একেএসের বাছাই নেটওয়ার্ক ব্যবহার করে। তাদের নেটওয়ার্ক আপনার মডেল একজন ইনস্ট্যান্স যেখানে কালো বাক্স আকারের ব্লক বাছাই করতে ভাবা যেতে পারে 2. তাদের আলগোরিদিম ব্যবহারহে(লগ)রাউন্ড গুলি, প্রতিটি রাউন্ডে 2-নির্বাচক কলিংহে()বার। (এন)2-সোর্টারগুলিরএকটি "রাউন্ড"সহজেই( √) দিয়ে সিমুলেটেড করা যায়O(nlogn)O(logn)O(n)O(n)O(n) সমর্থক। n
বিনায়ক পাঠক

6
@ বিনায়কপাঠক: ইনপুট ডেটা 2 into ভাঙা করুন 2Nআকারের অংশগুলি N/2 , এবং তারপর সাজানোর অংশ, AKS নেটওয়ার্কের ব্যবহার করে একটি সঙ্গে প্রতিটি comparator প্রতিস্থাপন পর -সর্টার। N
জেফি

1
@ জে ff ই: হ্যাঁ, দুর্দান্ত, এটি অবশ্যই আমার নির্মাণের চেয়ে সহজ দেখাচ্ছে।
বিনায়ক পাঠক

1
@ Jɛ ff E, আপনার মন্তব্যগুলির উত্তর হতে পারে। :)
কাভেঃ

উত্তর:


15

এটা দিয়ে সাজাতে সম্ভব ব্ল্যাক বক্সে কল করে এবং কোনও তুলনা করে।O(nlogn)

প্রথমে নীচের সুষম পার্টিশন সমস্যাটি বিবেচনা করুন: প্রদত্ত উপাদানগুলি A [ 1 .. মি ] (যেখানেmA[1..m]), তাদের দুটি গ্রুপে ভাগ করুন, মাপের সর্বনিম্ন কমপক্ষেm/4, যাতে প্রথম গ্রুপের সমস্ত উপাদান দ্বিতীয় গ্রুপের সমস্ত উপাদানের চেয়ে ছোট হয়। এটি(এম/ √) দিয়ে করা যেতে পারেnmnm/4ব্ল্যাক বক্সে কল করুন। (আমি এটি পরে বর্ণনা করব)) তারপরে এই বিভাজন অ্যালগরিদমের সাহায্যে কুইকোর্ট ব্যবহার করুন:O(m/n)

def qsort(A[1..m]):
   if m < sqrt(n): sort A with one call to the black box
   else:
     Partition A[1..m] into two groups as described above.
     Recursively qsort the first group.
     Recursively qsort the second group.

প্রতিটি পার্টিশন পদক্ষেপ ধরে নেওয়া কালো বাক্স, উপরোক্ত অ্যালগরিদম প্রদত্ত ইনপুট কলএকটি[1 ..এন], করতে হবেহে(O(m/n)A[1..n]ব্ল্যাক বক্সে কল করে, কারণ পুনরাবৃত্তি গাছের গভীরতা(লগএন) থাকেএবং গাছের প্রতিটি স্তরের মোট(এন/ √) থাকেO(nlogn)O(logn)O(n/n)=O(n) ব্ল্যাক বক্সে কল করুন।

পার্টিশনের ধাপটি নিম্নরূপ করুন:

def partition(A[1..m]):  (where sqrt(n) <= m <= n)
   Divide A into m/sqrt(n) groups of size sqrt(n) each.
   Sort each group with one call to the black box per group.
   Sort the medians of the groups with one call to the black box.
   (Note the number of groups is less than sqrt(n), because m <= n.)
   Let X be the median of the medians.
   Partition all m elements around X, using the black box as follows:
      For each group G, let Y be its median:
        Call the black box once on (G - {Y}) union {X}.
        (This gives enough information to order all elts w.r.t. X.)

অ্যালগরিদম পার্টিশনের শেষ ধাপে (): "এক্স এর আশেপাশে সমস্ত এম উপাদানকে পার্টিশন করা", এটি কি আরও অতিরিক্ত তুলনা ব্যবহার করবে না?
বিনায়ক পাঠক

2
অ্যালগোরিদমের ঠিক পরে লাইনটি দেখুন, এটি কীভাবে এই পদক্ষেপটি করবেন তা ব্যাখ্যা করে। আরও পরিষ্কার করার জন্য আমি এডিট করব।
নিল ইয়ং

24

আমি মনে করি আপনার প্রশ্নটি 1990 এর আগে থেকে বেইগেল এবং গিলের কাগজে " কে-সর্টার ব্যবহার করে এন অবজেক্টগুলি বাছাই করা " তে সম্বোধন করা হয়েছিল এবং কাগজের বিমূর্তিটি এ সব বলেছে:

nlognklogk4nlognklogk


Thank you. I couldn't find the paper. Can you provide the link to the paper or its proof?
AmeerJ


Also on citeseerx.
Kaveh

8
Note that when k=n, Beigel and Gill's bound is Θ(n).
Jeffε

12

It is possible to sort obliviously with O(nlogn) calls to the black box, each applied to a contiguous subarray of the original input. The algorithm never touches the input data except through black-box calls. In particular, the same sequence of black-box calls is only a function of n, not the actual input data (hence "oblivious").

Here is a sketch of a simpler algorithm, which uses a black box that sorts subarrays of size k instead of just n. The total number of calls to the black box is roughly 2(n/k)2. For notational simplicity, assume that k is even and 2n/k is an odd integer.

BlockBubbleSort(X[0..n-1], k):
   m = floor(n/k)
   for i = 1 to m
      for j = 0 to m-1
          BlackBoxSort(X[j*k .. (j+1)*k-1])
      for j = 0 to m-1
          BlackBoxSort(X[j*k + k/2 .. (j+1)*k + k/2 - 1])

Here is a diagram of the algorithm for n=18 and k=4. Data travels from left to right; each box is a k-sorter.

enter image description here

As the figure hopefully suggests, this algorithm breaks the input array into chunks of size k/2, and then applies bubblesort to the chunks, using the k-sorter in place of a compare-exchange operation. Correctness follows by observing that the network correctly sorts any array of 0s and 1s.

As @VinayakPathak's comment suggests, the O((n/k)2) bound can be reduced by replacing bubblesort with a different sorting network. For example, Batcher's even-odd mergesort reduces the number of black-box calls to O((n/k)log2(n/k))=O(nlog2n), and the AKS sorting network reduces it to O((n/k)log(n/k))=O(nlogn). This last algorithm matches Neal's non-oblivious algorithm up to (large!!) constant factors.


thanks. Can a Ω(n lg(n)) lower bound be proved?
AmeerJ

2
No, Biegel and Gill's paper implies an upper bound of O(n).
Jeffε

+1 for that nice picture! I may be mistaken but it seems to me that it is not entirely correct (correct me if I'm wrong). Assuming the output is in ascending order, if the smallest element is in the last position there is no "path" for it to "travel" to the first position. Changing "for i = 1 to m" to "for i = 1 to m+1" seems to correct this, although it might introduce some unnecessary overhead.
George

@George Oops, you're right; I need one more layer!
Jeffε
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.