Кіріспе
Суффикс ағаштарын құру алгоритмі
Компьютерлік ғылымда Укконен алгоритмі – 1995 жылы Эско Укконен ұсынған, суффикс ағаштарын құруға арналған сызықтық уақытты онлайн алгоритм. Алгоритм жолдың бірінші символын қамтитын жасырын суффикс ағашынан басталады. Содан кейін ол жол бойынша қадам салып, ағаш толыққанша символдарды бірінен соң бірі қосады. Мұндай символдарды ретпен қосу Укконен алгоритміне "онлайн" қасиетін береді. Питер Вайнер ұсынған бастапқы алгоритм ең қысқадан ең ұзын суффикске дейін соңғы символдан біріншіге қарай жүрді. Эдвард М. МакКрейт ең ұзын суффикстен ең қысқасына қарай қарастыратын қарапайым алгоритмді тапты.
In computer science, Ukkonen's algorithm is a linear time, online algorithm for constructing suffix trees, proposed by Esko Ukkonen in 1995. The algorithm begins with an implicit suffix tree containing the first character of the string. Then it steps through the string, adding successive characters until the tree is complete. This order addition of characters gives Ukkonen's algorithm its "on line" property. The original algorithm presented by Peter Weiner proceeded backward from the last character to the first one from the shortest to the longest suffix. A simpler algorithm was found by Edward M. McCreight, going from the longest to the shortest suffix.
Жасырын жұрнақ ағашы
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] болса (ағашта бар), ештеңе жасамаңыз. Маңызды нәрсе – берілген түйіннен (түбір немесе ішкі) бір ғана таңбадан басталатын бір қабырға ғана болады. Кез келген түйіннен бір таңбадан басталатын бірнеше қабырға шыға алмайды.
Implicit suffix tree T is built on top of implicit suffix tree T At any given time, Ukkonen's algorithm builds the suffix tree for the characters seen so far and so it has on line property, allowing the algorithm to have an execution time of O(n). Ukkonen's algorithm is divided into n phases (one phase for each character in the string with length n). Each phase i+1 is further divided into i+1 extensions, one for each of the i+1 suffixes of S[1 i+1]. Suffix extension is all about adding the next character into the suffix tree built so far. In extension j of phase i+1, algorithm finds the end of S[j i] (which is already in the tree due to previous phase i) and then it extends S[j i] to be sure the suffix S[j i+1] is in the tree. There are three extension rules:
If the path from the root labelled S[j i] ends at a leaf edge (i. e., S[i] is last character on leaf edge), then character S[i+1] is just added to the end of the label on that leaf edge. if the path from the root labelled S[j i] ends at a non leaf edge (i. e., there are more characters after S[i] on path) and next character is not S[i+1], then a new leaf edge with label S[i+1] and number j is created starting from character S[i+1]. A new internal node will also be created if S[1 i] ends inside (in between) a non leaf edge. If the path from the root labelled S[j i] ends at a non leaf edge (i. e., there are more characters after S[i] on path) and next character is S[i+1] (already in tree), do nothing. One important point to note is that from a given node (root or internal), there will be one and only one edge starting from one character. There will not be more than one edge going out of any node starting with the same character.
Орындалу уақыты
Жұрнақ ағашын құрудың қарапайым әдісі 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-қағида қолданылады, бұл жаңа жапырақ тораптарын жасайды (осы жағдайда үш жаңа жапырақ жиегі және екі жаңа ішкі тораптар құрылады).