Controlla se la lista ha un elenco di valori

0

Ho cercato di capire un algoritmo efficiente in grado di verificare se un elenco di valori contiene un elenco di valori. Entrambe le liste sono ordinate in ordine crescente.

Ad esempio:

Controlla se

var listToSearch = [1,2,3,4,5,6,7]

contiene

var searchValues = [1,2,3]

Senza scorrere l'elenco per ogni valore in searchValues . Né voglio usare qualcosa come la ricerca binaria per ogni valore in searchValues .

Ho provato a creare una ricerca binaria modificata per questo, ma non funziona. C'è qualche modifica della ricerca binaria ma per più valori di ricerca o qualsiasi altro algoritmo progettato per questo problema?

Modifica: voglio verificare se listToSearch ha ANY dei valori in searchValues (non l'intero sottolista). Quindi, ad esempio, l'algoritmo potrebbe restituire [true, true, true] poiché 1,2 e 3 sono tutti trovati in listToSearch

    
posta boidkan 04.04.2016 - 19:35
fonte

2 risposte

0

Se si dispone di un elenco collegato, sarà necessario iterare ogni elemento in sequenza. È possibile avere una ricerca binaria se si utilizza una matrice.

Chiamiamo L l'elenco che stai cercando e V l'elenco dei valori che cerchi.

La tua funzione di ricerca dovrebbe restituire la sottolista di L che segue l'elemento v di V che stai cercando. Poiché gli elementi sono ordinati, sai che il prossimo elemento in V sarà maggiore di v , e quindi dovrai solo cercare nella sottolista che segue v in L .

Ad esempio, dì che i tuoi elenchi sono nominati come segue:

L = [1,2,3,4,5,6,7]
V = [3,4,7,8]
  1. Cerca 3 in [1,2,3,4,5,6,7].
  2. Cerca 4 in [4,5,6,7]
  3. Cerca 7 in [5,6,7]
  4. Cerca 8 in []

Ogni volta che la ricerca restituisce una lista vuota, il risultato per l'elemento di ricerca è falso (vero altrimenti). Dal momento che avanzi in entrambe le liste contemporaneamente, stai evitando alcune ricerche inutili.

    
risposta data 04.04.2016 - 21:37
fonte
0

Poiché entrambe le liste sono ordinate, puoi farlo con un algoritmo di fusione leggermente modificato. Non dici per quale lingua stai usando, quindi userò uno psuedocode simile a C:

// ListToFind is the list of items to look for
// ListOfItems is the list of items to be searched
ixListToFind = 0   
isListOfItems = 0

while (ixListToFind < ListToFind.Count && ixListOfItems < ListOfItems.Count)
{
    if (ListToFind[ixListToFind] < ListOfItems[ixListOfItems])
    {
        // This item not found in the list. So move to the next one.
        ixListToFind = ixListToFind + 1
    }
    else if (ListToFind[ixListToFind] > ListOfItems[ixListOfItems])
    {
        // Move to the next item
        ixListOfItems = ixListOfItems + 1
    }
    else
    {
        // Found the item
        // Output or process it ... whatever.
        // Then move to the next item
        ixListToFind = ixListToFind + 1
    }
}

Funziona bene se il numero di elementi da trovare e la dimensione della lista in cui stai cercando sono di dimensioni relativamente simili. Ad esempio, se stai cercando 5 elementi in un elenco di 20, sarà fantastico. Ma se stai cercando 100 elementi in un elenco di un milione, probabilmente vorrai usare la ricerca binaria. Dipende da quante volte cercherete articoli nello stesso elenco.

    
risposta data 05.04.2016 - 18:12
fonte

Leggi altre domande sui tag