Io parto dal presupposto che si dispone di un singolo X e un singolo Y per confrontare. Concatenarli, separati da un carattere di indicatore che non appare in nessuno dei due, per formare ad es. Xoy. Ora forma lo http://en.wikipedia.org/wiki/Suffix_array in tempo lineare.
Quello che ottieni è un array di puntatori alle posizioni nella stringa concatenata, in cui i puntatori sono disposti in modo che le sottostringhe che indicano siano visualizzate in ordine alfabetico nell'array. Vedrete anche una serie LCP, dando la lunghezza del più lungo prefisso comune condivisa tra un suffisso e il suffisso direttamente prima che nella matrice, che è il suffisso che ordina poco meno di esso. Questo è infatti il più lungo prefisso comune condivisa tra questa posizione e qualsiasi sottostringa meno, perché qualsiasi cosa con un prefisso più comune e meno di string [i] sarebbe sorta tra esso e la stringa corrente [i - 1].
È possibile indicare quale stringa originale punta un puntatore dalla sua posizione, perché X viene prima di Y. È possibile tagliare l'array in sottosezioni alternate di puntatori X e Y. La lunghezza del prefisso comune condiviso tra pos [i] e pos [i - 1] è lcp [i]. La lunghezza del prefisso condiviso tra pos [i] e pos [i-2] è min (lcp [i], lcp [i-1]). Quindi, se inizi dal valore Y poco prima di un intervallo di X, puoi calcolare il numero di caratteri di prefisso tra quella Y e tutte le X, a turno abbassando la sezione, eseguendo un'operazione minima ad ogni passaggio. Allo stesso modo è possibile calcolare il numero di caratteri di prefisso condivisi tra tutte quelle X e Y visualizzata accanto nella matrice suffisso al costo di un min per X. Idem, naturalmente per Y gamme. Ora fai un massimo per ogni voce per calcolare il prefisso più lungo condiviso tra ogni posizione in X (o Y) e qualsiasi posizione in Y (o X).
Penso che vuoi le sottostringhe all'interno di X o Y che hanno piccoli prefissi condivisi tra esso e qualsiasi altra sottostringa dell'altro sesso, perché le stringhe un carattere più lungo di questo a partire dalla stessa posizione non compaiono nell'altro sesso a tuttiPenso che dopo aver eseguito i calcoli min() sopra puoi estrarre le sottostrutture con il prefisso N più piccolo usando un heap per tenere traccia delle N voci più piccole. Penso che tutto qui richieda tempo lineare in | X | + | Y | (a meno che N sia paragonabile a | X | or | Y |).
Wow! Bella domanda –
Come si determina l'unicità? Supponiamo che le sequenze siano 'ATCCCGACCGATCAGT' e' ATCCCGACGGACCAGT', qual è il risultato atteso? – NullUserException
@NullUser Io o uno dei miei colleghi ti richiameremo su questo. – person