Un primo pensiero. È possibile determinare la lunghezza n
della stringa in O(log2(n))
.
- check
Z*
dove Z
rappresenta k
punti interrogativi a partire da 0, 1, e poi raddoppiando il numero di punti interrogativi con ogni controllo finché non si verifica alcuna corrispondenza. n
deve essere compreso tra k/2
e k
- Trova la lunghezza esatta utilizzando lo stesso modello modificando
k
nello stesso modo della ricerca binaria.
Conoscere la lunghezza esatta potrebbe aiutare a eseguire una sorta di divide-et-impera nel dominio spaziale.
UPDATE
Se si conosce la lunghezza, è possibile utilizzare lo stesso modello per individuare correttamente un simbolo.
Esempio:
..X. ..XX (spaces added for readability)
+ symbol may be X
- symbol is not X
X symbol is X
*X* => MATCH ++++ ++++
*X* ???? => MATCH ++++ ++++
*X*?? ???? => NO MATCH --++ ++++
??X? ???? => MATCH --X+ ++++
??XX ???? => NO MATCH --X- ++++
??X? *X*?? => NO MATCH --X- --++
??X? ??X? => MATCH --X- --X+
??X? ??XX => MATCH --X- --XX
Per la lunghezza n
e alfabeto stringa di formato m
questo richiederà circa O(log2(n))
per trovare la lunghezza della stringa, circa O(n • log2(n))
per posizionare correttamente n
simboli, e O(m)
per trovare i simboli usati - sommando tutti insieme produce O(n • log2(n) + m)
.
Posso immaginare che sia possibile accelerare unendo diversi passaggi, magari testare i simboli usati mentre si determina la lunghezza della stringa o contemporaneamente localizzare due (o anche più?) Simboli nella prima e nella seconda metà della stringa . Ciò richiederà di ricontrollare i passaggi uniti separatamente se il controllo fallisce al fine di determinare quale controllo fallire. Ma finché il controllo unito riesce, ottieni informazioni su entrambi.
Forse lo calcolerò domani per vedere se accelera davvero la cosa.
fonte
2009-05-14 19:39:04
Alcune varie domande sulla stringa: che cosa può essere il set di caratteri? Solo lettere o altri caratteri sono autorizzati a? Quanto può durare la stringa? La materia inferiore/maiuscola? – schnaader
Non capisco davvero come queste informazioni possano aiutarvi a trovare un algoritmo efficiente, ma dal momento che avete chiesto - nel mio caso particolare, la stringa è un hostname su Internet, quindi è alfa-numerics e alcuni simboli come. e -. –
L'involucro non importa -? corrisponde esattamente a un simbolo, * corrisponde a zero o più simboli, e ogni altro simbolo corrisponde esattamente a quel simbolo (se non fa distinzione tra maiuscole e minuscole, puoi considerare i simboli minuscolo e maiuscolo uguali). Anche l'alfabeto non ha importanza (eccetto forse come gestire? E * nell'alfabeto). Interessante potrebbe essere se ci sono delle ipotesi sulla dimensione dell'alfabeto, la lunghezza della corda, le frequenze dei simboli o il rapporto tra la dimensione dell'alfabeto e la lunghezza della corda. –