Confronto tra l'algoritmo Aho-Corasick e l'algoritmo Rabin-Karp


11

Sto lavorando su algoritmi di ricerca di stringhe che supportano la ricerca di più schemi. Ho trovato due algoritmi che sembrano i candidati più forti in termini di tempo di esecuzione, ovvero Aho-Corasick e Rabin-Karp . Tuttavia, non sono riuscito a trovare alcun confronto completo tra i due algoritmi. Quale algoritmo è più efficiente? Inoltre, quale è più adatto per il calcolo parallelo e la ricerca di più schemi? Infine, quale richiede meno risorse hardware?

Per l'algoritmo AC, la fase di ricerca richiede tempo , mentre è per RK. Tuttavia, il tempo di esecuzione per RK è che lo rende simile a AC. La mia conclusione provvisoria è che RK sembra praticamente migliore in quanto non ha bisogno di tanta memoria come AC. È corretto?O ( n m ) O ( n + m )O(n+m)O(nm)O(n+m)


Tutti i tuoi schemi hanno la stessa lunghezza?
Hendrik Jan,

@HendrikJan No, diversi schemi di lunghezza
Hawk,

Se i modelli sono di diversa lunghezza sembra difficile elaborarli in parallelo usando RK? La pagina di Wikipedia sembra suggerire che questi schemi abbiano la stessa lunghezza, sebbene l'aggiornamento degli hash possa essere fatto per lunghezze diverse.
Hendrik Jan,

Sei interessato a qualche tipo di studio teorico o esperienza pratica?
Raffaello

@Raphael Dal punto di vista accademico, prima applicavamo lo studio teorico prima di dimostrarlo empiricamente. Ho pubblicato la domanda qui perché non mi aspetto risposte di programmazione. Ho bisogno di una risposta algoritmica logica
Hawk,

Risposte:


4

L'analisi del tempo di esecuzione asintotica non è probabilmente lo strumento migliore da scegliere tra questi due algoritmi: l'analisi asintotica ignora i fattori costanti e i fattori costanti saranno critici qui. I due algoritmi hanno sostanzialmente lo stesso tempo di esecuzione asintotico, quindi l'analisi asintotica probabilmente non è molto utile per scegliere tra di loro.

Invece, la scelta giusta tra i due algoritmi è attraverso l'analisi sperimentale. Identifica un carico di lavoro rappresentativo, quindi confronta le prestazioni di entrambi gli algoritmi sul carico di lavoro, sui tipi di macchine che intendi utilizzare nella pratica.


Per inciso, sembra che potresti avere una leggera confusione sul tempo di esecuzione asintotico di Rabin-Karp. Da un lato dici che Rabin-Karp ha tempo di esecuzione, ma poi nella frase successiva dici che Rabin-Karp ha tempo di esecuzione. Forse sei confuso dalla differenza tra il tempo di esecuzione previsto (caso medio) e il caso peggiore.O ( n + m )O(nm)O(n+m)

Poiché Rabin-Karp è randomizzato, il tempo di esecuzione atteso (nel caso medio) è la metrica appropriata da utilizzare per prevedere le prestazioni del mondo reale nella pratica. In particolare, qui la media viene presa sulla scelta casuale della funzione hash. In particolare, non è una media rilevata nella scelta delle stringhe. Anche per la stringa e il motivo peggiori possibili, il tempo medio di esecuzione sarà comunque . Con una funzione hash adatta, la probabilità che il tempo di esecuzione sia più lungo di è esponenzialmente ridotta in . Per dirla in altro modo (ed essendo leggermente informale), c'è solo una piccola possibilità esponenziale che Rabin-Karp impieghi più tempo dic ( n + m ) c O ( n + m )O(n+m)c(n+m)cO(n+m)tempo. Dobbiamo già accettare esponenzialmente piccole possibilità che accadano cose brutte - per esempio, c'è una piccola ma non zero possibilità di un raggio cosmico che provoca un capovolgimento nella tua memoria che provoca il loop del programma per sempre. Quindi, preoccuparsi di questa possibilità esponenzialmente piccola non ha senso.

Da un punto di vista ingegneristico, il tempo di esecuzione di Rabin-Karp è [o potrebbe anche essere]. Ignora le cose ; non è rilevante per la pratica.O ( n m )O(n+m)O(nm)


1

Tuttavia, non sono riuscito a trovare alcun confronto completo tra i due algoritmi.

una domanda come questa sulle prestazioni relative di due algoritmi dipende generalmente dal caso medio rispetto al caso peggiore che dipende dai dati effettivi. la risposta teorica è che l' algoritmo Aho-Corasick supererà Rabin-Karp nel caso limite di dati di grandi dimensioni / asintoticamente, ma dove tale limite è raggiunto è l'implementazione e i dati dipendenti e il compromesso tra la ricerca / tempi di esecuzione.O ( n m )O(n+m)O(nm)

ma hai scritto la tua richiesta implicita per un "confronto completo", alcuni articoli sono stati scritti sperimentalmente / empiricamente confrontando questi due e altri algoritmi su dati reali e includono analisi / confronto dei pro / contro / compromessi dei diversi algoritmi, ad esempio:

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.