Кіріспе

Суффикс ағаштарын құру алгоритмі
Компьютерлік ғылымда Укконен алгоритмі – 1995 жылы Эско Укконен ұсынған, суффикс ағаштарын құруға арналған сызықтық уақытты онлайн алгоритм. Алгоритм жолдың бірінші символын қамтитын жасырын суффикс ағашынан басталады. Содан кейін ол жол бойынша қадам салып, ағаш толыққанша символдарды бірінен соң бірі қосады. Мұндай символдарды ретпен қосу Укконен алгоритміне "онлайн" қасиетін береді. Питер Вайнер ұсынған бастапқы алгоритм ең қысқадан ең ұзын суффикске дейін соңғы символдан біріншіге қарай жүрді. Эдвард М. МакКрейт ең ұзын суффикстен ең қысқасына қарай қарастыратын қарапайым алгоритмді тапты.

Жасырын жұрнақ ағашы

Ukkonen алгоритмін қолдана отырып, жұрнақ ағашын құрғанда, S жолындағы символдарға байланысты аралық кезеңдерде жасырын жұрнақ ағашын көреміз. Жасырын жұрнақ ағаштарында $ (немесе кез келген басқа тоқтату символы) белгісі бар қабырғалар болмайды және одан бір ғана қабырға шығатын ішкі түйін де болмайды.

Укконен алгоритмінің жоғары деңгейдегі сипаттамасы

Укконен алгоритмі S жолының әрбір S[1 i] префиксі үшін (S – n ұзындығы бар жол) T имплицитті суфикс ағашын құрастырады. Ол біріншіде 1 таңбаны пайдаланып T-ны, содан кейін 2 таңбаны пайдаланып T-ны, содан кейін 3 таңбаны пайдаланып T-ны, және соңында n таңбаны пайдаланып T-ны құрастырады. Укконен алгоритмін қолданатын суфикс ағашында келесі сипаттамаларды кездестіре аласыз: Имплицитті суфикс ағашы T, бұрынғы имплицитті суфикс ағашы T-ның үстінде салынады. Кез келген уақытта Укконен алгоритмі сона дейін көрген таңбалар үшін суфикс ағашын құрастырады, сондықтан ол тура сызықты қасиетке ие, бұл алгоритмнің O(n) уақытта орындалуына мүмкіндік береді. Укконен алгоритмі n фазаға бөлінеді (n ұзындығы бар жолдағы әрбір таңба үшін бір фаза). Әрбір i+1 фазасы i+1 кеңейтуге бөлінеді, S[1 i+1] суфиксінің әрқайсысы үшін біреуден. Суфикс кеңейту – бұл сона дейін құрылған суфикс ағашына келесі таңбаны қосу. i+1 фазасының j кеңейтуінде алгоритм S[j i]-нің соңын табады (бұл бұрынғы i фазасының нәтижесінде ағашта бар) және содан кейін S[j i]-ді кеңейтеді, S[j i+1] суфиксі ағашта бар екеніне көз жеткізу үшін. Үш кеңейту ережесі бар: Егер S[j i] деп белгіленген түбірден басталатын жол жапырақ қабырғасында аяқталса (яғни, S[i] – жапырақ қабырғасындағы соңғы таңба), онда S[i+1] таңбасы сол жапырақ қабырғасының белгісіне қосылады. Егер S[j i] деп белгіленген түбірден басталатын жол жапырақ емес қабырғасында аяқталса (яғни, жолдағы S[i]-дан кейін тағы да таңбалар бар) және келесі таңба S[i+1] болмаса, онда S[i+1] таңбасымен және j нөмірімен жаңа жапырақ қабырғасы құрылады. Егер S[1 i] жапырақ емес қабырғаның ішінде (арасында) аяқталса, жаңа ішкі түйін де құрылады. Егер S[j i] деп белгіленген түбірден басталатын жол жапырақ емес қабырғасында аяқталса (яғни, S[i]-дан кейін жолда тағы да таңбалар бар) және келесі таңба S[i+1] болса (ағашта бар), ештеңе жасамаңыз. Маңызды нәрсе – берілген түйіннен (түбір немесе ішкі) бір ғана таңбадан басталатын бір қабырға ғана болады. Кез келген түйіннен бір таңбадан басталатын бірнеше қабырға шыға алмайды.

Орындалу уақыты

Жұрнақ ағашын құрудың қарапайым әдісі O(n²) немесе тіпті O(n³) уақыт күрделілігін қажет етеді, мұнда n – жолдың ұзындығы. Бірнеше алгоритмдік тәсілдерді пайдаланып, Укконен бұл көрсеткішті тұрақты өлшемді әріптер жинағы үшін O(n) (сызықтық) уақытқа, ал жалпы жағдайда O(n log n) дейін төмендетті, бұл бұрынғы екі алгоритмнің жұмыс істеу жылдамдығымен сәйкес келеді.

Укконен алгоритмінің мысалы

Укконен алгоритмімен жұрнақ ағашының қалай құрылатынын жақсырақ түсіндіру үшін біз S = xabxac тізбесін қарастыра аламыз. Бос түбір торабынан бастаңыз. S[1] үшін тізбектің бірінші таңбасын қосу арқылы құрастырыңыз. 2-ереже қолданылады, бұл жаңа жапырақ түйінін жасайды. S[1 2] үшін xa (xa және a) жұрнақтарын қосу арқылы құрастырыңыз. 1-қағида қолданылады, ол жол белгісін бар жапырақ жиегіне дейін кеңейтеді. 2-ереже қолданылады, бұл жаңа жапырақ түйінін жасайды. S[1 3] үшін xab (xab, ab және b) жұрнақтарын қосу арқылы құрастырыңыз. 1-қағида қолданылады, ол жол белгісін бар жапырақ жиегіне дейін кеңейтеді. 2-ереже қолданылады, бұл жаңа жапырақ түйінін жасайды. S[1 4] үшін xabx жұрнақтарын қосу арқылы құрастырыңыз (xabx, abx, bx және x). 1-қағида қолданылады, ол жол белгісін бар жапырақ жиегіне дейін кеңейтеді. 3-ереже қолданылады, ештеңе істемеу керек. S[1 5] үшін xabxa жұрнақтарын қосу арқылы құрастырыңыз (xabxa, abxa, bxa, xa және a). 1-қағида қолданылады, ол жол белгісін бар жапырақ жиегіне дейін кеңейтеді. 3-ереже қолданылады, ештеңе істемеу керек. S[1 6] үшін xabxac жұрнақтарын (xabxac, abxac, bxac, xac, ac және c) қосу арқылы құрастырыңыз. 1-қағида қолданылады, ол жол белгісін бар жапырақ жиегіне дейін кеңейтеді. 2-қағида қолданылады, бұл жаңа жапырақ тораптарын жасайды (осы жағдайда үш жаңа жапырақ жиегі және екі жаңа ішкі тораптар құрылады).