Stavo pensando all'andamento della chiamata allo List<T>.Indexof(item)
. Non sono sicuro che sarà una prestazione O (n) per un algoritmo sequenziale o prestazioni O (log (n)) per un albero binario ??Com'è implementato l'elenco <T> .IndexOf() in C#?
risposta
Utilizzando Riflettore per .NET possiamo vedere:
public int IndexOf(T item)
{
return Array.IndexOf<T>(this._items, item, 0, this._size);
}
public static int IndexOf<T>(T[] array, T value, int startIndex, int count)
{
return EqualityComparer<T>.Default.IndexOf(array, value, startIndex, count);
}
internal virtual int IndexOf(T[] array, T value, int startIndex, int count)
{
int num = startIndex + count;
for (int i = startIndex; i < num; i++)
{
if (this.Equals(array[i], value))
return i;
}
return -1;
}
Dietro le quinte viene utilizzato un normale array
, infatti il metodo IndexOf
chiama semplicemente Array.IndexOf
. Poiché gli array non ordinano gli elementi, le prestazioni sono O (n).
E 'O(n)
secondo i MSDN.
Questo metodo esegue una ricerca lineare; pertanto, questo metodo è un'operazione O (n), dove n è Count.
List<T>
è supportato da un array piatto, quindi list.IndexOf(item)
è O (n).
Se è necessario un rendimento più veloce, considerare HashSet<T>
. È un compromesso tra velocità e memoria, ma ne vale la pena se si valuta il primo sul secondo.
(Non è esattamente la stessa di un List<T>
, si comporta come un unico dizionario colonna, ma per i casi in cui si sta per avere una lista unica, è un modo per farlo.)
List<T>.IndexOf
è O (n) che è in effetti ottimale per un insieme non ordinato di n elementi.
List<T>.BinarySearch
è O (log n) ma funziona correttamente solo se l'elenco è ordinato.
Questa è una domanda vecchia, ma ho pensato che questo legame sarebbe stato interessante: Experiment: List internals and performance when adding new elements
La mia risposta in ritardo, ma penso che la pena ricordare che al giorno d'oggi è possibile accedere direttamente alle fonti MS: http://referencesource.microsoft.com/#mscorlib/system/collections/generic/list.cs
Non c'è più bisogno di riflessioni dal momento che il codice .NET BCL è ora disponibile online.
Implementa un elenco di dimensioni variabili che utilizza una serie di oggetti per memorizzare gli elementi . Un elenco ha una capacità, che corrisponde alla lunghezza allocata di dell'array interno. Quando gli elementi vengono aggiunti a un elenco, la capacità di l'Elenco viene aumentata automaticamente come richiesto riallocando l'array interno .
come implementata come un array ed esegue una ricerca lineare , si può facilmente dedurre che la complessità algoritmica del metodo IndexOf
è O (n).
Come detto da altri le informazioni sono disponibili al pubblico su MSDN: https://msdn.microsoft.com/en-us/library/e4w08k17(v=vs.110).aspx
Questo metodo esegue una ricerca lineare; pertanto, questo metodo è un'operazione O (n) , dove n è Count.
Anche in questo caso, è possibile controllare le fonti e finiscono seing che il metodo di supporto statica IndexOf
della classe Array è in realtà chiamato dietro le quinte:
http://referencesource.microsoft.com/#mscorlib/system/array.cs
Se l'elenco/array è già ordinato in anticipo è possibile allora piuttosto usare una ricerca binaria: https://msdn.microsoft.com/en-us/library/w4e7fxsh(v=vs.110).aspx
Questo metodo è un'operazione O (log n), dove n è il numero di elementi nell'intervallo.
Fantastico! Grazie mille per quello. Non mi interessa cosa dice la gente, a volte devi solo guardare il codice sorgente. –
- 1. Sottostringa IndexOf in C#
- 2. Come utilizzare l'espressione del generatore CMake $ <TARGET_FILE: tgt>?
- 3. C++ implementato in chiaro C
- 4. Ordinamento Radix implementato in C++
- 5. Come viene implementato LLVM <>?
- 6. Funzione IndexOf in T-SQL
- 7. Utilizzando indexOf in CoffeeScript
- 8. Elenco <string> oggetto IndexOf restituisce -1. Come?
- 9. Come viene implementato l'operatore sizeof in C++?
- 10. Tipo di inferenza implementato in C++
- 11. predicato IndexOf?
- 12. IndexOf stile ArrayList per std :: vector in C++?
- 13. indexOf e lastIndexOf in PHP?
- 14. Come utilizzare IndexOf in JQuery
- 15. Utilizzo di indexOf in Jade
- 16. Lua - get indexOf stringa
- 17. jQuery indexOf function?
- 18. stringa IndexOf e Sostituisci
- 19. Modello MVC C++ - Come deve essere implementato?
- 20. Perché IndexOf restituisce -1?
- 21. Confronto IndexOf e stringhe ordinali
- 22. C#: Come dovrebbe essere implementato ToString()?
- 23. Perché indexOf non funziona in Internet Explorer?
- 24. DART: indexOf() in un elenco di istanze
- 25. Come deve essere implementato un pool di thread in C?
- 26. È smtplib pure python o implementato in C?
- 27. In C++ come viene generalmente implementato l'overloading delle funzioni?
- 28. Come è implementato il Memento Pattern in C# 4?
- 29. Schema di osservatore implementato in C# con i delegati?
- 30. Stack <> implementazione in C#
Non guardare mai il codice quando c'è una documentazione dettagliata. A volte il codice è solo un dettaglio di implementazione e non ci sono garanzie. –
@Ken Bloom: gli articoli MSDN a volte sono molto buoni, a volte sono orribili. Quindi, se hai una domanda sull'implementazione di un metodo specifico, penso che sia il modo migliore: vai a vedere come viene implementato veramente. – abatishchev
Quando il codice e i commenti non sono d'accordo, entrambi sono probabilmente sbagliati. – Malfist