Кіріспе
Компьютер ғылымындағы алгоритм түрі. Компьютер ғылымында, орнындағы алгоритм – кіріс деректері құрылымында кіріс мөлшеріне пропорционалды қосымша орынды қажет етпей тікелей жұмыс істейтін алгоритм. Басқаша айтқанда, ол деректер құрылымының жеке көшірмесін жасамай, кірісті өзгертеді. Орнындағы емес алгоритм кейде орнында емес немесе сыртқы деп аталады. "Орнында" терминінің мағынасы сәл өзгеше болуы мүмкін. Ең қатаң түрінде, алгоритмде тек тұрақты мөлшерде қосымша орын болуы керек, соның ішінде функция шақырулары мен сілтемелер де ескеріледі. Дегенмен, бұл түр өте шектеулі, себебі n ұзындығындағы массивтің индексін сақтау үшін O(log n) бит қажет. Көбірек қарастырғанда, орнындағы алгоритм кірісті өңдеу үшін қосымша орынды пайдаланбайды, бірақ жұмыс істеуі үшін шағын, бірақ тұрақты емес қосымша орын қажет болуы мүмкін. Әдетте, бұл орын O(log n) болады, бірақ кейде o(n) мөлшеріндегі кез келген орынға рұқсат етіледі. Есіңізде болсын, орынның күрделілігінде индекс ұзындығын пайдаланылған орынның бөлігі ретінде есептеуге немесе есептемеуге қатысты әртүрлі таңдаулар бар. Көбінесе орынның күрделілігі қажетті индекстер немесе көрсеткіштер саны бойынша беріледі, олардың ұзындығы ескерілмейді. Осы мақалада біз жалпы орын күрделілігін (DSPACE) деп атаймыз, ол көрсеткіштердің ұзындығын есепке алады. Сондықтан, мұндағы орын талаптары, индекстер мен көрсеткіштердің ұзындығын ескермейтін талдаумен салыстырғанда, қосымша log n факторына ие. Алгоритм шығысты өзінің орын пайдалануының бөлігі ретінде есептеуі немесе есептемеуі мүмкін. Орнындағы алгоритмдер әдетте кірісті шығыспен ауыстырып жазатындықтан, қосымша орын қажет емес. Шығысты тек жадқа немесе ағынға жазу үшін, алгоритмнің жұмыс орынын ғана қарастыру орынды болуы мүмкін. Теориялық қолданыстарда, мысалы, логарифмдік орынды қысқартуларда, шығыс орынын ескермеу жиірек кездеседі (осы жағдайларда шығыстың тек жазуға болатындығы маңыздырақ).
In computer science, an in place algorithm is an algorithm that operates directly on the input data structure without requiring extra space proportional to the input size. In other words, it modifies the input in place, without creating a separate copy of the data structure. An algorithm which is not in place is sometimes called not in place or out of place. In place can have slightly different meanings. In its strictest form, the algorithm can only have a constant amount of extra space, counting everything including function calls and pointers. However, this form is very limited as simply having an index to a length n array requires O(log n) bits. More broadly, in place means that the algorithm does not use extra space for manipulating the input but may require a small though nonconstant extra space for its operation. Usually, this space is O(log n), though sometimes anything in o(n) is allowed. Note that space complexity also has varied choices in whether or not to count the index lengths as part of the space used. Often, the space complexity is given in terms of the number of indices or pointers needed, ignoring their length. In this article, we refer to total space complexity (DSPACE), counting pointer lengths. Therefore, the space requirements here have an extra log n factor compared to an analysis that ignores the length of indices and pointers. An algorithm may or may not count the output as part of its space usage. Since in place algorithms usually overwrite their input with output, no additional space is needed. When writing the output to write only memory or a stream, it may be more appropriate to only consider the working space of the algorithm. In theoretical applications such as log space reductions, it is more typical to always ignore output space (in these cases it is more essential that the output is write only).
Есептеу күрделілігі
Есептеу күрделілігі теориясында орнындағы алгоритмдердің қатаң анықтамасы O(1) кеңістік күрделілігі бар барлық алгоритмдерді, DSPACE(1) класын қамтиды. Бұл класс өте шектеулі; ол реттелі тілдерге тең. Шындығында, ол жоғарыда келтірілген мысалдардың ешқайсысын да қамтымайды. Алгоритмдер көбінесе L класында қарастырылады, бұл O(log n) қосымша кеңістік қажет ететін мәселелер класы. Бұл класс практикалық анықтамаға көбірек сәйкес келеді, себебі ол n өлшемді сандарды сілтеме немесе индекс ретінде пайдалануға мүмкіндік береді. Бұл кеңейтілген анықтама, алайда, жылдам сұрыптауды да алып тастайды, оның рекурсивті шақырулары болғандықтан. Орнындағы алгоритмдерді L класымен байланыстырудың қызықты салдары бар; мысалы, бұл бағытталмаған графтың екі түйіні арасында жолдың бар-жоғын анықтау үшін (біршама күрделі) орнындағы алгоритмнің бар екенін білдіреді, бұл мәселе әдеттегі алгоритмдарды пайдаланғанда (мысалы, тереңдікке бірінші іздеу, әр түйін үшін қарастырылған бит) O(n) қосымша кеңістік қажет етеді. Бұл өз кезегінде графтың екі бөлікті екенін анықтау сияқты мәселелер үшін алгоритмдерді ұсынады немесе екі графтың байланысқан компоненттерінің саны бірдей екенін тексеруге мүмкіндік береді.
Кездейсоқтықтың рөлі
Көп жағдайда алгоритмнің кеңістік талаптарын кездейсоқ алгоритм қолдану арқылы күрт қысқартуға болады. Мысалы, егер n төбелі графтың екі төбесі графтың бір байланысқан компонентінде екенін білгіңіз келсе, оны анықтау үшін қарапайым, детерминистік, орнында орындалатын алгоритм жоқ. Дегенмен, егер бір төбеден бастап шамамен бірнеше қадам кездейсоқ серуен жасасаңыз, екінші төбеге кездесу ықтималдығы, егер ол сол компонентте болса, өте жоғары болады. Сол сияқты, Miller-Rabin біріншілік тестісі сияқты біріншілікті тексеруге арналған қарапайым кездейсоқ алгоритмдер де бар, сондай-ақ Pollard's rho алгоритмі сияқты қарапайым кездейсоқ факторлау алгоритмдері де бар.
Функционалдық бағдарламалауда
Функционалдық бағдарламалау тілдері көбінесе деректерді тікелей өзгертетін алгоритмдерді қолдануға кедергі келтіреді немесе оларды қолдамайды, себебі мұндай өзгерістер жанама эффектілерге жатады; оның орнына, олар жаңа деректерді ғана құруға рұқсат береді. Дегенмен, сапалы функционалдық тілдердің компиляторлары, егер жаңа объект бұрынғыдан өте ұқсас болса және ескісі жойылса, мұны "ішкі жағынан" қарапайым өзгертуге айналдыра алады. Теориялық тұрғыда, деректерді өзгертпейтін алгоритмдерді жасау мүмкін (егер деректер енді қолданылмаса), бірақ мұндай жағдайларда осылай істеу сирек кездеседі.