Diferente pentru siruri-de-sufixe intre reviziile #47 si #54

Nu exista diferente intre titluri.

Diferente intre continut:

h1. Siruri de sufixe
== include(page="template/implica-te/scrie-articole-2" user1="amadaeus" user2="Marius") ==
== include(page="template/implica-te/scrie-articole-2" user_id1="amadaeus" user_id2="Marius") ==
(Categoria _Structuri de date_, Autori _Adrian Vladu, Cosmin Negruseri_)
Desi ideea unui trie de sufixe este incantatoare la prima vedere, implementarea simplista in care inseram pas cu pas sufixele in structura noastra necesita un timp de ordinul $O(n^2^)$. Exista o structura numita _arbore de sufixe_^{'[1]':siruri-de-sufixe#bibliografie}^ care se poate construi in timp liniar fata de lungimea sirului de caractere. Arborele de sufixe este un trie de sufixe in care lanturile din care nu ieseau alte muchii erau comprimate intr-o singura muchie (in exemplul de mai sus acestea ar fi lanturile $2-3-4-5$ si $1-7-8-9$). Dar implementarea  algoritmului de complexitate liniara pentru construirea unui arbore de sufixe este anevoioasa, fapt care ne determina sa cautam o alta structura, mai usor de realizat.
Sa vedem care sunt sufixele lui $A$, parcurgind arborele in adancime. Avand in vedere faptul ca la parcurgerea in adancime trebuie sa consideram nodurile in ordinea lexicografic crescatoare a muchiilor care le leaga de tata, obtinem urmatorul sir de sufixe:
Sa vedem care sunt sufixele lui $A$, parcurgand arborele in adancime. Avand in vedere faptul ca la parcurgerea in adancime trebuie sa consideram nodurile in ordinea lexicografic crescatoare a muchiilor care le leaga de tata, obtinem urmatorul sir de sufixe:
p=. !siruri-de-sufixe?fig07.png!
sfarsit pentru
==
De remarcat ca nu este neparat necesara o anumita numerotare a substringurilor, atat timp cat intre ele este pastrata o relatie de ordine valida. In vederea atingerii complexitatii $O(n lg n)$ pentru sortare se recomanda folosirea metodei _radix sort_ (de doua ori sortare prin numarare), aceasta avand complexitate $O(n)$. Insa, pentru usurarea implementarii, se poate folosi functia $sort()$ din STL (Standard Template Library, o librarie ce contine unele structuri de date si algoritmi in limbajul C++). Desi complexitatea va creste la $O(n lg^2^ n)$ in cazul cel mai defavorabil, implementarea devine simtitor mai simpla, iar in practica diferentele sunt abia sesizabile pentru siruri cu lungime mai mica decat $100 000$.
De remarcat ca nu este neaparat necesara o anumita numerotare a substringurilor, atat timp cat intre ele este pastrata o relatie de ordine valida. In vederea atingerii complexitatii $O(n lg n)$ pentru sortare se recomanda folosirea metodei _radix sort_ (de doua ori sortare prin numarare), aceasta avand complexitate $O(n)$. Insa, pentru usurarea implementarii, se poate folosi functia $sort()$ din STL (Standard Template Library, o librarie ce contine unele structuri de date si algoritmi in limbajul C++). Desi complexitatea va creste la $O(n lg^2^ n)$ in cazul cel mai defavorabil, implementarea devine simtitor mai simpla, iar in practica diferentele sunt abia sesizabile pentru siruri cu lungime mai mica decat $100 000$.
Mai jos puteti vedea o implementare extrem de scurta pentru suffix array in $O(n lg^2^ n)$.
# Mark Nelson, _Fast string searching with suffix trees_
# Mircea Pasoi, '_Multe "smenuri" de programare in C/C++... si nu numai!_':multe-smenuri-de-programare-in-cc-si-nu-numai
# Emilian Miron, '_LCA - Lowest common ancestor_':lca-lowest-common-ancestor
# Emilian Miron, '_LCA - Lowest common ancestor_':lowest-common-ancestor
# Michael A. Bender, Martin Farach-Colton, _The LCA Problem Revisited_
# Erik Demaine, _MIT Advanced Data Structures, Lecture 11, April 2nd, 2003_
# Udi Manber, Gene Myers, '_Suffix arrays: A new method for on-line string searches_':http://webglimpse.net/pubs/suffix.pdf

Nu exista diferente intre securitate.

Diferente intre topic forum:

 
3691