Кіріспе

k-шы ең кіші мәнді табу әдісі: генетикалық алгоритмдерде табиғи іріктеуді модельдеу

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

Мәселе туралы мәлімдеме

Таңдау мәселесі үшін алгоритм мәндер жиынтығын және бір санды кіріс ретінде қабылдайды. Ол осы мәндердің k-шы ең кішісін шығарады немесе, мәселенің кейбір нұсқаларында, k ең кіші мәндердің жиынтығын шығарады. Бұл жақсы анықталған болуы үшін, мәндерді кішісінен үлкеніне қарай реттеу мүмкін болуы керек; мысалы, олар бүтін сандар, қалқыма нүктелі сандар немесе сандық кілті бар кез келген нысан болуы мүмкін. Дегенмен, олардың бұрыннан реттелгендігі туралы ешқандай болжам жасалмайды. Көбінесе таңдау алгоритмдері салыстыруға негізделген есептеу моделімен шектеледі, мысалы, салыстыру арқылы сұрыптау алгоритмдеріндегідей, онда алгоритм кез келген екі мәннің салыстырмалы ретін анықтай алатын салыстыру операциясына қол жеткізе алады, бірақ осы мәндер бойынша басқа арифметикалық операцияларды орындай алмайды. Мәселені жеңілдету үшін, осы мәселе бойынша кейбір зерттеулер мәндердің барлығының бір-бірінен ерекшеленетінін немесе бірдей мәнді элементтер жұптарына рет беру үшін дәйекті түрде түйін шешу әдісі қолданылғанын болжайды. Мәселе анықтамасындағы тағы бір өзгеріс реттелген мәндерді нөмірлеуге қатысты: ең кіші мән массивттерді нөлден бастап нөмірлеудегідей, яғни k=0 арқылы алына ма, әлде «ең кіші, екінші ең кіші» сияқты ағылшын тіліндегі дәстүрлі конвенцияларды ұстана отырып, k=1 арқылы алына ма? Осы мақала Cormen және авторлар қолданған конвенцияларды ұстанады, оларға сәйкес барлық мәндер ерекше және ең кіші мән k=1 арқылы алынады.

Осы конвенциялар бойынша, мәндер жиынтығының ішіндегі ең жоғары мән, k=n арқылы алынады. Егер n тақ сан болса, жиынтықтың медианасы k= (n+1)/2 арқылы алынады. Егер n жұп сан болса, медиананы алу үшін екі мүмкіндік бар: осы k мәнін төменге немесе жоғарыға дөңгелектеу арқылы, яғни төменгі медиана k=n/2 және жоғарғы медиана k=n/2 + 1 арқылы.

Зауыттар

Детерминистік таңдау алгоритмдері, -қа немесе -қа қашық жатқан мәндер үшін, салыстырулардың ең кіші белгілі санымен, 1976 жылы Арнольд Шёнхаге, Майк Паттерсон және олар енгізген фабрикалар тұжырымдамасына негізделген. Бұл әдістер кіріс мәндерінің кіші топтарында белгілі бір типтегі ішінара реттіліктерді құрады, салыстыру арқылы кішірек ішінара реттіліктерді біріктіру арқылы. Мысалы, зауыттың бір түрі бір элементтен тұратын ішінара реттіліктер тізбегін кіріс ретінде қабылдап, осы реттіліктерден элементтер жұптарын салыстырып, шығыс ретінде екі элементтен тұратын толық реттелген жиынтар тізбегін шығарады. Бұл зауытқа кіріс ретінде берілетін элементтер әлі салыстырылмаған кіріс мәндері немесе басқа зауыттар жасаған "қалдық" мәндер болуы мүмкін. Фабрикаға негізделген алгоритмнің мақсаты – әртүрлі зауыттарды біріктіру, кейбір зауыттардың шығыстарын басқаларының кірістері ретінде пайдаланып, ақырында бір элементтің ( ең кіші элементтің) басқа элементтерден үлкен және тағы бір элементтен кіші болатын ішінара реттілік алу. Бұл фабрикалардың мұқият жобалануы медиананы табу үшін қолданылғанда ең көп салыстыруды қажет ететін алгоритмге әкеледі. Басқа мәндері үшін салыстырулар саны –қа тең болады.

Сублинериялық дерек құрылымдары

Деректер деректер құрылымына ұйымдастырылған кезде, мәндер санына қатысты сызықтық емес уақытта таңдау жасау мүмкін. Бұның ең қарапайым мысалы ретінде, массивке реттелген деректер үшін k-шы элементті бір массивтік іздеу арқылы тұрақты уақытта таңдауға болады. Екі өлшемді массивке реттелген мәндер үшін, реттелген жолдар мен бағандармен, таңдау уақыты O(n) болады, ал n массивінің өлшеміне қатысты кіші болғанда, одан да жылдам орындалуы мүмкін. Бір өлшемді реттелген массивтер жиынтығында, k-шы массивтегі таңдалған элементтен кіші элементтердің саны болса, уақыт O(n) болады.

Бұл әдіс үйіндідегі таңдауды орындау үшін де қолданылады. Бұл үйіндінің өлшеміне тәуелсіз және O(n) уақытынан жылдам. Осы әдіс кез келген үйінділік ағаш ретімен ұйымдастырылған деректерге де қолданылуы мүмкін (әртүрлі түйіндердегі мәндерде әкесі баласынан кіші болатын ағаш). Бұл әдіс комбинаторлық оптимизация мәселелерін шешуге, мысалы, салмақты графиктердегі k ең қысқа жолды табуға қолданылды, шешімдер кеңістігін жасырын түрде анықталған үйінділік ағаш түрінде анықтап, содан кейін осы таңдау алгоритмін қолдану арқылы. Керісінше, сызықтық уақытты таңдау алгоритмдері үйіндіге байланысты басымдық кезек деректер құрылымында қолданылды, оның k-шы элементін алу уақытын O(n) -дан O(log n) -ға дейін жақсартады.

Динамикалық енгізулер мен жоюлар болатын деректер жиынтығы үшін, реттік статистикалық ағаш өзін-өзі теңгерілген бинарлық іздеу ағашы құрылымын әрбір түйін үшін тұрақты мөлшерде қосымша ақпаратпен толықтырады, енгізулерге, жоюларға және ағымдағы жиынның k-шы элементін сұрауға мүмкіндік береді, бәрі O(log n) уақытта орындалады. Есептеудің салыстыру моделінен арылып, кіші бүтін сандар үшін операцияларға қатысты жылдам уақыттарға қол жеткізуге болады, онда бинарлық арифметикалық операциялар қолданылады. Егер жад сызықтық емес болса, ағымдық алгоритм динамикалық деректер үшін таңдау сұрақтарын дәл шеше алмайды, бірақ санау-мин эскизі таңдау сұрақтарын шамамен шешу үшін қолданылуы мүмкін, егер элементтерге қосылғандағы олардың реттіліктегі орны k-шы саннан бірнеше қадам қашықтықта болса, эскиздің өлшемі логарифмдік факторлармен шектелген.

Тілдік қолдау

Тілдердің өте азы ғана жалпы таңдауды қолдайды, бірақ көптегені тізімдегі ең кіші немесе ең үлкен элементті табу мүмкіндігін ұсынады. Назар аударарлық ерекшелік – C++ үшін жасалған Стандартты үлгі кітапханасы, ол күтілетін сызықтық уақыт кепілдігімен n-ші элемент әдісін ұсынады. Python стандартты кітапханасы (2.4 нұсқасынан бастап) heapq.nsmallest және heapq.nlargest кіші бағдарламаларын қамтиды, олар жиыннан ең кіші немесе ең үлкен элементтерді реттелген түрде қайтаруға арналған. Python-ның әртүрлі нұсқалары осы кіші бағдарламалар үшін әртүрлі алгоритмдерді пайдаланған. Python 3.13 нұсқасынан бастап, іске асыру бинарлық үйіндіні сақтайды, ол элементтерді сақтаумен шектеледі және жиынның алғашқы элементтерімен басталады. Содан кейін жиынның әрбір келесі элементі үйіндідегі ең үлкен немесе ең кіші элементті (сәйкесінше heapq.nsmallest және heapq.nlargest үшін) егер ол осы элементтен кіші немесе үлкен болса ауыстыра алады. Бұл іске асырудың ең нашар жағдайдағы уақыты , бұл heapselect арқылы қол жеткізілетін уақыттан нашар. Дегенмен, кездейсоқ енгізілген тізбектер үшін үйінді жаңартулар азырақ болуы мүмкін және көптеген кіріс элементтері тек бір салыстырумен өңделеді. 2017 жылдан бері Matlab maxk және mink функцияларын қосты, олар вектордағы ең үлкен (ең кіші) мәндерді, сондай-ақ олардың индекстерін қайтарады. Matlab құжаттамасында бұл функциялардың қандай алгоритмді қолданатыны немесе олардың жұмыс істеу принципі көрсетілмеген.

Тарих

Quickselect Тони Хоар тарапынан талдаусыз ұсынылды және алғаш рет 1971 жылғы техникалық есепте талданды. Бірінші белгілі сызықтық уақыт детерминистік таңдау алгоритмі – 1973 жылы Мануэль Блум, Роберт В. Флойд, Воган Пратт, Рон Ривест және Роберт Таржан жариялаған медианалардың медианасы әдісі. Олар таңдау мәселесінің қалыптасуын Чарльз Л. Доджсонның (Льюис Кэрролл ретінде танымал) 1883 жылғы жұмысына, ол бір рет өткізілетін спорт турнирлерінің стандартты дизайны екінші жақсы ойыншының екінші орынды жеңіп алуына кепілдік бермейтінін көрсеткеніне, сондай-ақ шамамен 1930 жылғы Хьюго Стейнхаус жұмысына байланыстырады, ол осы ойды дамытып, ойыншылардың ең аз ойында екінші орынды жеңіп алуына кепілдік беретін турнир дизайнын іздеді.