"Майже сортування" цілих чисел у лінійному часі


16

Мене цікавить сортування масиву позитивних цілих значень за лінійним часом (у моделі ОЗУ з рівномірною мірою витрат, тобто цілі числа можуть мати до логарифмічного розміру, але арифметичні операції на них, як передбачається, приймають одиниця часу). Звичайно, це неможливо з алгоритмами сортування на основі порівняння, тому мені цікаво обчислити "приблизний" сорт, тобто обчислити деяку перестановку з , який на самому ділі не сортується в цілому , а «добре наближення» з відсортованої версії . Я буду припускати, що ми сортуємо цілі числа у порядку зменшення, оскільки це робить продовження трохи приємніше констатувати, але, звичайно, можна було б вирішити проблему навпаки.L=v1,,vnvσ(1),,vσ(n)LL

Одним із можливих критеріїв приблизного сортування є такий (*): нехай є , для кожного нам потрібно, щоб (тобто, список "квазісортизованих" обмежується зверху функцією зменшення ). Неважко помітити, що фактичний сорт задовольняє цьому: має бути не більшим, ніж тож воно є не більше що є , і взагалі має бути не більше що \ leq N / iNivi1invσ(i)N/iiN/ivσ(2)vσ(1)(vσ(1)+vσ(2))/2N/2vσ(i)(jivσ(i))/iN/i.

Наприклад, вимога (*) може бути досягнута алгоритмом, наведеним нижче (запропонований @Louis). Моє запитання: чи існує робота над цим завданням "майже сортування" цілих чисел за лінійним часом, нав'язуючи якусь вимогу на зразок (*), яку би задовольнив реальний сорт? Чи має алгоритм нижче, чи якийсь його варіант, встановлену назву?

Правка: виправлено алгоритм та додано більше пояснень


Алгоритм:

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. Якщо елемент v знаходиться у відрі j то vN/j .

    v покладено у відроj=min(N/v,n) , таким чиномjN/vN/v

  2. Якщо елемент знаходиться у відрі то або або . vjN/(j+1)<vj=n

    vj = min ( N / v , n ) j = N / v j = n j = N / v j N / v < j + 1 N / ( j + 1 ) < v поміщається у відро , таким чином або . У першому випадку що означає і, таким чином, .j=min(N/v,n)j=N/vj=nj=N/vjN/v<j+1N/(j+1)<v

  3. Для у відрах є, щонайбільше, елементів, від 1 до .j<njj

    Нехай і - загальна кількість елементів в одному з відрів 1..j. За 2. маємо, що кожен елемент відра (при ) такий, що . Тому сума усіх елементів у відрах від до більша, ніж . Але ця сума також менша, ніж таким чином і, таким чином, що дає нам або .j<nkviijN/(j+1)N/(i+1)<vK1jk×N/(J+1)KNk×N/(j+1)<KNk/(j+1)<1k<j+1kj

  4. T задовольняє (*), тобто -й елемент такий, щоjTT[j]N/j

    За 3. маємо, що , -й елемент , походить з відра з тому .T[j]jTiijT[j]N/iN/j

  5. Цей алгоритм займає лінійний час.

    Обчислення займає лінійний час. Відра можуть бути реалізовані за допомогою пов'язаного списку, який має введення та ітерацію . Вкладений цикл працює стільки разів, скільки є елементів (тобто разів).NO(1)n


1
Не відмовлятись від питання (+1, це добре), але чи не радіас сортування зробить більше того, що вам потрібно?
користувач541686

@Mehrdad: Дякуємо за ваш коментар! Сортування Radix буде сортувати цілі числа, але це займе час . O(nlog(maxivi))
a3nm

Не могли б ви прокоментувати те, що саме небажано в тій часовій складності? У вас є одне дуже велике ціле число, а все інше мале, наприклад?
користувач541686

1
@ a3nm сортировка radix не є O (n log n), це O (n), отже, лінійна, якщо розмір цілих чисел фіксований, наприклад, 32 біт чисел або 64 біт чисел. Чи мають впорядковані вами номери змінний розмір?
Xavier Combelle

1
@XavierCombelle: Так, я працюю в моделі оперативної пам'яті, і не можу припустити, що вхідні цілі обмежуються постійною.
a3nm

Відповіді:


8

Це дуже схоже на алгоритм ASort. Дивіться цю статтю Giesen et. ін .:

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

На жаль, час роботи не зовсім лінійний. Стаття вище доводить, що будь-який рандомізований алгоритм на основі порівняння ранжирує елементів у межах має нижню межу (припускаючи ).nn2/ν(n)nlog(ν(n))ν(n)<n


EDIT , відповідаючи на пояснення у запитанні:

Те, що ви робите, - це просто відро . Однак алгоритм сортування відра в даному випадку не лінійний. Проблема: ви повинні підсумувати натуральні числа, а потім виконати ділення на кожне з них. Оскільки цифри не обмежені за величиною, вже не є операцією постійного часу. Знадобиться більше часу, щоб виконати більше цифр, які потрібно підсумувати.N/V[i]

Наскільки довше? Ділення залежить від кількості цифр, тому це , разів операцій ділення. Це, мабуть, звучить знайомо. :)lg(n)n


1
Дякуємо, що вказали нам на цю статтю! Дійсно, це трохи пов'язане з питанням. Однак мій алгоритм (ні оригінальна версія, ні дещо інша переглянутий варіант) не настільки схожий на ASort ;. По-перше, я вважаю, що мій алгоритм працює в , а не в надлінійний час, як ASort. По-друге, критерій (*) сильно відрізняється від наближення відстані до підніжжя Спірмена; наприклад, критерій (*) більш-менш жорсткий залежно від значень цілих чисел, на відміну від відстані опори. По-третє, незалежно від того, що і наш алгоритм, і ASort є елементарними елементами, критерії є досить різними. O(n)
a3nm

@ a3nm Роз'яснення того, що ви розмістили вище, говорить про те, що ви використовуєте сортування відра , яке є лінійним (а не на основі порівняння, що означає тестування двох предметів один проти одного). Проблема в тому, що вона працює не для всіх математичних цілих чисел. Він працює лише в тому випадку, якщо цілий розмір обмежений.
Волк Trixie

Коли ви говорите "Це працює лише в тому випадку, якщо цілий розмір обмежений", я думаю, що це справедливо лише в тому випадку, якщо я насправді сортував цілі числа. Але загалом алгоритм, який я розмістив, насправді їх не сортує, він лише застосовує слабший критерій (*). Тому я думаю, що він працює в лінійний час, навіть коли цілий розмір не обмежений.
a3nm

2
@ a3nm Це не лінійно. Дивіться мою розгорнуту відповідь вище.
Trixie Wolf

Дякую за відповідь і вибачте за затримку. Я думаю, що в моделі є певна плутанина. Я працюю в моделі оперативної пам’яті з рівномірною мірою часу (як у Ван Емде Боас, Моделі машин та моделювання, у Підручнику з обчислень): тому числа, якими я маніпулюю, можуть мати логарифмічний розмір, але арифметичні операції на цих числах мають одиничну вартість. Я відповідно відредагував своє запитання. Я думаю, що в цій моделі алгоритм, який я пропоную, дійсно працює в лінійний час (але, звичайно, у цій моделі застосовується нижня межа для фактичного порівняння на основі порівняння). nlogn
a3nm

2

Як виявляється, моє питання зрештою неактуальне. Дійсно, я працюю на машині оперативної пам’яті з рівномірною мірою витрат (тобто, у нас є регістри, регістри яких не обов'язково мають постійний розмір, але можуть зберігати цілі числа логарифмічного розміру на вході не більше, а операції з цими регістрами займають постійний час, в т.ч. принаймні доповнення). Насправді в цій моделі сортування цілих чисел (по суті, виконуючи радіаційне сортування) можна проводити за лінійним часом. Це пояснюється у статті 1996 року Грандженом, Сортування, лінійний час та проблема задоволення .

(Це не дає відповіді на моє запитання про те, чи є добре вивчені поняття "майже сортування" набору цілих чисел, але для того, щоб вони були цікавими, напевно, знадобиться, щоб ці слабкіші поняття було легше застосувати, тобто працювати над слабшими модель або якимось чином працює в підлінійний час. Однак, на даний момент я не знаю, в якому сенсі це було б так.)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.