eradicazione dell'array = loop mindset [closed]

-1

Ho notato un problema comune nelle revisioni del codice, che assume questo formato:

// "arr" is an array
for (i = 0; i < arr.length; ++i) {
    if (i == 3) {
        // do something with arr[i]
    }
    if (i == 8) {
        // do something else with arr[i]
    }
}

Lo chiamo mentalità "array = loop". In qualche modo hanno in testa che se vuoi lavorare con un array, devi usare un loop. Mi chiedo quale sia la radice di questa mentalità ... ha a che fare con l'istruzione? Che concetto mancano? Come può essere impreparato?

    
posta JoelFan 17.11.2015 - 18:39
fonte

1 risposta

3

Il titolo della tua domanda e il codice nella domanda non corrispondono.

La risposta alla tua domanda nel titolo è: in quale altro modo potresti trovare un valore? A meno che tu non abbia qualche conoscenza in più sulla struttura dell'array, iterarlo è l'unico modo per trovare un valore. Se fai conosci qualcosa in più, ad es. che l'array è ordinato, quindi puoi fare qualcosa di più efficiente, ad es. ricerca binaria. Ma nel peggiore dei casi, è necessario eseguire iterazioni sull'intera matrice, nel caso medio, oltre la metà dell'array.

Ora, riguardo al codice che hai postato: questo codice non sta cercando di trovare un valore. Non sta cercando di trovare nulla, davvero. Conosce già gli indici su cui vuole lavorare, non è assolutamente necessario iterare.

A volte, ci sono motivi legittimi per fare un lavoro extra, però. Ad esempio, in applicazioni sensibili alla sicurezza, il tempo necessario per eseguire un po 'di lavoro può far trapelare informazioni sui dati. (Questo è chiamato un attacco di temporizzazione , che è un caso speciale della classe più generale di attacchi di canali laterali .) Ad esempio, un confronto tra stringhe di solito interrompe e restituisce false non appena trova la prima differenza tra le stringhe. Tuttavia, ciò significa che un utente malintenzionato può, ad es. determinare quanti caratteri all'inizio della password ha indovinato correttamente, riducendo così la complessità della forzatura bruta della password da ** (cioè complessità esponenziale) a * (cioè complessità polinomiale).

Quindi, questo sarebbe un esempio, in cui è sempre necessario scorrere l'intero array e non è possibile interrompere anticipatamente, perché è necessario passare la stessa ora indipendentemente da dove si verifica la differenza.

Questo non sembra essere il caso qui, però.

    
risposta data 18.11.2015 - 00:03
fonte

Leggi altre domande sui tag