Esiste un modo efficace per determinare il numero di sottostringhe o sottostringhe con una determinata proprietà?

1

La soluzione ingenua è generare l'insieme di sottostringhe / sottostringhe e controllare ciascuna per la proprietà, ma ciò è molto inefficiente. Esiste un algoritmo generale che offre prestazioni migliori senza saperne di più sui dati o sui criteri stessi?

Le sottostringhe verrebbero definite come sottoinsiemi contigui. Ad esempio, "123" darebbe "1", "2", "3", "12", "23" e "123". La proprietà potrebbe essere qualsiasi cosa riguardante i valori del sottoinsieme, ad esempio il prodotto dei valori (quando convertito in ints) è uguale a qualche valore.

    
posta foobar1209 07.09.2016 - 05:51
fonte

3 risposte

6

No, non esiste un modo efficace per farlo data la generalità della tua domanda. Dato che non hai specificato una classe di proprietà, lascerò H essere una funzione di hash crittografica nei numeri naturali e lasciare che la mia proprietà sia "hash su un numero pari in H ".

Supponiamo che H sia difficile da invertire (e che tali funzioni esistano), quindi l'unico modo per dire se un hash della sottostringa su un numero pari è quello di cancellarlo. Per trovare l'insieme di sottostringhe che hash ai numeri pari, è necessario cancellarli tutti. Questo è arbitrariamente costoso, dal momento che non ho specificato H .

    
risposta data 09.09.2016 - 16:21
fonte
2

I dati non appaiono mai dal nulla, provengono sempre da qualche parte.

Il modo più efficace per determinare il numero di sottostringhe o sottostringhe che hanno una certa proprietà, è di avere un "conteggio corrente per la proprietà" che viene aggiornato ogni volta che vengono creati dati / sottorubriche / sottostringhe, modificati, eliminati, ecc. .

    
risposta data 07.09.2016 - 06:10
fonte
0

Supponendo che "se una stringa non soddisfa la condizione, nessuna delle sue sottostringhe non", la soluzione potrebbe essere vicina a quella ingenua. Tutto quello che devi fare è iniziare a controllare le sottostringhe lunghe e se la condizione non è soddisfatta, salta il controllo delle sottostringhe di quella sottostringa:

private void Analyse(string s)
{
    for (int i = 0; i < s.Length; i++)
    {
        string sub = s.Substring(i);
        // do your stuff with the substring to analyse here,
        // break if the condition is not met

        for (int j = 0; j < sub.Length; j++)
        {
            string sub2 = sub.Substring(0, j + 1);
            // do your stuff with the substring to analyse here,
            // break if the condition is not met
        }
    }
}
    
risposta data 10.09.2016 - 09:40
fonte

Leggi altre domande sui tag