2015-12-08 6 views
6

Si supponga di avere 2 binari di uguale dimensione.Corrispondenza rapida r-contiguo (in base alle somiglianze di ubicazione)

A=101011110000 
B=000010101111 

Come è possibile verificare la corrispondenza "R" contigua basata su una posizione simile?

Ad esempio, se impostiamo r = 4, il risultato sarà falso poiché non vi sono 4 similitudini contigue di posizioni. Entrambe le stringhe hanno 0000 o 1111 o 1010 ma non si trovano in una posizione simile.

Tuttavia se impostato:

Il risultato sarà vero dall'ultima 4 caratteri (R) in entrambe le stringhe sono uguali a "1111".

Qual è il modo più veloce per farlo. Ho trovato una soluzione rapida in: http://www.mathworks.com/matlabcentral/answers/257051-fast-r-contiguous-matching

bin = 2.^(0:r - 1); 
A2 = filter(bin, 1, A == '1'); 
B2 = filter(bin, 1, B == '1'); 
bool = any(ismember(A2(r:end), B2(r:end))); % need to trim first r-1 entries 

Ma in questa soluzione il controllo somiglianze non si basa sulla posizione.

+0

Quanto è importante la prestazione? Ti piacerebbe veloce? o è super importante essere veloci? –

+0

Verificare se ['r-matching contiguo, MATLAB'] (http://stackoverflow.com/questions/33871672/r-contiguous-matchlab) aiuta. – Divakar

+0

Se si controlla il collegamento in matematica si vedranno due soluzioni, una funziona in 5.936 sec l'altra in 0.002 sec. La mia stringa originale è di 160 bit e ho bisogno di confrontarla con 50.000 stringhe (160 bit). Quindi ho bisogno di qualcosa abbastanza veloce. – pafpaf

risposta

7

IIUC, si può semplicemente utilizzare convolution, in questo modo -

any(conv(double(A==B),ones(r,1))>=r) 

Esempio corre

Run # 1:

A = 
101011110000 
B = 
000010101111 
r = 
    4 
out = 
    0 

Run # 2:

A = 
1010111101111 
B = 
1100101011111 
r = 
    4 
out = 
    1 
+0

qual è il tipo di A e B? Ottengo una risposta sbagliata sulla mia macchina. –

+0

@HaHacker Ho pensato che fosse tipo 'char array', come -' A = '1010101010'', ecc. – Divakar

+0

@Divakar, grazie, sta funzionando Ha Hacker, è un array di caratteri. – pafpaf