La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Xavier Tannier Objets Java pour la RI Indexation et Recherche d'Information.

Présentations similaires


Présentation au sujet: "Xavier Tannier Objets Java pour la RI Indexation et Recherche d'Information."— Transcription de la présentation:

1 Xavier Tannier Objets Java pour la RI Indexation et Recherche d'Information

2 Les collections en Java

3 Indexation et Recherche d'Information Objets Java Xavier Tannier Linterface List Une liste = une collection déléments ordonnés Doublons possibles Exemples : – ArrayList (un tableau redimensionnable) – LinkedList (pour faire du FIFO / file) – ArrayDeque (pour faire du FIFO et LIFO) 3

4 Indexation et Recherche d'Information Objets Java Xavier Tannier Les files prioritaires Exemples: – PriorityQueue – PriorityBlockingQueue ("thread-safe") Permettent de créer des files en plaçant les éléments prioritaires en tête (grâce à un Comparator ) 4

5 Indexation et Recherche d'Information Objets Java Xavier Tannier Listes : que choisir ? addgetcontainsremoveCommentaire TableauO(1) O(n) Non redimensionnable. ArrayListO(1) / O(n) O(1)O(n) Insertion plus lente lorsque le tableau doit être redimensionné. LinkedListO(1)O(1) (en tête) O(n)O(n) / O(1) À utiliser si on accède aux éléments de tête. Suppression par litérateur en O(1) ArrayDequeO(1)O(1) (en tête et en queue) O(n) À utiliser si on accède aux éléments de tête ou de queue. En pratique plus rapide que LinkedList. PriorityQueueO(log(n))O(1) (en tête) O(log(n)) Nutiliser que si lordre souhaité nest pas celui dinsertion. 5

6 Indexation et Recherche d'Information Objets Java Xavier Tannier Linterface Set Une collection déléments sans doublons Exemples : – HashSet (rangement par le hashcode, ordre non conservé) – LinkedHashSet (rangement par le hashcode tout en conservant lordre dinsertion) – TreeSet (ensemble ordonné par un Comparator ) 6

7 Indexation et Recherche d'Information Objets Java Xavier Tannier Ensembles : que choisir ? addgetcontainsremoveCommentaire HashSetO(1) Ne conserve pas lordre des éléments. TreeSetO(log(n)) Souvent plus rapide de créer un HashSet puis de tout ordonner dun coup dans un TreeSet. LinkedHashSetO(1) Globalement plus lent que le HashSet (maintient en plus une liste chaînée), sauf pour le parcours qui est plus rapide. 7

8 Indexation et Recherche d'Information Objets Java Xavier Tannier Linterface Map Dictionnaire qui relie des clés et des valeurs. Les clés ne peuvent pas être dupliquées. Exemples : – HashMap (rangement par le hashcode, ordre non conservé) – LinkedHashMap (rangement par le hashcode tout en conservant lordre dinsertion) – TreeMap (ensemble ordonné par un Comparator ) 8

9 Indexation et Recherche d'Information Objets Java Xavier Tannier Maps : que choisir ? addgetcontainsremoveCommentaire HashMapO(1) Ne conserve pas lordre des éléments. TreeMapO(log(n)) LinkedHashMapO(1) Globalement plus lent que le HashMap (maintient en plus une liste chaînée), sauf pour le parcours qui est plus rapide. 9

10 Indexation et Recherche d'Information Objets Java Xavier Tannier Et un dictionnaire bi-directionnel ? On aimerait avoir un dictionnaire qui marche dans les deux sens – Quel est lidentifiant de ce mot ? – À quel mot correspond cet identifiant ? Ça nexiste pas dans lAPI native de java – Interface BidiMap de org.apache.commons.collections – À faire soi-même (voir plus loin) 10

11 Les objets Java et la mémoire

12 Indexation et Recherche d'Information Objets Java Xavier Tannier Les objets Java LAPI Java fournit énormément de classes dobjets qui couvrent de nombreux besoins essentiels (notamment les collections) Ces classes fournissent également de nombreuses méthodes pour faciliter la manipulation des objets On a souvent tendance à utiliser ces classes par facilité Les surcoûts possibles si on ny prête pas garde: – Le temps de calcul (exemple : contains + add, contains + get, etc…) – La mémoire En raison des « frais généraux » (overheads) imposés par la gestion des objets Exemple : entier pour conserver la taille dune collection, etc. 12

13 Indexation et Recherche d'Information Objets Java Xavier Tannier Objets java et overheads : exemples Double : 24 octets – (données = 33 % de la taille de lobjet) – NB : Ces valeurs (et toutes les suivantes) peuvent varier selon larchitecture 13 entêtedonnées (double)alignement 12 octets8 octets4 octets Boolean : 16 octets (!) entêtedonnéesalignement 12 octets1 octet3 octets

14 Indexation et Recherche d'Information Objets Java Xavier Tannier Objets java et overheads : exemples char[2] : 24 octets 14 entêtedonnées (2 car.)alignement 16 octets4 octets String : – Dépend beaucoup des versions et des architectures – Faites le test à la maison : Créez instances vides de String Regardez la mémoire consommée Faites la même chose avec instances de String de 20 caractères

15 Indexation et Recherche d'Information Objets Java Xavier Tannier Objets java et overheads : exemples TreeMap 15 overheads 48 octets overheads 40 octets données X octets pour chaque entrée Pour 100 entrées dun TreeMap : - 8,6 Ko - 82 % doverheads

16 Indexation et Recherche d'Information Objets Java Xavier Tannier Objets java et overheads : exemples double[100] – double[100] – 1632 octets – 2 % doverheads 16 overheadsdonnées (double × 100) 16 octets800 octets overheadsdonnées (double × 100) 16 octets800 octets Toujours se demander : Est-ce vraiment utile ? Le TreeMap permet en plus : – Davoir un tableau redimensionnable – De garantir lordre pendant la mise à jour

17 Exemple : Le dictionnaire

18 Indexation et Recherche d'Information Objets Java Xavier Tannier Dictionnaire : besoins Un lien bi-directionnel entre identifiant et terme – Quel est lidentifiant de ce mot ? – À quel mot correspond cet identifiant ? Indispensable pour gérer efficacement un index Pourquoi ? La solution de facilité : – HashMap 18

19 Indexation et Recherche d'Information Objets Java Xavier Tannier Quest-ce quune HashMap ? HashMap Capacité initiale de 2 n (avec par défaut n = 4 : 16 éléments) table = new Entry[2^n] Une « Entry » est une liste chaînée de paires Ajout dune paire : h = hashcode(k) i = couper h pour quil rentre dans n bits entries = table[i] si entries == null on crée une nouvelle liste chaînée avec k dedans Sinon (collision) on ajoute k à entries si le nombre dentrées dépasse un certain seuil on les recopie dans un tableau deux fois plus grand 19

20 Indexation et Recherche d'Information Objets Java Xavier Tannier Quest-ce quune HashMap ? Recherche dune valeur pour la clé k : h = hashcode(k) i = couper h pour quil rentre dans n bits entries = table[i] On parcourt entries jusquà trouver la clé recherchée On renvoie la valeur correspondante 20

21 Indexation et Recherche d'Information Objets Java Xavier Tannier Les overheads du dictionnaire Avec deux HashMap Pour un vocabulaire de mots : Nombre dobjets = au moins ( ) × 2 = plus de overheads HashMap Entry String Integer 2 sens 21

22 Indexation et Recherche d'Information Objets Java Xavier Tannier Alternative On sait quon aura environ n mots Capacité fixe de n table = new String[n] Ajout dun mot mot : h = hashcode(k) id = couper h pour quil rentre dans log 2 (n) bits chaîne = table[id] si chaîne != null mais chaîne != k (collision) j = id + 1 tant que table[j] != null j++ table[j] = chaîne sinon table[id] = chaîne 22

23 Indexation et Recherche d'Information Objets Java Xavier Tannier Alternative Recherche du mot correspondant à lidentifiant id mot = table[id] Recherche de lidentifiant pour la clé mot h = hashcode(k) id = couper h pour quil rentre dans log 2 (n) bits chaîne = table[id] si chaîne == mot renvoyer id sinon j = id + 1 tant que table[j] != null j++ renvoyer j 23

24 Indexation et Recherche d'Information Objets Java Xavier Tannier Alternative : les overheads Avec un tableau de String + un HashMap pour les collisions du hashcode Pour un vocabulaire de mots, avec 1 % de collisions Nombre dobjets = au moins = plus de overheads Objet String HashMap pour les collisions 24

25 Indexation et Recherche d'Information Objets Java Xavier Tannier Alternative Tableau de String beaucoup plus économe en mémoire que la double HashMap Performances équivalentes en temps de calcul La HashMap propose de nombreuses autres fonctionnalités : – Taille redimensionnable (au prix dun temps de calcul élevé) – Itération – Dautres méthodes prédéfinies devront être recodées (size(), contains(), remove(), …) Mais ces fonctionnalités sont superflues dans notre cas 25

26 Bilan

27 Indexation et Recherche d'Information Objets Java Xavier Tannier Bilan Quand la mémoire est importante : – Se méfier des objets Java « tout prêts » – Se méfier de lencapsulation sauvage – Réfléchir aux fonctionnalités vraiment utiles Préférer les types primitifs (int) aux objets (Integer) quand cest possible Accepter de recoder des choses si cest nécessaire – MAIS Ne pas en profiter pour bâcler son code Efficacité et structure correcte ne sont pas incompatibles ! Ne pas réinventer la roue en moins bien Les algorithmes de base de lAPI Java (tri, ajout, etc.) sont les meilleurs possibles 27


Télécharger ppt "Xavier Tannier Objets Java pour la RI Indexation et Recherche d'Information."

Présentations similaires


Annonces Google