Алгоритм злиття: відмінності між версіями

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку
[неперевірена версія][неперевірена версія]
Вилучено вміст Додано вміст
вікіфікація, шаблон
Gromko (обговорення | внесок)
Немає опису редагування
Рядок 1: Рядок 1:
'''Алгоритми злиття''' — це родина алгоритмів, які використовують декілька відсортованих списків як вхідні дані та створюють єдиний вихідний список, що містить усі елементи списків входів у впорядкованому порядку. Ці алгоритми використовуються як підпрограми в різних алгоритмах сортування, найбільш відомі з них сортування злиттям.
'''Алгоритми злиття''' - це родина алгоритмів, які використовують декілька відсортованих списків як вхідні дані та створюють єдиний вихідний список, що містить усі елементи списків входів у впорядкованому порядку. Ці алгоритми використовуються як підпрограми в різних алгоритмах сортування, найбільш відомі з них сортування злиттям.


== Застосування ==
== Застосування ==
Рядок 5: Рядок 5:
Алгоритм злиття відіграє важливу роль в алгоритмі сортування злиттям, алгоритмі сортування на основі порівняння. Концептуально алгоритм сортування злиттям складається з двох етапів:
Алгоритм злиття відіграє важливу роль в алгоритмі сортування злиттям, алгоритмі сортування на основі порівняння. Концептуально алгоритм сортування злиттям складається з двох етапів:


# Рекурсивно розділяємо список на підсписки приблизно однакової довжини, поки кожен підсписок буде містити лише один елемент, або у випадку ітеративного (знизу вгору) сортування злиттям розгляньте список з ''n'' елементів як ''n'' підсписків розміром 1. Список, що містить один елемент, за визначенням впорядкований.
# Рекурсивно розділяємо список на підсписки приблизно однакової довжини, до тих пір, доки кожен підсписок буде містити лише один елемент, або у випадку ітеративного (знизу вгору) сортування злиттям розглядається список з ''n'' елементів як ''n'' підсписків розміром 1(будь-який список довжини 1 можна вважати впорядкованим).
# Послідовно об'єднуйте підсписки, щоб створити новий впорядкований підсписок, поки єдиний список буде містити усі елементи. Єдиний список — це впорядкованийй список.
# Послідовно об’єднуємо підсписки, щоб створити новий впорядкований підсписок - на кожному кроці ми беремо менший з двох перших елементів підсписків і записуємо його в результуючий список. Лічильники номерів елементів результуючого списку і підсписку, з якого було взято елемент, збільшуємо на 1.
#Коли один з підсписків вичерпався, додаємо всі елементи, що залишилися з другого підсписку в результуючий список.
#Якщо результуючий список буде містити усі елементи - це впорядкованийй список.


Алгоритм злиття використовується неодноразово в алгоритмі сортування злиттям.
Алгоритм злиття використовується неодноразово в алгоритмі сортування злиттям.


Приклад сортування злиття наведено на ілюстрації. Починається з невпорядкованого масиву з 7 цілих чисел. Масив розділений на 7 частин; кожна частина містить 1 елемент і впорядковується. Потім відсортовані частини об'єднуються для отримання більших, відсортованих частин, поки не залишиться 1, відсортований масив.
Приклад сортування злиття наведено на ілюстрації. Починається з невпорядкованого масиву з 7 цілих чисел. Масив розділений на 7 частин; кожна частина містить 1 елемент і впорядковується. Потім відсортовані частини об'єднуються для отримання більших, відсортованих частин, поки не залишиться 1, відсортований масив.


Алгоритм був винайдений [[Джон фон Нейман|Джоном фон Нейманом]] в 1945 році<ref>{{Cite book
{{Алгоритми сортування}}
|url=https://www.worldcat.org/oclc/823849
{{перекласти}}
|title=The art of computer programming
{{Algorithms-stub}}
|last=Knuth, Donald Ervin, 1938-
|date=©1973-©1981
|publisher=Addison-Wesley Pub. Co
|location=Reading, Mass.
|isbn=0-201-03809-9
|oclc=823849
}}</ref> під час роботи над "[[Мангеттенський проєкт|Манхеттенським проектом]]" як засіб обробки великих масивів статистичних даних.


== Об'єднання двох списків ==
Об'єднання двох впорядкованих списків в один може бути зроблено в лінійному часу і лінійної або постійного простору (в залежності від моделі доступу до даних). Наведений нижче псевдокод демонструє алгоритм, який реалізує злиття вхідних списків (або пов'язані списки або масиви) А і В у новий список С<ref>{{Cite book
|url=https://www.worldcat.org/oclc/272306813
|title=Algorithms and data structures : the basic toolbox
|last=Mehlhorn, Kurt, 1949-
|date=2008
|publisher=Springer
|location=Berlin
|isbn=978-3-540-77978-0
|oclc=272306813
}}</ref><ref>{{Cite book
|title=Practical in-place mergesort
|last=Katajainen, Jyrki; Pasanen, Tomi; Teuhola, Jukka
|first=
|year=1996
|publisher=Nordic J. Computing
|location=3 (1)
|pages=27–40
|language=
|isbn=
}}</ref>

head() - дає перший елемент списку;

append - додає елемент до списку;

drop - вилучає перший елемент списку зі збільшенням покажчика або індексу.

'''algorithm''' merge(A, B) '''is'''
'''inputs''' A, B : list
'''returns''' list
C := new empty list
'''while''' A is not empty and B is not empty '''do'''
'''if''' head(A) ≤ head(B) '''then'''
append head(A) to C
drop the head of A
'''else'''
append head(B) to C
drop the head of B
''// By now, either A or B is empty. It remains to empty the other input list.''
'''while''' A is not empty '''do'''
append head(A) to C
drop the head of A
'''while''' B is not empty '''do'''
append head(B) to C
drop the head of B
'''return''' C

== Підтримка в мовах програмування ==
Деякі мови програмування мають вбудовані або бібліотечні функції підтримки для об'єднання упорядкованих колекцій.

=== C ++ ===
Стандартна бібліотека шаблонів С ++ має функцію '''<code>std::merge</code>''', яка об'єднує два упорядковано діапазони ітератори і <code>'''std:: inplace_merge'''</code>, який об'єднує два послідовних відсортованих діапазонів в місці. Крім того, '''<code>std::list</code>''' (зв'язаний список) клас має свій власний метод об'єднання, який об'єднує ще один список в себе. Тип елементів злиті повинен підтримувати менш ніж оператор (<), або вона повинна бути забезпечена за допомогою призначеного для користувача компаратора.

C ++ 17 дозволяє відрізняючись політики виконання, а саме послідовні, паралельні і паралельно-unsequenced. [9]

=== Python ===
Стандартна бібліотека мови Python (з 2.6) також має функцію злиття в модулі '''<code>heapq</code>''', який приймає кілька відсортованих ітеріруемий, і об'єднують їх в єдиний итератор. [10]

== Дивіться також ==
[[Категорія:Алгоритми сортування]]
[[Категорія:Алгоритми сортування]]

Версія за 15:05, 13 листопада 2020

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

Застосування

Сортування злиттям

Алгоритм злиття відіграє важливу роль в алгоритмі сортування злиттям, алгоритмі сортування на основі порівняння. Концептуально алгоритм сортування злиттям складається з двох етапів:

  1. Рекурсивно розділяємо список на підсписки приблизно однакової довжини, до тих пір, доки кожен підсписок буде містити лише один елемент, або у випадку ітеративного (знизу вгору) сортування злиттям розглядається список з n елементів як n підсписків розміром 1(будь-який список довжини 1 можна вважати впорядкованим).
  2. Послідовно об’єднуємо підсписки, щоб створити новий впорядкований підсписок - на кожному кроці ми беремо менший з двох перших елементів підсписків і записуємо його в результуючий список. Лічильники номерів елементів результуючого списку і підсписку, з якого було взято елемент, збільшуємо на 1.
  3. Коли один з підсписків вичерпався, додаємо всі елементи, що залишилися з другого підсписку в результуючий список.
  4. Якщо результуючий список буде містити усі елементи - це впорядкованийй список.

Алгоритм злиття використовується неодноразово в алгоритмі сортування злиттям.

Приклад сортування злиття наведено на ілюстрації. Починається з невпорядкованого масиву з 7 цілих чисел. Масив розділений на 7 частин; кожна частина містить 1 елемент і впорядковується. Потім відсортовані частини об'єднуються для отримання більших, відсортованих частин, поки не залишиться 1, відсортований масив.

Алгоритм був винайдений Джоном фон Нейманом в 1945 році[1] під час роботи над "Манхеттенським проектом" як засіб обробки великих масивів статистичних даних.

Об'єднання двох списків

Об'єднання двох впорядкованих списків в один може бути зроблено в лінійному часу і лінійної або постійного простору (в залежності від моделі доступу до даних). Наведений нижче псевдокод демонструє алгоритм, який реалізує злиття вхідних списків (або пов'язані списки або масиви) А і В у новий список С[2][3]

head() - дає перший елемент списку;

append - додає елемент до списку;

drop - вилучає перший елемент списку зі збільшенням покажчика або індексу.

algorithm merge(A, B) is
    inputs A, B : list
    returns list

    C := new empty list
    while A is not empty and B is not empty do
        if head(A) ≤ head(B) then
            append head(A) to C
            drop the head of A
        else
            append head(B) to C
            drop the head of B

    // By now, either A or B is empty. It remains to empty the other input list.
    while A is not empty do
        append head(A) to C
        drop the head of A
    while B is not empty do
        append head(B) to C
        drop the head of B

    return C

Підтримка в мовах програмування

Деякі мови програмування мають вбудовані або бібліотечні функції підтримки для об'єднання упорядкованих колекцій.

C ++

Стандартна бібліотека шаблонів С ++ має функцію std::merge, яка об'єднує два упорядковано діапазони ітератори і std:: inplace_merge, який об'єднує два послідовних відсортованих діапазонів в місці. Крім того, std::list (зв'язаний список) клас має свій власний метод об'єднання, який об'єднує ще один список в себе. Тип елементів злиті повинен підтримувати менш ніж оператор (<), або вона повинна бути забезпечена за допомогою призначеного для користувача компаратора.

C ++ 17 дозволяє відрізняючись політики виконання, а саме послідовні, паралельні і паралельно-unsequenced. [9]

Python

Стандартна бібліотека мови Python (з 2.6) також має функцію злиття в модулі heapq, який приймає кілька відсортованих ітеріруемий, і об'єднують їх в єдиний итератор. [10]

Дивіться також

  1. Knuth, Donald Ervin, 1938- (©1973-©1981). The art of computer programming. Reading, Mass.: Addison-Wesley Pub. Co. ISBN 0-201-03809-9. OCLC 823849.
  2. Mehlhorn, Kurt, 1949- (2008). Algorithms and data structures : the basic toolbox. Berlin: Springer. ISBN 978-3-540-77978-0. OCLC 272306813.
  3. Katajainen, Jyrki; Pasanen, Tomi; Teuhola, Jukka (1996). Practical in-place mergesort. 3 (1): Nordic J. Computing. с. 27—40.