Abbinamento multi-pattern

1

Ho un determinato array di byte in C e devo abbinarlo a più array di byte e restituire true se c'è una corrispondenza.

Posso creare vari memcmp ma ritengo che sia molto inefficiente.

Conosci un modo migliore?

    
posta Rui Pedro Caldeira 20.07.2015 - 16:50
fonte

2 risposte

4

prefisso trie :

È un DFA degenerato senza cicli. Per l'implementazione hai un int state e un int nextState[256] per ogni stato.

Per gli stati di corrispondenza, dovresti rendere il numero di stato negativo, quindi sai quando viene raggiunto.

    
risposta data 20.07.2015 - 16:58
fonte
2

In linea di principio una ricerca Trie è ciò che desideri, ma dovresti profilare i dati effettivi per scoprire quando ciò ha effettivamente un rendimento migliore (potrebbe essere sempre peggio a meno che non si riesca a trovare un layout cache-friendly).

Modifica basata sui commenti:

  1. Stai abbinando uno stream o pacchetti discreti?

    Se il primo e hai bisogno di gestire le partite che si estendono lungo il confine tra array di byte consecutivi, sicuramente vuoi il DFA di ratchet.

    Se quest'ultimo, il tuo compromesso dipende da:

  2. Caratteristiche hardware

    Gli effetti cache che ho menzionato in origine sono molto dipendenti dalla piattaforma.

    Se hai una cache veloce di dimensioni ragionevoli ( ie le tue sottostringhe si adattano a essa), allora la percentuale di memcmp potrebbe essere più veloce. Profilo. Puoi velocizzare questo ordinando le sottostringhe e utilizzando il valore di ritorno di memcmp per eseguire la ricerca binaria su di esse.

    Soprattutto per un sistema embedded, se la cache è piccola o la penalità per mancare non è così grande, o le sottostringhe non si adattano comunque alla cache, quindi inseguire i nodi Trie va bene.

    tl; dr - Trie è asintoticamente ottimale ma gli effetti di cache possono dominare. Misuralo!

risposta data 20.07.2015 - 16:57
fonte

Leggi altre domande sui tag