Новий алгоритм. Чому саме алгоритм неспокійного алмазу?


15

Я не можу зрозуміти, чому сукупність вважається алгоритмом сортування за місцем .

Я маю на увазі додаткову структуру даних, заповнену елементами масиву, який слід сортувати, тобто купу, що використовується для сприяння вилученню мінімального значення та процесу сортування.

То, може, я не розумію тут визначення місця?

Але для сортування вставки, наприклад, очевидно, що це алгоритм замість, тобто не потрібна додаткова пам'ять для елементів.

То чому це вважається мінливим?

Відповіді:


12

Я маю на увазі додаткову структуру даних, заповнену елементами масиву, який слід сортувати, тобто купу, що використовується для сприяння вилученню мінімального значення та процесу сортування.

Ні. Масив перетворюється таким чином, щоб він відповідав обмеженню купи, не використовуючи більше (1) додаткової пам'яті. (Насправді все, що вам потрібно, - це додаткова пам'ять, достатня для вміщення одного елемента масиву для цілей свопінгу, плюс булева або два та змінна циклічна або дві).

Гаразд, з технічної точки зору, можливо, погруддя зазвичай пояснюється як використання окремої купи, але це цілком можливо реалізувати на місці.


3
Єдине місце, де я б очікував побачити "кучу" з окремою купою (в коді), є такою функціональною мовою, як Haskell, з тієї ж причини, що звичайний функціональний "Quicksort" теж не на місці - такі функціональні програмісти, як їх списків дуже багато, а на місці сортування є релевантним - це змінює стан масиву / що б не містило дані. Котирування лякань, тому що я насправді не приймаю, що позашляховий кікспорт - це взагалі кікспорт, або що позамісний куртка - це взагалі гипсорт - принаймні, не без чіткого твердження, що це не " місце.
Steve314

1
@ Steve314, я думаю, я бачив якийсь навчальний матеріал, який щось говорить про те, що "покладіть його в купу, а потім витягніть елементи один за одним і покладіть їх у масив". Але тільки перевіривши CLR, я можу повідомити, що вони показують на місці версію.
Пітер Тейлор

2
@PeterTaylor: Так, книга, яку я рецензував (Скіена), представила велику частину, створивши додаткову купу.
user10326

4

Можливо, вам не вистачає принципового розуміння того, що масив може бути використаний для визначення компонування дерева.

Припустимо, у вас є двійкове дерево, а внутрішній вузол знаходиться в індексі i масиву. Тоді індекс масиву батьків і дітей цього вузла можна знайти за:

Parent(i) = floor(i/2)
Left child(i) = 2i
Right child(i) = 2i + 1

Побачити:

http://www.personal.kent.edu/~rmuhamma/Algorithms/MyAlgorithms/Sorting/heapSort.htm

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


: Я знаю про це. Здається, проблеми полягають у тому, що книга, яку я читаю, була представлена ​​великою сумою за допомогою окремої купи. Я не розумів і не вважав, що ця презентація спростить розуміння алгоритму (можливо, не впевнений, чому це було представлено так)
user10326

Я настійно рекомендую придбати книгу "Вступ до алгоритмів" Cormen та ін. Він чітко відповідає на всі питання, пов'язані з алгоритмом. Якщо ви серйозно ставитеся до кар'єри вченого-комп’ютера чи інженера-програмного забезпечення, тоді вам потрібно мати цю книгу.
stackoverflowuser2010

1

Якщо, як ви кажете, дійсно потрібна була додаткова структура для складання купи, то нагромадження дійсно НЕ було б алгоритмом сортування за місцем.

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


В основному, існує алгоритм "heapify", який використовується для переупорядкування даних у масиві, щоб він відповідав правилам купи за IIRC O (n) час. Див псевдокод на programmers.stackexchange.com/questions/116904 / ... . Після цього, головним чином, справа в тому, щоб робити повторні видобутки коріння і відстежувати, скільки масиву все ще "купи" і скільки сортується кінцевий результат.
Steve314

0

В інформатиці алгоритм на місці (або латинською мовою in situ) - це алгоритм, який перетворює вхід, використовуючи структуру даних з невеликою постійною кількістю додаткового простору. Введення, як правило, перезаписується виведенням під час виконання алгоритму. Алгоритм, який не стоїть на місці, іноді називають не на місці або на місці.

Вікіпедія - алгоритм на місці


Тож чому злиття вважається тоді не алгоритмом?
користувач10326

3
Це не корисна відповідь. Це не має нічого спільного з гипсокартом і не відповідає на питання.
stackoverflowuser2010

Звичайно, це має щось спільне із сукупністю. Heapsort - це алгоритм сортування на місці, як це повинно бути зрозуміло з визначення. Насправді це було пов’язано зі сторінки обвалу.
Рейн Генріхс

0

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

Найкращий спосіб проілюструвати відмінності між місцевими алгоритмами та нестатими алгоритмами - це, мабуть, переглянути наступний код обертання рядків C / C ++, який робить це на місці (від K&R):

void reverse(char s[])
{
      int c, i, j;

      for (i = 0, j = strlen(s)-1; i < j; i++, j--) {
         c = s[i];
         s[i] = s[j];
         s[j] = c;
      }
}

Якби ви, наприклад, читали вхідний рядок з кінця і поміщали символи в інший буфер, це був би алгоритм обертання рядків поза місцем.


1
Mergesort проклятий дратівливим - легко неправильно переконати себе, що у вас є стратегія на місці. Зазвичай він працює лише для невеликих масивів. Тим НЕ менше, я думаю , що я скачав папір раз , коли хто - то зробило розробить варіант на місці алгоритму злиття-сортуванні. Я побачу, чи зможу його знову знайти.
Steve314
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.