В інформатиці алгоритм на місці — це алгоритм, який працює безпосередньо над вхідною структурою даних, не вимагаючи додаткової пам'яті, пропорційної розміру вхідних даних. Інакше кажучи, він змінює вхідні дані на місці, не створюючи окремої копії структури даних. Алгоритм, який виконується не на місці, звуть алгоритмом з виконанням не на місці або поза місцем.
"Виконання на місці" може мати дещо інші значення. У найстрогішому варіанті це позначає алгоритм, що може мати лише сталу кількість додаткової пам'яті, враховуючи все, включно з викликами функцій і вказівниками. Однак цей варіант визначення – дуже обмежений, оскільки простий індекс масиву з довжиною n вимагає O(log n) бітів. У ширшому сенсі «виконання на місці» означає, що алгоритм не використовує додаткову пам'ять для роботи з вхідними даними, але може потребувати невелику, проте непостійну додаткову ділянку пам'яті для своєї роботи. Зазвичай ця ділянка має розмір O(log n), хоча іноді допускається будь-що в межах o(n). Зауважте, що складність за пам'яттю також має різноманітні варіанти щодо того, рахувати чи ні довжини індексів як частину використаної пам'яті. Нерідко складність за пам'яттю задається відносно кількості необхідних індексів або вказівників, ігноруючи їх розрядність. Ця стаття звертається до загальної складності пам'яті (Детермінованого простору), що враховує розрядності вказівників. Тому вимоги до пам'яті тут мають додатковий коефіцієнт log n порівняно з аналізом, який ігнорує довжину індексів і вказівників.
Алгоритм може враховувати вхідні дані як частину використання пам'яті. Оскільки алгоритми на місці зазвичай перезаписують вхідні дані вихідними, додаткова пам'ять не потрібна. Коли запис виводу відбувається в пам’ять, доступну лише для запису, або в потік, можливо, доречніше враховувати лише робочу пам'ять алгоритму. У теоретичних застосуваннях, таких як скорочення лог-простору, більш типово ігнорувати вихідну пам'ять (у таких випадках більш важливо, щоб вихідна пам'ять була доступна лише для запису).
Приклади
Дано масив a
з n елементів; припустімо, що потрібен масив, який містить ті самі елементи у зворотному порядку, а вихідний масив – усунути. Один, здавалося б, простий спосіб зробити це — створити новий масив такого ж розміру, заповнити його копіями з a
у відповідному порядку, а потім видалити a
.
функція розвернути(a[0..n - 1]) виділити b[0..n - 1] для i від 0 до n - 1 b[n − 1 − i] := a[i] повернути b
На жаль, це вимагає O(n) додаткової пам'яті для того, щоб масиви a
і b
були доступними одночасно. Крім того, виділення та звільнення пам'яті нерідко є повільними операціями. Оскільки масив a
більше не потрібен, його можна перезаписати його власним реверсом за допомогою алгоритму на місці, якому знадобиться лише постійне число (2) цілих чисел для допоміжних змінних i
та tmp
, незалежно від того, наскільки великим є масив.
функція розвернути_на_місці(a[0..n-1]) для i від 0 до округлити((n-2)/2) tmp := a[i] a[i] := a[n − 1 − i] a[n − 1 − i] := tmp
Як інший приклад, чимало алгоритмів сортування змінює порядок у масивах на відсортований на місці, серед них: бульбашкове сортування, гребінчасте сортування, сортування вибіркою, сортування вставлянням, сортування купою та сортування Шелла. Ці алгоритми потребують лише кілька вказівників, тому їх складність за пам'яттю – O(log n).
Швидке сортування працює з даними, які потрібно відсортувати, на місці. Однак воно потребує O(log n) місця на стеку для вказівників, щоб відстежувати підмасиви у стратегії «розділяй і володарюй». Отже, швидке сортування потребує O(log2n) додаткової пам'яті. Попри те, що ця ділянка несталого розміру технічно виводить швидке сортування з категорії алгоритмів з виконанням на місці, швидке сортування та інші алгоритми, які потребують лише O(log n) додаткових вказівників, зазвичай вважаються алгоритмами на місці.
Більшість алгоритмів пошуку також є алгоритмами з виконанням на місці, хоч деякі з них значно змінюють вхідний масив у процесі пошуку кінцевого результату постійного розміру.
Деякі алгоритми обробки тексту, такі як та розвертання, можуть виконуватися на місці.
У теорії обчислювальної складності
У теорії складності обчислень строге визначення алгоритмів на місці включає всі алгоритми зі складністю за пам'яттю O(1), клас DSPACE (1). Цей клас дуже обмежений; це дорівнює регулярним мовам. Фактично, він навіть не вміщає жодного з перерахованих вище прикладів.
Алгоритми зазвичай розглядаються в L, класі проблем, які потребують O(log n) додаткової пам'яті, щоб бути алгоритмами з виконанням на місці. Цей клас більше відповідає практичному визначенню, оскільки допускає числа розміром n – вказівники чи індекси. Однак це розширене визначення все одно виключає швидке сортування — через його рекурсивні виклики.
Визначення алгоритмів з виконанням на місці за класом L має деякі цікаві наслідки; наприклад, це означає, що існує (досить складний) алгоритм на місці, призначений для визначення того, чи існує шлях між двома вузлами в неорієнтованому графі , — це проблема, яка вимагає O(n) додаткової пам'яті з використанням типових алгоритмів, таких як пошук у глибину (біт відвідування для кожного вузла). Це, своєю чергою, веде до алгоритмів з виконанням на місці для таких проблем, як з'ясування того, чи є граф двочастковим, або перевірка того, чи два графи мають однакову кількість компонент зв'язності.
Роль випадковості
У багатьох випадках вимоги до пам'яті для алгоритму можна суттєво скоротити за допомогою рандомізованого алгоритму. Наприклад, якщо хтось хоче знати, чи дві вершини в графі з n вершин знаходяться в одній компоненті зв'язності графа, не існує відомого простого детермінованого алгоритму на місці для визначення цього. А проте, якщо просто почати з однієї вершини й виконати випадкове блукання з близько 20n3 кроків, то ймовірність того, що зустрінеться друга вершина, за умови, що вона знаходиться в тій же компоненті, дуже висока. Подібним чином, є прості рандомізовані алгоритми на місці для перевірки простоти, такі як тест на простоту Міллера-Рабіна, а також є прості алгоритми випадкового факторування на місці, такі як P-алгоритм Поларда.
У функційному програмуванні
Функційні мови програмування нерідко не заохочують або не підтримують явні алгоритми на місці, які перезаписують дані, оскільки це різновид побічного ефекту; натомість вони дозволяють лише створювати нові дані. Проте добрі компілятори функційної мови нерідко розуміють, коли створюється об’єкт, дуже схожий на наявний, а потім старий викидається, і оптимізують це до внесення простих змін «за лаштунками».
Зауважте, що в принципі можливо створювати алгоритми з виконанням на місці, які не змінюють дані (якщо тільки ці дані більше ніде не використовуються), але це рідко робиться на практиці.
Посилання
- Вимоги до бітового розміру вказівника – O(log n), але розмір вказівника може вважатися сталою для більшості сортувальних застосувань.
- Maciej Liśkiewicz and Rüdiger Reischuk. The Complexity World below Logarithmic Space. Structure in Complexity Theory Conference, pp. 64-78. 1994. Online: p. 3, Theorem 2.
- (2008), Undirected connectivity in log-space, , 55 (4): 1—24, doi:10.1145/1391289.1391291, MR 2445014,
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
V informatici algoritm na misci ce algoritm yakij pracyuye bezposeredno nad vhidnoyu strukturoyu danih ne vimagayuchi dodatkovoyi pam yati proporcijnoyi rozmiru vhidnih danih Inakshe kazhuchi vin zminyuye vhidni dani na misci ne stvoryuyuchi okremoyi kopiyi strukturi danih Algoritm yakij vikonuyetsya ne na misci zvut algoritmom z vikonannyam ne na misci abo poza miscem Vikonannya na misci mozhe mati desho inshi znachennya U najstrogishomu varianti ce poznachaye algoritm sho mozhe mati lishe stalu kilkist dodatkovoyi pam yati vrahovuyuchi vse vklyuchno z viklikami funkcij i vkazivnikami Odnak cej variant viznachennya duzhe obmezhenij oskilki prostij indeks masivu z dovzhinoyu n vimagaye O log n bitiv U shirshomu sensi vikonannya na misci oznachaye sho algoritm ne vikoristovuye dodatkovu pam yat dlya roboti z vhidnimi danimi ale mozhe potrebuvati neveliku prote nepostijnu dodatkovu dilyanku pam yati dlya svoyeyi roboti Zazvichaj cya dilyanka maye rozmir O log n hocha inodi dopuskayetsya bud sho v mezhah o n Zauvazhte sho skladnist za pam yattyu takozh maye riznomanitni varianti shodo togo rahuvati chi ni dovzhini indeksiv yak chastinu vikoristanoyi pam yati Neridko skladnist za pam yattyu zadayetsya vidnosno kilkosti neobhidnih indeksiv abo vkazivnikiv ignoruyuchi yih rozryadnist Cya stattya zvertayetsya do zagalnoyi skladnosti pam yati Determinovanogo prostoru sho vrahovuye rozryadnosti vkazivnikiv Tomu vimogi do pam yati tut mayut dodatkovij koeficiyent log n porivnyano z analizom yakij ignoruye dovzhinu indeksiv i vkazivnikiv Algoritm mozhe vrahovuvati vhidni dani yak chastinu vikoristannya pam yati Oskilki algoritmi na misci zazvichaj perezapisuyut vhidni dani vihidnimi dodatkova pam yat ne potribna Koli zapis vivodu vidbuvayetsya v pam yat dostupnu lishe dlya zapisu abo v potik mozhlivo dorechnishe vrahovuvati lishe robochu pam yat algoritmu U teoretichnih zastosuvannyah takih yak skorochennya log prostoru bilsh tipovo ignoruvati vihidnu pam yat u takih vipadkah bilsh vazhlivo shob vihidna pam yat bula dostupna lishe dlya zapisu PrikladiDano masiv a z n elementiv pripustimo sho potriben masiv yakij mistit ti sami elementi u zvorotnomu poryadku a vihidnij masiv usunuti Odin zdavalosya b prostij sposib zrobiti ce stvoriti novij masiv takogo zh rozmiru zapovniti jogo kopiyami z a u vidpovidnomu poryadku a potim vidaliti a funkciya rozvernuti a 0 n 1 vidiliti b 0 n 1 dlya i vid 0 do n 1 b n 1 i a i povernuti b Na zhal ce vimagaye O n dodatkovoyi pam yati dlya togo shob masivi a i b buli dostupnimi odnochasno Krim togo vidilennya ta zvilnennya pam yati neridko ye povilnimi operaciyami Oskilki masiv a bilshe ne potriben jogo mozhna perezapisati jogo vlasnim reversom za dopomogoyu algoritmu na misci yakomu znadobitsya lishe postijne chislo 2 cilih chisel dlya dopomizhnih zminnih i ta tmp nezalezhno vid togo naskilki velikim ye masiv funkciya rozvernuti na misci a 0 n 1 dlya i vid 0 do okrugliti n 2 2 tmp a i a i a n 1 i a n 1 i tmp Yak inshij priklad chimalo algoritmiv sortuvannya zminyuye poryadok u masivah na vidsortovanij na misci sered nih bulbashkove sortuvannya grebinchaste sortuvannya sortuvannya vibirkoyu sortuvannya vstavlyannyam sortuvannya kupoyu ta sortuvannya Shella Ci algoritmi potrebuyut lishe kilka vkazivnikiv tomu yih skladnist za pam yattyu O log n Shvidke sortuvannya pracyuye z danimi yaki potribno vidsortuvati na misci Odnak vono potrebuye O log n miscya na steku dlya vkazivnikiv shob vidstezhuvati pidmasivi u strategiyi rozdilyaj i volodaryuj Otzhe shvidke sortuvannya potrebuye O log2n dodatkovoyi pam yati Popri te sho cya dilyanka nestalogo rozmiru tehnichno vivodit shvidke sortuvannya z kategoriyi algoritmiv z vikonannyam na misci shvidke sortuvannya ta inshi algoritmi yaki potrebuyut lishe O log n dodatkovih vkazivnikiv zazvichaj vvazhayutsya algoritmami na misci Bilshist algoritmiv poshuku takozh ye algoritmami z vikonannyam na misci hoch deyaki z nih znachno zminyuyut vhidnij masiv u procesi poshuku kincevogo rezultatu postijnogo rozmiru Deyaki algoritmi obrobki tekstu taki yak ta rozvertannya mozhut vikonuvatisya na misci U teoriyi obchislyuvalnoyi skladnostiU teoriyi skladnosti obchislen stroge viznachennya algoritmiv na misci vklyuchaye vsi algoritmi zi skladnistyu za pam yattyu O 1 klas DSPACE 1 Cej klas duzhe obmezhenij ce dorivnyuye regulyarnim movam Faktichno vin navit ne vmishaye zhodnogo z pererahovanih vishe prikladiv Algoritmi zazvichaj rozglyadayutsya v L klasi problem yaki potrebuyut O log n dodatkovoyi pam yati shob buti algoritmami z vikonannyam na misci Cej klas bilshe vidpovidaye praktichnomu viznachennyu oskilki dopuskaye chisla rozmirom n vkazivniki chi indeksi Odnak ce rozshirene viznachennya vse odno viklyuchaye shvidke sortuvannya cherez jogo rekursivni vikliki Viznachennya algoritmiv z vikonannyam na misci za klasom L maye deyaki cikavi naslidki napriklad ce oznachaye sho isnuye dosit skladnij algoritm na misci priznachenij dlya viznachennya togo chi isnuye shlyah mizh dvoma vuzlami v neoriyentovanomu grafi ce problema yaka vimagaye O n dodatkovoyi pam yati z vikoristannyam tipovih algoritmiv takih yak poshuk u glibinu bit vidviduvannya dlya kozhnogo vuzla Ce svoyeyu chergoyu vede do algoritmiv z vikonannyam na misci dlya takih problem yak z yasuvannya togo chi ye graf dvochastkovim abo perevirka togo chi dva grafi mayut odnakovu kilkist komponent zv yaznosti Rol vipadkovostiU bagatoh vipadkah vimogi do pam yati dlya algoritmu mozhna suttyevo skorotiti za dopomogoyu randomizovanogo algoritmu Napriklad yaksho htos hoche znati chi dvi vershini v grafi z n vershin znahodyatsya v odnij komponenti zv yaznosti grafa ne isnuye vidomogo prostogo determinovanogo algoritmu na misci dlya viznachennya cogo A prote yaksho prosto pochati z odniyeyi vershini j vikonati vipadkove blukannya z blizko 20n3 krokiv to jmovirnist togo sho zustrinetsya druga vershina za umovi sho vona znahoditsya v tij zhe komponenti duzhe visoka Podibnim chinom ye prosti randomizovani algoritmi na misci dlya perevirki prostoti taki yak test na prostotu Millera Rabina a takozh ye prosti algoritmi vipadkovogo faktoruvannya na misci taki yak P algoritm Polarda U funkcijnomu programuvanniFunkcijni movi programuvannya neridko ne zaohochuyut abo ne pidtrimuyut yavni algoritmi na misci yaki perezapisuyut dani oskilki ce riznovid pobichnogo efektu natomist voni dozvolyayut lishe stvoryuvati novi dani Prote dobri kompilyatori funkcijnoyi movi neridko rozumiyut koli stvoryuyetsya ob yekt duzhe shozhij na nayavnij a potim starij vikidayetsya i optimizuyut ce do vnesennya prostih zmin za lashtunkami Zauvazhte sho v principi mozhlivo stvoryuvati algoritmi z vikonannyam na misci yaki ne zminyuyut dani yaksho tilki ci dani bilshe nide ne vikoristovuyutsya ale ce ridko robitsya na praktici PosilannyaVimogi do bitovogo rozmiru vkazivnika O log n ale rozmir vkazivnika mozhe vvazhatisya staloyu dlya bilshosti sortuvalnih zastosuvan Maciej Liskiewicz and Rudiger Reischuk The Complexity World below Logarithmic Space Structure in Complexity Theory Conference pp 64 78 1994 Online p 3 Theorem 2 2008 Undirected connectivity in log space 55 4 1 24 doi 10 1145 1391289 1391291 MR 2445014