লিনিয়ার সময়ে পূর্ণসংখ্যার "প্রায় বাছাই করা"


16

আমি লিনিয়ার সময়ে L=v1,,vn এর ধনাত্মক পূর্ণসংখ্যার মানগুলিকে বাছাই করতে আগ্রহী (অভিন্ন ব্যয় পরিমাপের র‌্যাম মডেলের মধ্যে, মানে, পূর্ণসংখ্যার লোগারিথমিক আকার হতে পারে তবে তাদের গাণিতিক ক্রিয়াকলাপগুলি ধরে নেওয়া হয়) ইউনিট সময় নিতে)। অবশ্যই, তুলনা-ভিত্তিক বাছাইকরণ অ্যালগরিদমগুলির সাথে এটি অসম্ভব, সুতরাং আমি একটি "আনুমানিক" সাজানোর গণনা করতে আগ্রহী, অর্থাত্, কিছু ক্রিয়াকলাপ এর যা সত্যিই সাধারণ সাজানো নয় কিন্তু সাজানো সংস্করণের "ভালো পড়তা"vσ(1),,vσ(n)LL। আমি ধরে নেব যে আমরা সংখ্যাকে হ্রাস ক্রমে বাছাই করছি কারণ এটি সিক্যুয়ালটি কিছুটা রাজ্যকে আরও সুখকর করে তোলে, তবে অবশ্যই সমস্যাটিকে অন্যভাবে উপস্থাপন করতে পারে।

আনুমানিক ধরণের জন্য একটি সম্ভাব্য মানদণ্ড হ'ল: (*): N হতে দেওয়া ivi , প্রতি জন্য আমাদের সেই (যেমন) প্রয়োজন , "অর্ধ-সাজানো" তালিকাটি ক্রমহ্রাসমান ক্রিয়া ) দ্বারা উপরের দিকে আবদ্ধ । এটি সহজেই দেখতে পাওয়া যায় যে প্রকৃত বাছাই এটি সন্তুষ্ট করে: অবশ্যই চেয়ে বড় হওয়া উচিত না সুতরাং এটি সর্বাধিক যা , এবং সাধারণভাবে অবশ্যই than এর চেয়ে বড় হতে হবে না1invσ(i)N/iiN/ivσ(2)vσ(1)(vσ(1)+vσ(2))/2N/2vσ(i)(jivσ(i))/iযা ।N/i

উদাহরণস্বরূপ, প্রয়োজন (*) নীচের অ্যালগরিদম দ্বারা অর্জন করা যেতে পারে (@ লুইস দ্বারা প্রস্তাবিত)। আমার প্রশ্নটি হল: লিনিয়ার সময়ে পূর্ণসংখ্যার "প্রায় বাছাই" করার এই কার্যটিতে কি বিদ্যমান কাজটি (*) এর মতো কিছু প্রয়োজনীয়তা চাপিয়ে দিয়ে প্রকৃত বাছাইটি পূরণ করবে? নীচের অ্যালগরিদম বা এর কিছু বৈকল্পিকের একটি প্রতিষ্ঠিত নাম আছে?

সম্পাদনা: অ্যালগরিদম স্থির করে আরও ব্যাখ্যা যুক্ত করা হয়েছে


অ্যালগরিদম:

INPUT: V an array of size n containing positive integers
OUTPUT: T

N = Σ_{i<n} V[i]
Create n buckets indexed by 1..n
For i in 1..n
| Add V[i] into the bucket min(floor(N/V[i]),n)
+

For bucket 1 to bucket n
| For each element in the bucket
| | Append element to T
| +
+

এই অ্যালগরিদম নিম্নলিখিত কারণে উদ্দেশ্যে হিসাবে কাজ করে:

  1. একটি উপাদান যদি বালতি হয় তারপর । vjvN/j

    vj=min(N/v,n)jN/vN/v

  2. একটি উপাদান যদি বালতি হয় তারপর পারেন এন / ( + + 1 ) < বনাম বা = vjএন/(+ +1)<বনাম=এন

    বনাম বালতি রাখা হয়=সর্বনিম্ন(এন/বনাম,এন) , এইভাবে=এন/বনাম বা=এন । প্রথম ক্ষেত্রে=এন/বনাম যার মানেএন/বনাম<+ +1 এবং এইভাবেএন/(+ +1)<বনাম

  3. জন্য j<n , আছে, সর্বাধিক, j 1 থেকে বাকেট উপাদান j

    যাক j<n দিন k বাকেট 1..j এক উপাদান মোট সংখ্যা হবে। দ্বারা 2. আমরা যে প্রতিটি উপাদান আছে v একটি বালতি মধ্যে i (সঙ্গে ij ) যে এই ধরনের হয় N/(j+1)N/(i+1)<v । অতএব সমষ্টি K থেকে বাকেট সমস্ত উপাদানের 1 থেকে j চেয়ে বেশী k×N/(J+1). But this sum K is also less than N thus k×N/(j+1)<KN and thus k/(j+1)<1 which gives us k<j+1 or kj.

  4. T satisfies (*) i.e. the j-th element of T is such that T[j]N/j

    দ্বারা 3. আমরা যে আছে T[j] , j এর -th উপাদান T , একটি বালতি থেকে আসে i সঙ্গে ij অতএব T[j]N/iN/j

  5. এই অ্যালগরিদমটি রৈখিক সময় নেয়।

    N এর গণনা রৈখিক সময় নেয়। বালতিগুলি একটি লিঙ্কযুক্ত-তালিকার সাথে কার্যকর করা যেতে পারে যার মধ্যে O(1) সন্নিবেশ এবং পুনরাবৃত্তি রয়েছে। নেস্টেড লুপটি যতগুলি উপাদান রয়েছে ততবার চালিত হয় (যেমন n বার)।


1
Not to dismiss the question (+1, it's a good one) but wouldn't radix sort do more than what you need?
user541686

@Mehrdad: Thanks for your comment! Radix sort would sort the integers, but it would take time O(nlog(maxivi)).
a3nm

Could you comment on what exactly is undesirable about that time complexity? Do you have one very large integer and everything else is small, for example?
user541686

1
@ a3nm র‌্যাডিক্স সাজানটি ও (এন লগ এন) নয় এটি ও (এন) সুতরাং লিনিয়ার যদি পূর্ণসংখ্যার আকার স্থির থাকে তবে উদাহরণস্বরূপ 32 বিট সংখ্যা বা 64 বিট সংখ্যা। আপনি যে নম্বরগুলি বাছাই করেছেন তার পরিবর্তনশীল আকার রয়েছে?
জাভেয়ের কম্বেল

1
@ জাভিয়ারকোবেলে: হ্যাঁ, আমি র‌্যাম মডেলটিতে কাজ করছি এবং আমি অনুমান করতে পারি না যে ইনপুট পূর্ণসংখ্যা একটি ধ্রুবক দ্বারা আবদ্ধ।
a3nm

উত্তর:


8

এটি অনেকটা এ্যাসোর্ট অ্যালগরিদমের মতো শোনাচ্ছে। জিসেন এট এই নিবন্ধটি দেখুন। আল .:

https://www.inf.ethz.ch/personal/smilos/asort3.pdf

Unfortunately, the running time is not quite linear. The article above proves that any comparison-based randomized algorithm ranking n items within n2/ν(n) has a lower bound of nlog(ν(n)) (assuming ν(n)<n).


EDIT, in response to the clarifications in the question:

What you're doing is simply a bucket sort. However, the algorithm for bucket sort isn't linear in this case. The problem: you have to sum the natural numbers and then perform division on each one of them. Since the numbers are unbounded in size, N/V[i] is no longer a constant-time operation. It will take longer to perform the more numbers you need to sum.

How much longer? Division depends on the number of digits, so it's lg(n), times n division operations. That probably sounds familiar. :)


1
Thanks for pointing us to this article! Indeed it is a bit related to the question. However, my algorithm (neither the original version nor the slightly different revised version) is not so similar to ASort;. First, I believe my algorithm runs in O(n), not in superlinear time like ASort. Second, criterion (*) is pretty different from approximating Spearman's footrule distance; e.g., criterion (*) is more or less tight depending on the values of the integers, unlike the footrule distance. Third, althout both our algorithm and ASort are bucketing elements, the criteria are pretty different.
a3nm

@a3nm The clarification of what you posted above suggests you're using a bucket sort, which is linear (and not comparison-based, which means testing two items against each other). The problem is that it doesn't work for all mathematical integers. It only works if the integer size is bounded.
Trixie Wolf

When you say "It only works if the integer size is bounded", I think this is only true if I were actually sorting the integers. But in general the algorithm I posted does not actually sort them, it only enforces the weaker criterion (*). So I do think it runs in linear time even when the integer size is not bounded.
a3nm

2
@a3nm It isn't linear. See my expanded response above.
Trixie Wolf

Thanks for the answer, and sorry about the delay. I think there is some confusion about the model. I am working in the RAM model with uniform time measure (as in van Emde Boas, Machine Models and Simulations, in Handbook of Computation): so the numbers that I manipulate can have logarithmic size, but arithmetic operations on these numbers have unit cost. I have edited my question accordingly. I think that, in this model, the algorithm that I propose really runs in linear time (but of course in this model the nlogn lower bound for actual comparison-based sorting still applies).
a3nm

2

As it turns out, my question is quite irrelevant after all. Indeed, I am working on the RAM machine with uniform cost measure (i.e., we have registers whose registers are not necessarily of constant size but can store integers of logarithmic size in the input at most, and operations on these registers take constant time, including at least addition). And in fact, in this model, sorting integers (by essentially performing a radix sort) can be done in linear time. This is explained in the 1996 paper by Grandjean, Sorting, linear time and the satisfiability problem.

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

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