web-dev-qa-db-fra.com

Résumé Big-O pour Java Collections Framework??

J'enseignerai peut-être bientôt un "cours intensif Java". Bien qu'il soit probablement prudent de supposer que les membres de l'auditoire connaissent la notation Big-O, il n'est probablement pas prudent de supposer qu'ils connaîtront l'ordre des différentes opérations sur les différentes implémentations de collection.

Je pourrais prendre le temps de générer moi-même une matrice récapitulative, mais si elle est déjà quelque part dans le domaine public, j'aimerais certainement la réutiliser (avec le crédit approprié, bien sûr).

Quelqu'un at-il des pointeurs?

149
Jared

Ce site est très bon mais pas spécifique à Java: http://bigocheatsheet.com/Here is an image in case this link won't work

134
Ben J

Le livre Java Generics and Collections contient ces informations (pages: 188, 211, 222, 240).

Répertorier les implémentations:

                      get  add  contains next remove(0) iterator.remove
ArrayList             O(1) O(1) O(n)     O(1) O(n)      O(n)
LinkedList            O(n) O(1) O(n)     O(1) O(1)      O(1)
CopyOnWrite-ArrayList O(1) O(n) O(n)     O(1) O(n)      O(n)

Définir les implémentations:

                      add      contains next     notes
HashSet               O(1)     O(1)     O(h/n)   h is the table capacity
LinkedHashSet         O(1)     O(1)     O(1) 
CopyOnWriteArraySet   O(n)     O(n)     O(1) 
EnumSet               O(1)     O(1)     O(1) 
TreeSet               O(log n) O(log n) O(log n)
ConcurrentSkipListSet O(log n) O(log n) O(1)

Implémentations de la carte:

                      get      containsKey next     Notes
HashMap               O(1)     O(1)        O(h/n)   h is the table capacity
LinkedHashMap         O(1)     O(1)        O(1) 
IdentityHashMap       O(1)     O(1)        O(h/n)   h is the table capacity 
EnumMap               O(1)     O(1)        O(1) 
TreeMap               O(log n) O(log n)    O(log n) 
ConcurrentHashMap     O(1)     O(1)        O(h/n)   h is the table capacity 
ConcurrentSkipListMap O(log n) O(log n)    O(1)

Implémentations de la file d'attente:

                      offer    peek poll     size
PriorityQueue         O(log n) O(1) O(log n) O(1)
ConcurrentLinkedQueue O(1)     O(1) O(1)     O(n)
ArrayBlockingQueue    O(1)     O(1) O(1)     O(1)
LinkedBlockingQueue   O(1)     O(1) O(1)     O(1)
PriorityBlockingQueue O(log n) O(1) O(log n) O(1)
DelayQueue            O(log n) O(1) O(log n) O(1)
LinkedList            O(1)     O(1) O(1)     O(1)
ArrayDeque            O(1)     O(1) O(1)     O(1)
LinkedBlockingDeque   O(1)     O(1) O(1)     O(1)

Le bas du fichier javadoc du package Java.util contient de bons liens:

194
toolkit

Les Javadocs de Sun pour chaque classe de collecte vous indiqueront exactement ce que vous voulez. HashMap , par exemple:

Cette implémentation fournit des performances à temps constant pour les opérations de base (get et put), en supposant que la fonction de hachage disperse correctement les éléments entre les compartiments. L'itération sur les vues de collection nécessite un temps proportionnel à la "capacité" de l'instance HashMap (le nombre de compartiments) plus sa taille (le nombre de valeurs clé mappages).

TreeMap :

Cette implémentation fournit un coût en temps de log (n) garanti pour les opérations containsKey, get, put et remove.

TreeSet :

Cette implémentation fournit un coût en temps de log (n) garanti pour les opérations de base (ajout, suppression et contenu).

(c'est moi qui souligne)

12
matt b

Le gars ci-dessus a donné une comparaison entre HashMap/HashSet et TreeMap/TreeSet.

Je vais parler de ArrayList vs LinkedList:

Liste des tableaux:

  • O (1) get()
  • amorti O(1) add() _
  • si vous insérez ou supprimez un élément au milieu à l'aide de ListIterator.add() ou Iterator.remove(), il sera O(n)) pour déplacer tous les éléments suivants

LinkedList:

  • O (n) get()
  • O (1) add()
  • si vous insérez ou supprimez un élément au milieu à l'aide de ListIterator.add() ou Iterator.remove(), ce sera O (1)
6
newacct