Si potrebbe generare tutte le stringhe prima del tempo, e mapparli alle rispettive chiavi.
#generates all substrings of s.
def genSubstrings(s):
#yield all substrings that contain the first character of the string
for i in range(1, len(s)+1):
yield s[:i]
#yield all substrings that don't contain the first character
if len(s) > 1:
for j in genSubstrings(s[1:]):
yield j
keys = ["New York", "Port Authority of New York", "New York City"]
substrings = {}
for key in keys:
for substring in genSubstrings(key):
if substring not in substrings:
substrings[substring] = []
substrings[substring].append(key)
Poi si può ricerca substrings
per ottenere le chiavi che contengono quella stringa:
>>>substrings["New York"]
['New York', 'Port Authority of New York', 'New York City']
>>> substrings["of New York"]
['Port Authority of New York']
Pro:
- ottenere le chiavi di stringa è veloce come l'accesso a un dizionario.
Contro:
- Generazione
substrings
incorre un costo una tantum all'inizio del vostro programma, prendendo tempo proporzionale al numero di chiavi in programs
.
substrings
crescerà approssimativamente in modo lineare con il numero di chiavi in programs
, aumentando l'utilizzo della memoria dello script.
genSubstrings
ha prestazioni O (n^2) in relazione alla dimensione della chiave. Ad esempio, "Port Authority of New York" genera 351 sottostringhe.
. Non aspettarti che sia veloce se il tuo dizionario è grande. –
@MarkRansom Stavo per aggiungere che il mio dizionario è abbastanza grande e che dovrebbe diventare più grande. Stava facendo 'programs.get ('new york')' fino ad ora che è stato molto veloce. –
Se l'esecuzione di tutte le chiavi del dizionario è troppo lenta per l'applicazione, è necessario creare una struttura dati destinata a questo tipo di query. Probabilmente sarebbe una sorta di indice invertito basato su parole o un albero di suffisso. – mensi