Кіріспе

Алгоритмді орындау үшін қажетті ресурстардың мөлшері

Компьютерлік ғылымда алгоритмнің есептеу күрделілігі немесе жай ғана күрделілігі – оны іске қосу үшін қажетті ресурстардың мөлшері. Ерекше назар есептеу уақытына (әдетте қажетті элементарлық операциялар санымен өлшенеді) және жад сақтау талаптарына беріледі. Мәселенің күрделілігі – мәселені шешуге мүмкіндік беретін ең жақсы алгоритмдердің күрделілігі. Нақты берілген алгоритмдердің күрделілігін зерттеу алгоритмдерді талдау деп аталады, ал мәселелердің күрделілігін зерттеу – есептеу күрделілігі теориясы деп аталады. Екі сала да тығыз байланысты, себебі алгоритмнің күрделілігі әрқашан осы алгоритммен шешілетін мәселенің күрделілігінің жоғарғы шегі болып табылады. Сонымен қатар, тиімді алгоритмдерді жобалау үшін белгілі бір алгоритмнің күрделілігін шешілетін мәселенің күрделілігімен салыстыру маңызды. Көп жағдайда мәселенің күрделілігі туралы білген жалғыз нәрсе – ол ең тиімді белгілі алгоритмдердің күрделілігінен төмен. Сондықтан алгоритмдерді талдау және күрделілік теориясы арасында үлкен байланыс бар. Алгоритмді іске қосу үшін қажетті ресурстардың мөлшері әдетте кіріс мөлшеріне байланысты өзгеретіндіктен, күрделілік әдетте n → f(n) функциясы түрінде көрсетіледі, мұнда n – кіріс мөлшері, ал f(n) – ең нашар жағдайдың күрделілігі (n өлшемді барлық кірістер үшін қажетті ресурстардың максималды мөлшері) немесе орташа жағдайдың күрделілігі (n өлшемді барлық кірістер үшін ресурстардың орташа мөлшері). Уақыт күрделілігі әдетте n өлшемді кіріс үшін қажетті элементарлық операциялар саны ретінде көрсетіледі, мұнда элементарлық операциялар берілген компьютерде тұрақты уақыт алады және басқа компьютерде орындалғанда тек тұрақты фактормен өзгереді деп есептеледі. Ғарыштық күрделілік әдетте n өлшемді кірісте алгоритмге қажетті жад мөлшері ретінде көрсетіледі.

Уақыт

Ең көп қарастырылатын ресурс – уақыт. "Күрделілік" термині ешқандай шектеусіз қолданылғанда, көбінесе уақыт күрделілігін білдіреді. Күрделілік теориясында уақыттың әдеттегі өлшемдері (секундтар, минуттар сияқты) қолданылмайды, себебі олар нақты бір компьютер таңдауына және технологияның өркендеуіне тым тәуелді. Мысалы, қазіргі компьютер 1960 жылдардағы компьютерге қарағанда алгоритмді едәуір жылдам орындай алады; алайда, бұл алгоритмнің ішкі қасиеті емес, компьютерлік аппараттық құралдардағы технологиялық прогрестің нәтижесі. Күрделілік теориясы алгоритмдердің ішкі уақыт талаптарын, яғни алгоритмнің кез келген компьютерде тудыратын негізгі уақыт шектеулерін анықтауға бағытталған. Бұл есептеу барысында орындалатын элементарлық операциялардың санын санау арқылы қол жеткізіледі. Бұл операциялар белгілі бір машинада тұрақты уақытқа ие деп есептеледі (яғни, кіріс мөлшеріне тәуелді емес) және көбінесе қадамдар деп аталады.

Бит күрделілігі

Біт күрделілігі – алгоритмді іске қосу үшін қажетті биттермен жасалатын операциялар саны. Көптеген есептеу модельдерінде ол уақыт күрделілігімен тұрақты шамаға дейін тең. Компьютерлерде машиналық сөздермен жасалатын операциялар саны да біт күрделілігіне пропорционалды. Демек, уақыт күрделілігі мен біт күрделілігі нақты есептеу модельдері үшін эквивалентті.

Ғарыш

Тағы бір маңызды ресурс – алгоритмдерді іске қосу үшін қажетті компьютер жадының мөлшері.

Байланыс

Бірнеше өзара әрекеттесетін тараптармен орындалатын таратылған алгоритмдер класы үшін ең маңызды ресурс – байланыс күрделілігі. Ол алгоритмді орындайтын тараптар арасындағы қажетті коммуникация мөлшері болып табылады.

Басқалар

Арифметикалық операциялардың саны – жиі қолданылатын тағы бір ресурс. Мұндай жағдайда арифметикалық күрделілік туралы сөз болады. Егер есептеу барысында кездесетін сандардың екілік өрнектемесінің мөлшеріне жоғарғы шек белгілі болса, уақыт күрделілігі көбінесе арифметикалық күрделіліктің тұрақты көбейткіші болып табылады. Көптеген алгоритмдер үшін есептеу кезінде қолданылатын бүтін сандардың мөлшері шектелмеген, сондықтан арифметикалық операциялар тұрақты уақыт алады деп есептеудің қажеті жоқ. Сондықтан, уақыт күрделілігі, бұл контексте көбінесе бит күрделілігі деп аталады, арифметикалық күрделіліктен әлдеқайда артық болуы мүмкін. Мысалы, n×n бүтін сан матрицасының анықтамасын есептеудің арифметикалық күрделілігі, әдеттегі алгоритмдер үшін (Гаусс жою әдісі) шамалы. Осы алгоритмдердің бит күрделілігі n-ге қатысты экспоненциалды, себебі есептеу барысында коэффициенттердің мөлшері экспоненциалды түрде өсуі мүмкін. Алайда, егер бұл алгоритмдер көп модульді арифметикамен үйлестірілсе, бит күрделілігі [[жұмсақ O белгісіне]] дейін төмендетілуі мүмкін. Сорттау және іздеуде қарастырылатын ресурс көбінесе салыстырулар саны болып табылады. Деректер тиісінше ұйымдастырылған жағдайда, бұл уақыт күрделілігін бағалаудың жақсы тәсілі болып саналады.

Кіріс көлеміне байланысты күрделілік

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

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

Күрделілікті бағалау есептеу моделін таңдауға негізделеді, ол бірлік уақытта орындалатын негізгі амалдарды анықтаудан тұрады. Егер есептеу моделі нақты көрсетілмесе, көбінесе ол көп таспалы Тьюринг машинасы деп есептеледі, себебі кездейсоқ кіру машиналары сияқты көптеген шынайы есептеу модельдері көптеген мәселелер үшін асимптотикалық жағынан эквивалентті болып табылады. Тек өте нақты және қиын мәселелер үшін, мысалы, белгілі бір уақытта бүтін сандарды көбейту сияқты жағдайларда, дәлелдеу үшін есептеу моделінің нақты анықтамасы қажет.

Детерминистік модельдер

Детерминистік есептеу моделі – машинаның кезекті күйлері мен орындалатын операциялардың алдыңғы күйімен толық анықталатын есептеу моделі. Тарихи тұрғыдан алғанда, алғашқы детерминистік модельдер рекурсивті функциялар, лямбда-есептеу және Тьюринг машиналары болды. Нақты компьютерлерге жақын модель ретінде кездейсоқ кіру машиналарының (RAM машиналары деп те аталады) моделі де кеңінен қолданылады. Егер есептеу моделі көрсетілмесе, ол әдетте көп таспалы Тьюринг машинасы деп есептеледі. Көптеген алгоритмдер үшін уақыт күрделілігі көп таспалы Тьюринг машиналарында да, RAM машиналарында да бірдей болады, бірақ осы теңдестікті алу үшін деректерді жадта сақтау тәсіліне назар аудару қажет болуы мүмкін.

Детерминистік емес есептеу

Детерминистік емес есептеу моделінде, мысалы, детерминистік емес Тьюринг машиналарында, есептеудің кейбір қадамдарында таңдаулар жасалуы мүмкін. Күрделілік теориясында барлық мүмкін таңдаулар бір мезгілде қарастырылады, ал детерминистік емес уақыт күрделігі – ең жақсы таңдау әрқашан жасалған кезде қажетті уақыт. Басқаша айтқанда, есептеу қажет болған жағдайда бірдей процессорлардың санымен бір мезгілде жүзеге асырылады деп есептеледі, ал детерминистік емес есептеу уақыты – есептеуді бірінші аяқтаған процессордың жұмсаған уақыты. Бұл параллелизм кванттық есептеулерде, белгілі бір кванттық алгоритмдерді іске асыру кезінде, суперпозицияланған байланысқан күйлер арқылы іске асырылуы мүмкін, мысалы, Шордың әлі де кішкентай бүтін сандарды жіктеуі (2018 жылғы мәлімет бойынша: 21 = 3 × 7). Мұндай есептеу моделі әлі де нақты болмаса да, оның теориялық маңызы зор, көбінесе P = NP мәселесімен байланысты, ол «полиномиалдық уақыт» және «детерминистік емес полиномиалдық уақыт» ең төменгі жоғарғы шек ретінде қарастырылатын күрделілік сыныптарының теңдігіне күмәндік тудырады. Детерминистік компьютерде NP алгоритмін модельдеу әдетте «экспоненциалдық уақыт» алады. Егер мәселені детерминистік емес машинада полиномиалдық уақытта шешуге болады, онда ол NP күрделілік класына жатады. Мәселе NP-толық деп есептеледі, егер ол NP класына жататын болса және басқа NP мәселелерінен қиын болмаса. Көптеген комбинаторлық мәселелер, мысалы, рюкзак мәселесі, саяхатшы мәселесі және Бульдік қанағаттандыру мәселесі NP-толық. Осы мәселелердің барлығы үшін ең жақсы белгілі алгоритм экспоненциалдық күрделілікке ие. Егер осы мәселелердің кез келгенін детерминистік машинада полиномиалдық уақытта шешуге мүмкіндік болса, онда барлық NP мәселелерін де полиномиалдық уақытта шешуге болады, яғни P = NP болады. 2017 жылдан бері P ≠ NP деген болжам кеңінен таралған, бұл NP мәселелерінің ең нашар жағдайларын шешудің қиындығын көрсетеді, яғни кірістің қызықты ұзындығы үшін ондаған жылдардан астам уақыт қажет болуы мүмкін.

Параллель және үлестірілген есептеулер

Параллель және үлестірілген есептеулер бірнеше процессорда есептеуді бөлуден тұрады, олар бір уақытта жұмыс істейді. Модельдер арасындағы айырмашылық негізінен процессорлар арасында ақпаратты жіберу тәсілінде. Әдетте, параллель есептеулерде процессорлар арасындағы деректерді беру өте жылдам, ал үлестірілген есептеулерде деректер желі арқылы жіберіледі, сондықтан ол әлдеқайда баяу. N процессорда есептеуге қажетті уақыт, ең болмағанда, бір процессорға қажетті уақытты N-ге бөлгенге тең болады. Бірақ, бұл теориялық ең жақсы көрсеткіштің өзіне жете алмайсыз, себебі кейбір кішірек есептерді параллельдеу мүмкін емес, ал кейбір процессорлар басқа процессордан нәтиже күтуі мүмкін. Сондықтан, басты қиындық – есептеу уақытын процессорлар санына көбейту нәтижесі, бір процессордағы осы есепке қажетті уақытқа мүмкіндігінше жақын болатын алгоритмдерді жасау.

Кванттық есептеу

Кванттық компьютер – кванттық механикаға негізделген есептеу моделіне ие компьютер. Черч-Тюринг тезисі кванттық компьютерлерге де қатысты; яғни, кванттық компьютер шеше алатын кез келген мәселені Тьюринг машинасы да шеше алады. Дегенмен, кейбір мәселелер теориялық тұрғыдан классикалық компьютерге қарағанда кванттық компьютер арқылы әлдеқайда төмен уақыт күрделілігімен шешілуі мүмкін. Қазіргі таңда бұл тек теориялық мүмкіндік, себебі ешкім тиімді кванттық компьютерді қалай құруға болатынын білмейді. Кванттық күрделілік теориясы кванттық компьютерлерді пайдаланып шешілетін мәселелердің күрделілік кластарын зерттеу үшін жасалған. Ол кванттық компьютерлердің шабуылдарына қарсы тұратын криптографиялық протоколдарды құрудан тұратын кванттық криптографиядан кейінгі криптографияда қолданылады.

Мәселе күрделілігі (төменгі шектер)

Мәселенің күрделілігі – мәселені шеше алатын алгоритмдердің күрделілігінің инфимумы, соның ішінде белгісіз алгоритмдер де бар. Осылайша, мәселенің күрделілігі, мәселені шешетін кез келген алгоритмнің күрделілігінен жоғары болмайды. Содан шығатыны, алгоритмнің үлкен O нотациясымен көрсетілген әрбір күрделілігі, сәйкес мәселенің күрделілігінің жоғарғы шегі болып табылады. Екінші жағынан, мәселенің күрделілігі үшін тривиальды емес төменгі шектерді алу әдетте қиын, және мұндай төменгі шектерді алуға арналған әдістер де аз. Көптеген мәселелерді шешу үшін барлық кіріс деректерін оқу қажет, бұл әдетте деректердің көлеміне пропорционалды уақытты қажет етеді. Осылайша, мұндай мәселелердің күрделілігі кем дегенде сызықтық, яғни үлкен омега нотациясын қолдану арқылы, күрделілігі болады.

Кейбір мәселелердің шешімі, әдетте компьютерлік алгебра және есептеу алгебралық геометриясында, өте үлкен болуы мүмкін. Мұндай жағдайда, күрделілік ең төменгі шегі шығыстың максималды көлемімен шектеледі, өйткені шығысты жазу қажет. Мысалы, n анықталмаған n дәрежелі d көптамалы теңдеулер жүйесі, егер шешімдер саны шекті болса, дейін кешенді шешімдерге ие болуы мүмкін (бұл Безу теоремасы). Бұл шешімдерді жазу керек болғандықтан, бұл мәселенің күрделілігі болады. Бұл мәселенің күрделілігі алгоритмі белгілі, сондықтан оны асимптотикалық квази-оптималды деп санауға болады. Сорттау алгоритміне қажетті салыстырулар саны үшін сызықтық емес төменгі шек белгілі. Осылайша, ең жақсы сорттау алгоритмдері оңтайлы, өйткені олардың күрделілігі болады. Бұл төменгі шек n нысанды реттеудің n! тәсілі бар деген фактіден туындайды. Әр салыстыру n! реттіліктер жиынтығын екіге бөледі, сондықтан барлық реттіліктерді ажырату үшін қажетті N салыстырулар саны тексеруі керек, бұл Стирлинг формуласы бойынша анықталады. Күрделіліктің төменгі шектерін алудың стандартты әдісі бір мәселені екінші мәселеге келтіруден тұрады. Нақтырақ айтқанда, егер n өлшемдегі A мәселесін B мәселесінің f(n) өлшемдегі қосалқы мәселесіне кодтауға болады деп есептесек, және A мәселесінің күрделілігі болса, онда жалпылықты жоғалтпай, f функциясы n-мен өседі және кері функциясы h болады деп есептеуге болады. Содан кейін B мәселесінің күрделілігі болады. Бұл P ≠ NP (шешілмеген болжам) болса, әрбір NP-толық мәселенің күрделілігі әрбір оң бүтін сан k үшін екенін дәлелдеу үшін қолданылатын әдіс.

Алгоритмдерді жобалауда қолдану

Алгоритмнің күрделілігін бағалау – алгоритмді жобалаудың маңызды бөлігі, себебі ол күтілетін өнімділік туралы пайдалы ақпарат береді. Алгоритмдердің күрделілігін бағалау Мур заңының нәтижесінде маңыздылығы азаяды деген жалпы қате түсінік бар, Мур заңы қазіргі заманғы компьютерлердің қуатының экспоненциалды өсуін болжайды. Бұл дұрыс емес, өйткені қуаттың артуы үлкен көлемді деректермен (үлкен деректер) жұмыс істеуге мүмкіндік береді. Мысалы, кітаптың библиографиясы сияқты бірнеше жүз жазбаны әліппелік тәртіппен сұрыптау қажет болғанда, кез келген алгоритм бір секундтан кем уақытта жақсы жұмыс істеуі керек. Алайда, миллион жазбадан тұратын тізім үшін (мысалы, ірі қаланың телефон нөмірлері), салыстыруды қажет ететін қарапайым алгоритмдер триллиондаған салыстырулар жасауы керек, бұл секундына 10 миллион салыстыру жылдамдығымен шамамен үш сағатқа созылады. Ал жылдам сұрыптау (quicksort) және біріктіру сұрыптау (merge sort) үшін салыстыру саны тек (бұрынғысы үшін орташа жағдайда, соңғысы үшін ең нашар жағдайда) қана қажет. n = 1,000,000 болғанда, бұл шамамен 30,000,000 салыстыруға тең, ал секундына 10 миллион салыстыру жылдамдығымен бұл 3 секундты алады. Осылайша, күрделілікті бағалау кез келген іске асырудан бұрын көптеген тиімсіз алгоритмдерді жоюға мүмкіндік береді. Бұл күрделі алгоритмдерді барлық нұсқаларын сынамай-ақ жақсарту үшін де қолданылуы мүмкін. Күрделі алгоритмнің ең қымбат қадамдарын анықтау арқылы күрделілікті зерттеу, осы қадамдарға күш-жігерді жұмсауға және іске асырудың тиімділігін арттыруға мүмкіндік береді.