J'ai besoin d'itérer à la fois vers l'avant et vers l'arrière dans un ensemble trié. Si j'utilise NavigableSet, j'obtiens un itérateur strictement vers l'avant et un itérateur strictement vers l'arrière (iterator()
et descendingIterator()
) mais aucun qui peut avancer et reculer. Quelle est la complexité temporelle de NavigableSet.lower()
et higher()
? Je peux les utiliser à la place, mais je suis réticent à le faire s'ils sont inefficaces.Java: SortedSet itérateur "cursor" -style
Répondre
Il n'y a que deux implémentations de NavigableSet. Dire que vous avez opté pour le TreeSet, alors que je n'ai pas la source à portée de main, le Javadoc dit qu'il est basé sur un TreeMap providing O(log(n)) for get/put/containsKey/remove. Au pire, cela permettrait d'obtenir une valeur pour trouver la valeur inférieure/supérieure pour, plus une recherche supplémentaire pour obtenir la valeur suivante/précédente, en fournissant O (2log (n)) = O (log (n)) .
Les arbres sont le cas le plus défavorable O (n) pour la recherche dans le cas où il s'agit réellement d'une liste, mais en général, O (hauteur).
y a-t-il des arbres qui sont plus rapides pour l'itération entre les éléments adjacents? –
C'est un compromis entre les opérations. Cela dépend de la taille de 'n'. Pour un arbre, get est 'O (log n)' et l'itération est aussi 'O (log n)'. En utilisant un tableau/liste trié, get est 'O (n)' et l'itération est 'O (1)'. – Andy
ok, merci. Je suis assez sûr que SkipLists a O (log n) obtenir, et O (1) itération. –
En fonction de vos besoins exacts, vous pouvez convertir l'ensemble trié en liste, indiquer une liste de matrices et utiliser un list iterator pour la traversée. Il peut être utilisé dans les deux sens via les méthodes next() et previous(), qui peuvent être mélangées librement.
Ceci est un bon point, et une meilleure description de l'utilisation serait utile. Cependant, au moins aussi loin que ceux fournis avec l'API Java, les seules options pour SortedSet (TreeSet, ConcurrentSkipListSet) sont aussi NavigableSets. Donc, il y aurait juste le temps supplémentaire de convertir en une liste, et ensuite la procédure spécifiée par Andy dans le commentaire de ma réponse. – apiri
- 1. Java itérateur de travail parallèle?
- 2. SortedSet avec INotifyPropertyChanged
- 3. Python: itérateur d'arbre binaire sans itérateur
- 4. Récupération d'Oracle Cursor avec JDBC
- 5. Itérateur générique
- 6. Android Proxy Cursor
- 7. PHP Oracle Ref Cursor
- 8. Blackberry - Custom EditField Cursor
- 9. get cursor from array
- 10. WPF ListView Cursor Change
- 11. GDI & Hardware Cursor
- 12. Comportement étrange d'Android Cursor
- 13. ListActivity with Cursor
- 14. SortedSet dans Grails ne fonctionne pas
- 15. Java Set itérateur, sûr pour l'élimination des éléments?
- 16. Java Joda Time - Implémenter un itérateur de plage de dates
- 17. itérateur pour remplacer les membres de la liste en Java?
- 18. Question de gestion Flex Cursor
- 19. python postgres cursor timestamp issue
- 20. Strange comportement WPF Thumb Cursor
- 21. Problème itérateur cpp
- 22. Comment invalider un itérateur?
- 23. bloc itérateur à LINQ
- 24. céder itérateur avec réflexion
- 25. Comment utiliser un itérateur?
- 26. Composition C++ avec itérateur
- 27. list itérateur non incrémentable
- 28. retourner un itérateur
- 29. Python paresseux itérateur
- 30. comment initialiser un itérateur
Avez-vous (temps) testé les alternatives avec un jeu de données représentatif? – matiasf
vous avez un point - si vous devez optimiser, vous devez être prêt à mesurer - mais c'est pourquoi j'ai demandé ici, pour gagner la sagesse de ceux d'entre vous qui sont plus expérimentés. (pour ne pas mentionner cela devrait être dans la documentation mais n'est pas .grrrr.) –