Кіріспе

Компьютер ғылымындағы алгоритм түрі. Компьютер ғылымында, орнындағы алгоритм – кіріс деректері құрылымында кіріс мөлшеріне пропорционалды қосымша орынды қажет етпей тікелей жұмыс істейтін алгоритм. Басқаша айтқанда, ол деректер құрылымының жеке көшірмесін жасамай, кірісті өзгертеді. Орнындағы емес алгоритм кейде орнында емес немесе сыртқы деп аталады. "Орнында" терминінің мағынасы сәл өзгеше болуы мүмкін. Ең қатаң түрінде, алгоритмде тек тұрақты мөлшерде қосымша орын болуы керек, соның ішінде функция шақырулары мен сілтемелер де ескеріледі. Дегенмен, бұл түр өте шектеулі, себебі n ұзындығындағы массивтің индексін сақтау үшін O(log n) бит қажет. Көбірек қарастырғанда, орнындағы алгоритм кірісті өңдеу үшін қосымша орынды пайдаланбайды, бірақ жұмыс істеуі үшін шағын, бірақ тұрақты емес қосымша орын қажет болуы мүмкін. Әдетте, бұл орын O(log n) болады, бірақ кейде o(n) мөлшеріндегі кез келген орынға рұқсат етіледі. Есіңізде болсын, орынның күрделілігінде индекс ұзындығын пайдаланылған орынның бөлігі ретінде есептеуге немесе есептемеуге қатысты әртүрлі таңдаулар бар. Көбінесе орынның күрделілігі қажетті индекстер немесе көрсеткіштер саны бойынша беріледі, олардың ұзындығы ескерілмейді. Осы мақалада біз жалпы орын күрделілігін (DSPACE) деп атаймыз, ол көрсеткіштердің ұзындығын есепке алады. Сондықтан, мұндағы орын талаптары, индекстер мен көрсеткіштердің ұзындығын ескермейтін талдаумен салыстырғанда, қосымша log n факторына ие. Алгоритм шығысты өзінің орын пайдалануының бөлігі ретінде есептеуі немесе есептемеуі мүмкін. Орнындағы алгоритмдер әдетте кірісті шығыспен ауыстырып жазатындықтан, қосымша орын қажет емес. Шығысты тек жадқа немесе ағынға жазу үшін, алгоритмнің жұмыс орынын ғана қарастыру орынды болуы мүмкін. Теориялық қолданыстарда, мысалы, логарифмдік орынды қысқартуларда, шығыс орынын ескермеу жиірек кездеседі (осы жағдайларда шығыстың тек жазуға болатындығы маңыздырақ).

Есептеу күрделілігі

Есептеу күрделілігі теориясында орнындағы алгоритмдердің қатаң анықтамасы O(1) кеңістік күрделілігі бар барлық алгоритмдерді, DSPACE(1) класын қамтиды. Бұл класс өте шектеулі; ол реттелі тілдерге тең. Шындығында, ол жоғарыда келтірілген мысалдардың ешқайсысын да қамтымайды. Алгоритмдер көбінесе L класында қарастырылады, бұл O(log n) қосымша кеңістік қажет ететін мәселелер класы. Бұл класс практикалық анықтамаға көбірек сәйкес келеді, себебі ол n өлшемді сандарды сілтеме немесе индекс ретінде пайдалануға мүмкіндік береді. Бұл кеңейтілген анықтама, алайда, жылдам сұрыптауды да алып тастайды, оның рекурсивті шақырулары болғандықтан. Орнындағы алгоритмдерді L класымен байланыстырудың қызықты салдары бар; мысалы, бұл бағытталмаған графтың екі түйіні арасында жолдың бар-жоғын анықтау үшін (біршама күрделі) орнындағы алгоритмнің бар екенін білдіреді, бұл мәселе әдеттегі алгоритмдарды пайдаланғанда (мысалы, тереңдікке бірінші іздеу, әр түйін үшін қарастырылған бит) O(n) қосымша кеңістік қажет етеді. Бұл өз кезегінде графтың екі бөлікті екенін анықтау сияқты мәселелер үшін алгоритмдерді ұсынады немесе екі графтың байланысқан компоненттерінің саны бірдей екенін тексеруге мүмкіндік береді.

Кездейсоқтықтың рөлі

Көп жағдайда алгоритмнің кеңістік талаптарын кездейсоқ алгоритм қолдану арқылы күрт қысқартуға болады. Мысалы, егер n төбелі графтың екі төбесі графтың бір байланысқан компонентінде екенін білгіңіз келсе, оны анықтау үшін қарапайым, детерминистік, орнында орындалатын алгоритм жоқ. Дегенмен, егер бір төбеден бастап шамамен бірнеше қадам кездейсоқ серуен жасасаңыз, екінші төбеге кездесу ықтималдығы, егер ол сол компонентте болса, өте жоғары болады. Сол сияқты, Miller-Rabin біріншілік тестісі сияқты біріншілікті тексеруге арналған қарапайым кездейсоқ алгоритмдер де бар, сондай-ақ Pollard's rho алгоритмі сияқты қарапайым кездейсоқ факторлау алгоритмдері де бар.

Функционалдық бағдарламалауда

Функционалдық бағдарламалау тілдері көбінесе деректерді тікелей өзгертетін алгоритмдерді қолдануға кедергі келтіреді немесе оларды қолдамайды, себебі мұндай өзгерістер жанама эффектілерге жатады; оның орнына, олар жаңа деректерді ғана құруға рұқсат береді. Дегенмен, сапалы функционалдық тілдердің компиляторлары, егер жаңа объект бұрынғыдан өте ұқсас болса және ескісі жойылса, мұны "ішкі жағынан" қарапайым өзгертуге айналдыра алады. Теориялық тұрғыда, деректерді өзгертпейтін алгоритмдерді жасау мүмкін (егер деректер енді қолданылмаса), бірақ мұндай жағдайларда осылай істеу сирек кездеседі.