Per un mio progetto AI, ho bisogno di applicare a uno stato fattorizzato tutte le regole che si applicano ai suoi componenti parziali. Questo deve essere fatto molto spesso, quindi sto cercando un modo per farlo il più velocemente possibile.Trova tutte le corrispondenze parziali al vettore di unsigned
Ho intenzione di descrivere il mio problema con le stringhe, tuttavia il vero problema funziona allo stesso modo con i vettori di interi senza segno.
Ho un sacco di voci (di lunghezza N) come questo, che ho bisogno di memorizzare in qualche modo:
__a_b
c_e__
___de
abcd_
fffff
__a__
mio input è una singola voce ciede
a cui devo trovare, il più velocemente possibile , tutte le voci memorizzate che corrispondono ad esso. Per esempio in questo caso le partite sarebbero c_e__
e ___de
. La rimozione e l'aggiunta di voci dovrebbero essere supportate, tuttavia non mi interessa quanto sia lento. Cosa vorrei essere il più veloce possibile è:
for (const auto & entry : matchedEntries(input))
mio problema, come detto, è quella in cui ogni lettera è in realtà un intero senza segno, e il vettore ha una lunghezza specificata (ma nota). Non ho requisiti per il modo in cui le voci dovrebbero essere archiviate, o quale tipo di metadati sarà associato a loro. L'algoritmo ingenuo di abbinamento di tutti è O (N), è possibile fare di meglio? Il numero di voci ragionevoli che ho bisogno di memorizzare è < = 100k.
Sto pensando che una sorta di ordinamento potrebbe aiutare, o qualche strana struttura ad albero, ma non riesco a trovare un buon modo per affrontare questo problema. Sembra anche che qualche word processor debba già fare, quindi qualcuno potrebbe essere in grado di aiutare.
Alcune domande di chiarimento: (1) tutte le voci hanno la stessa lunghezza? cioè possiamo supporre che ognuna delle voci _m_ sia essenzialmente un vettore intero _n_-dimensionale (con alcune dimensioni non specificate)? (2) Avete limiti noti per i singoli elementi (ad esempio, ogni numero intero è compreso tra -10 e +10)? – mindriot
significa _ un valore jolly o ckekl sarebbe anche una corrispondenza? –
Forse un [Interval tree] (https://en.wikipedia.org/wiki/Interval_tree#Higher_Dimensions) è una buona direzione, almeno se i caratteri jolly '_'" possono essere rappresentati come intervalli finiti. – mindriot