Y a-t-il une fonction de limite inférieure sur un SortedList<K ,V>
? La fonction doit renvoyer le premier élément égal ou supérieur à la clé spécifiée. Y a-t-il une autre classe qui supporte cela?Y at-il une fonction de limite inférieure sur une liste triée <K ,V>?
Gars - veuillez relire la question encore une fois. Je n'ai pas besoin d'une fonction qui retourne la clé si elle est présente. Je suis intéressé par le scénario lorsqu'il n'y a pas de correspondance exacte des clés.
Je suis intéressé par O (log n) temps. Cela signifie que je n'ai pas de problème avec foreach loop, mais que je préfère avoir un moyen efficace de le faire.
J'ai fait quelques tests à ce sujet.
Les instructions Linq ne sont optimisées ni par le compilateur ni par la machine d'exécution, elles passent donc par tous les éléments de la collection et sont O (n) lents. Sur la base de Mehrdad Afshari réponse, voici une recherche binaire qui fonctionne en O (log n) sur la collection Clés:
public static int FindFirstIndexGreaterThanOrEqualTo<T>(
this IList<T> sortedCollection, T key
) where T : IComparable<T> {
int begin = 0;
int end = sortedCollection.Count;
while (end > begin) {
int index = (begin + end)/2;
T el = sortedCollection[index];
if (el.CompareTo(key) >= 0)
end = index;
else
begin = index + 1;
}
return end;
}
La collection n'est-elle pas générée à chaque fois que nous lisons la propriété Keys? – agsamek
agsamek: Non, ce n'est pas régénéré. Il renvoie une instance de la classe interne KeyList qui fournit un accès direct aux éléments de la collection d'origine. Rien n'est copié dans le processus. –
Le "aucune copie pour les clés et les valeurs" est la différence principale avec un SortedDictionary –