Trovare la distanza media di Hamming più bassa quando l'ordine delle corde è importante

7

Ho una sequenza di stringhe binarie che voglio trovare una corrispondenza tra un insieme di sequenze più lunghe di stringhe binarie. Una corrispondenza significa che la sequenza comparata fornisce la distanza media minima di Hamming quando tutti gli elementi della sequenza più corta sono stati abbinati a una sequenza in uno dei set più lunghi.

Fammi provare a spiegare con un esempio. Ho un set di frame video che sono stati sottoposti a hashing utilizzando un algoritmo di hashing percettivo in modo che i fotogrammi video che hanno lo stesso aspetto abbiano approssimativamente lo stesso hash. Voglio abbinare un breve video ad una serie di video più lunghi, per vedere se la clip è contenuta in uno di questi. Ciò significa che ho bisogno di scoprire dove la sequenza dei frame hash nel video breve ha la distanza media di Hamming più bassa rispetto ai video lunghi.

Il video breve è le sottostringhe Sub1, Sub2 e Sub3 e voglio abbinarle agli hash dei video lunghi in Src. L'indizio qui è che le stringhe devono corrispondere nell'ordine specifico in cui sono fornite, ad es. che Sub1 deve sempre corrispondere all'elemento prima di Sub2 e Sub2 deve sempre corrispondere all'elemento prima di Sub3. In questo esempio si mapperebbe così: Sub1-Src3, Sub2-Src4 e Sub3-Src5.

Quindi la domanda è questa: c'è un algoritmo per trovare la distanza minima di Hamming quando l'ordine degli elementi è comparato? L'approccio ingenuo per confrontare la sequenza di sottostringhe con ogni stringa sorgente ha vinto " Naturalmente, lo taglio, quindi ho bisogno di qualcosa che preferibilmente può abbinare una sottostringa (molto) più breve ad un insieme di milioni di elementi. Ho esaminato gli alberi MVP, gli alberi BK e simili, ma tutto sembra prendere in considerazione solo una stringa binaria e non una loro sequenza.

Sub1: 100111011111011101
Sub2: 110111000010010100
Sub3: 111111010110101101

Src1: 001011010001010110
Src2: 010111101000111001
Src3: 101111001110011101
Src4: 010111100011010101
Src5: 001111010110111101
Src6: 101011111111010101

Ho aggiunto un calcolo degli esempi di seguito. (Le distanze di Hamming non sono corrette, ma non importa)

**Run 1.**
dist(Sub1, Src1) = 8
dist(Sub2, Src2) = 10
dist(Sub3, Src3) = 12
average = 10

**Run 2.**
dist(Sub1, Src2) = 10
dist(Sub2, Src3) = 12
dist(Sub3, Src4) = 10
average = 11

**Run 3.**
dist(Sub1, Src3) = 7
dist(Sub2, Src4) = 6
dist(Sub3, Src5) = 10
average = 8

**Run 4.**
dist(Sub1, Src3) = 10
dist(Sub2, Src4) = 4
dist(Sub3, Src5) = 2
average = 5

Quindi il vincitore qui è la sequenza 4 con una distanza media di 5.

    
posta user1049697 14.10.2013 - 19:36
fonte

2 risposte

2

Forse potresti semplicemente concatenare rispettivamente srcs e subs. Dopodiché puoi utilizzare un sequenza di allineamento dell'algoritmo di tuo gusto, come Smith-Waterman algorithm o il più generale Algoritmo Needleman-Wunsch .

    
risposta data 17.10.2013 - 23:28
fonte
2

Non conosco alcun algoritmo specifico per questo problema, ma questo mi sembra un problema di ottimizzazione.

Suggerirei succursale e associato come punto di partenza. Combinato con una ricerca in profondità per ottenere i limiti superiori (la distanza minima per la presa) per il limite e non è necessario attraversare tutti i bordi dell'albero. Se la tua distanza di Hamming accumulata su un nodo è già più grande della più bassa già trovata da una radice ad una foglia, puoi smettere di attraversare i sottoalberi di questo nodo.

Se riesci a trovare un buon euristico per scegliere quale ramo visitare dopo puoi ridurre ulteriormente il numero di percorsi da percorrere. Qualcosa come espandere sottostrutture con distanza di Hamming accumulata più bassa ancora.

Un'altra cosa che potresti includere nell'euristica è la distanza fino alla fine. Più ti allontani dalla fine del video più grande è la possibilità di trovare una corrispondenza migliore, riducendo così la distanza di hamming. (Se ho capito bene il tuo problema)

Se usi l'euristica con qualche crossover di profondità-prima e larghezza-prima, ma potrebbe essere anche più veloce (non ho ancora fatto la matematica). L'idea sarebbe quella di attraversare rigorosamente da una radice all'altra, ma dopo aver finito si decide quale sottostruttura si desidera espandere successivamente da radice ad albero, non solo guardando tutti i nodi scoperti dall'ultimo attraversamento (al contrario della profondità ricorsiva- prima ricerca). In questo modo potrebbe trovare i limiti inferiori ancora prima, ma avrai bisogno di più spazio per il calcolo poiché molto probabilmente avrai più nodi nell'elenco di quelli inesplorati e potrai riassumere i risultati per i sottoalberi più tardi.

    
risposta data 17.10.2013 - 18:14
fonte

Leggi altre domande sui tag