• Aucun résultat trouvé

Entra^ınement au concours ACM-ICPC Conteneurs des biblioth`eques standard C++ et Java

N/A
N/A
Protected

Academic year: 2022

Partager "Entra^ınement au concours ACM-ICPC Conteneurs des biblioth`eques standard C++ et Java"

Copied!
24
0
0

Texte intégral

(1)

Entra^ınement au concours ACM-ICPC

Conteneurs des biblioth`eques standard C++ et Java

(2)

Mars 2016

Plan

G´en´eralit´es

Collections de base

Collections `a usage plus rare

(3)

Collections

Les collections regroupent un nombre arbitraire d’´el´ementsde m^eme type

Suivant les collections, lacomplexit´e des op´erations suivantes varie : acc´eder aun-i`eme ´el´ement

rechercher un ´el´ement

ajouter un ´el´ement `a une position arbitraire supprimer un ´el´ement

parcourir les ´el´ements dans l’ordre

Cas particulier, tableaux associatifs: peuvent ^etre vus comme collections de paires (clef, valeur)

Important de choisir la collection la mieux adapt´eeaux besoins d’un probl`eme

(4)

Mars 2016

Collections en Java

Hi´erarchie d’interfaces

Chaque classe concr`ete impl´emente une ou plusieurs de ces interfaces Les collections standards sont dans le paquetage java.util

Vector, Hashtable : collections thread-safe. Inutiles dans un contexte single-thread

(5)

Collections en C++

Pas d’h´eritage, C++ utilise le m´ecanisme de la programmation g´en´erique (templates) pour permettre `a des fonctions de manipuler des collections diverses

Toutes les collections sont dans l’espace de nom std (ou std::tr1 pour unordered_set, unordered_map, etc., sur les compilateurs pr´e-C++ 2011)

Certaines collections (stack, queue, priority_queue) sont des adapteurs qui peuvent utiliser plusieurs classes (list, vector. . . ) comme impl´ementation

(6)

Mars 2016

It´ erer sur une collection (1/2)

En C++ 1998 :

for( c o l l e c t i o n _ t y p e :: c o n s t _ i t e r a t o r

it = c o l l e c t i o n . b e g i n () , i t e n d = c o l l e c t i o n . end ();

it != i t e n d ; ++ it ) {

v a l u e _ t y p e v =* it ;

/* F a i r e q u e l q u e c h o s e av e c v */

}

Remplacer const_iterator par iterator quand on modifie la collection.

(7)

It´ erer sur une collection (2/2)

En C++ 2011 :

for(a u t o v : c o l l e c t i o n ) {

/* F a i r e q u e l q u e c h o s e av e c v */

}

Utiliser auto & pour modifier la collection.

En Java :

for( v a l u e _ t y p e v : c o l l e c t i o n ) { /* F a i r e q u e l q u e c h o s e av e c v */

}

(8)

Mars 2016

Algorithmes de la biblioth` eque standard

Grand nombre d’algorithmes polymorphesdans la biblioth`eque standard s’appliquant `a des collections quel que soit leur type En C++, #include <algorithm> ; les algorithmes prennent en argument des it´erateurs vers le d´ebut et la fin

En Java, import java.util.Collections ; ; les algorithmes prennent en argument les collections

Pour un tri :

std :: s o r t ( c o l l e c t i o n . b e g i n () , c o l l e c t i o n . end ( ) ) ; C o l l e c t i o n s . s o r t ( c o l l e c t i o n );

Grand nombre d’algorithmes disponibles : tri, recherche, recherche dichotomique, copie, inversion, remplissage, ´enum´eration des permutations d’un ensemble. . .

(9)

Plan

G´en´eralit´es

Collections de base

Collections `a usage plus rare

(10)

Mars 2016

Tableaux de taille fixe

Tableaux de base du langage value_type[size] en C++ et Java En C++ (mais pas en C 1999 !) la taille a besoin d’^etre connue `a la compilation

Il existe aussi une classe array<value_type,size> en C++ 2011, plus homog`ene avec les autres collections, et rendant certaines interactions avec la biblioth`eque standard plus pratiques Occupation m´emoire minimale (on ne peut pas faire mieux) Acc`es `a un ´el´ement arbitraire :O(1)

Pas de suppression, pas d’ajout d’´el´ement Initialisation avec memset :

memset(t, 0, sizeof(value_type) * size) (plus efficace qu’une boucle)

(11)

Tableaux de taille variable

vector en C++, ArrayList en Java

Peut typiquement occuper 2 fois plus d’espace qu’un tableau de taille fixe

Acc`es `a un ´el´ement arbitraire :O(1)

Ajout/suppression `a la fin du tableau :O(1) amorti Ajout/suppression `a un autre endroit :O(n)

Pratique pourindexer des ´el´ements par des entiersquand il n’y a pas (ou peu) de trousdans les entiers indexant

Il existe aussi deque en C++, ArrayDeque en Java pour

ajout/suppression en temps constant `a la fois au d´ebut et `a la fin du tableau

(12)

Mars 2016

Liste doublement cha^ın´ ee

list en C++, LinkedList en Java Acc`es au premier ou dernier ´element : O(1) Acc`es `a l’´element suivant ou pr´ec´edent :O(1) Acc`es `a un ´el´ement arbitraire :O(n)

Ajout/suppression `a un endroit arbitraire : O(1)

(13)

Arbre de recherche ´ equilibr´ e (ensemble)

set en C++, TreeSet en Java

Les ´el´ements peuvent ^etre parcourus dans l’ordre (ordre naturel, ou ordre d´efini par un comparateur)

Acc`es `a un ´el´ement :O(log(n))

Ajout/suppression d’un ´el´ement arbitraire : O(log(n))

(14)

Mars 2016

Table de hachage (ensemble)

std::tr1::unordered_set en C++ pr´e-2011, std::unordered_set en C++ 2011, HashSet en Java

Les ´el´ements sont parcourus dans un ordre arbitraire (celui de la fonction de hachage)

Acc`es `a un ´el´ement :O(1) amorti

Ajout/suppression d’un ´el´ement arbitraire : O(1) amorti

En Java, il existe aussi LinkedHashSet qui combine table de hachage et liste cha^ın´ee pour acc`es rapide et parcours dans l’ordre o`u les

´

el´ements ont ´et´e ins´er´es

(15)

Arbre de recherche ´ equilibr´ e (tableau associatif )

Pour stocker des paires (clef, valeur) map en C++, TreeMap en Java

Les ´el´ements peuvent ^etre parcourus dans l’ordre de leur clef (ordre naturel, ou ordre d´efini par un comparateur)

Acc`es `a un ´el´ement par sa clef : O(log(n))

Ajout/suppression d’un ´el´ement arbitraire par sa clef : O(log(n))

(16)

Mars 2016

Table de hachage (tableau associatif )

std::tr1::unordered_map en C++ pr´e-2011, std::unordered_map en C++ 2011, HashMap en Java

Les ´el´ements sont parcourus dans un ordre arbitraire (celui de la fonction de hachage)

Acc`es `a un ´el´ement par sa clef : O(1) amorti

Ajout/suppression d’un ´el´ement arbitraire par sa clef : O(1) amorti En Java, il existe aussi LinkedHashMap qui combine table de hachage et liste cha^ın´ee pour acc`es rapide et parcours dans l’ordre o`u les

´

el´ements ont ´et´e ins´er´es

(17)

Plan

G´en´eralit´es

Collections de base

Collections `a usage plus rare

(18)

Mars 2016

Liste simplement cha^ın´ ee

forward_list en C++ 2011, n’existe pas en Java ; facile `a impl´ementer `a la main

Acc`es au premier ´element :O(1) Acc`es `a l’´element suivant :O(1) Acc`es `a un ´el´ement arbitraire :O(n)

Ajout/suppression `a un endroit arbitraire : O(1)

(19)

Pile (Last In First Out)

stack en C++, Stack en Java Acc`es au premier ´element :O(1) Ajout/suppression au d´ebut :O(1)

Acc`es `a un autre ´el´ement ou ajout/suppression `a un autre endroit impossibles

(20)

Mars 2016

File (First In First Out)

queue en C++, n’importe quelle classe impl´ementant l’interface Queue en Java

Acc`es au premier ´el´em´ent :O(1) Suppression du premier ´el´ement :O(1) Ajout `a la fin : O(1)

Acc`es `a un autre ´el´ement ou ajout/suppression `a un autre endroit impossibles

(21)

File de priorit´ e

priority_queue en C++, PriorityQueue en java

Les ´el´ements sont ins´er´es et gard´es tri´es dans la file de priorit´e, par leur ordre naturel ou par un ordre de priorit´e d´efini par un comparateur ; deux ´el´ements peuvent avoir la m^eme priorit´e

Acc`es `a l’´el´ement de plus haute priorit´e : O(1)

Suppression de l’´el´ement de plus haute priorit´e : O(log(n)) Ajout d’un ´el´ement :O(log(n))

Acc`es `a un autre ´el´ement ou suppression `a un autre endroit impossibles Modification dynamique des priorit´es impossible

En C++, impl´ementer un bool operator<(T a) dans la classe T pour fournir la fonction de comparaison des objets de type T

(22)

Mars 2016

Multi-ensembles

multiset (arbre) ou unordered_multiset (table de hachage) en C++ ; n’existe pas en Java

Pareil qu’un set/unordered_set mais plusieurs ´el´ements identiques (ou, en tous cas, se comparant identiquement) peuvent ^etre pr´esents dans l’ensemble

(23)

Tableaux associatifs ` a valeurs multiples

multimap (arbre) ou unordered_multimap (table de hachage) en C++ ; n’existe pas en Java

Pareil qu’un map/unordered_map mais plusieurs ´el´ements identiques (ou, en tous cas, se comparant identiquement) peuvent ^etre pr´esents dans l’ensemble

(24)

Mars 2016

Licence de droits d’usage

Contexte public}avec modifications

Par le t´el´echargement ou la consultation de ce document, l’utilisateur accepte la licence d’utilisation qui y est attach´ee, telle que d´etaill´ee dans les dispositions suivantes, et s’engage `a la respecter int´egralement.

La licence conf`ere `a l’utilisateur un droit d’usage sur le document consult´e ou t´el´echarg´e, totalement ou en partie, dans les conditions d´efinies ci-apr`es et `a l’exclusion expresse de toute utilisation commerciale.

Le droit d’usage d´efini par la licence autorise un usage `a destination de tout public qui comprend : – le droit de reproduire tout ou partie du document sur support informatique ou papier,

– le droit de diffuser tout ou partie du document au public sur support papier ou informatique, y compris par la mise `a la disposition du public sur un eseau num´erique,

– le droit de modifier la forme ou la pr´esentation du document,

– le droit d’int´egrer tout ou partie du document dans un document composite et de le diffuser dans ce nouveau document, `a condition que : – L’auteur soit inform´e.

Les mentions relatives `a la source du document et/ou `a son auteur doivent ^etre conserv´ees dans leur int´egralit´e.

Le droit d’usage d´efini par la licence est personnel et non exclusif.

Tout autre usage que ceux pr´evus par la licence est soumis `a autorisation pr´ealable et expresse de l’auteur :[email protected]

Références

Documents relatifs

a Rappeler l’´ enonc´ e du th´ eor` eme de Lagrange pour les sous-groupes cycliques.. b Montrer l’´ equivalence des assertions suivantes

Comme en outre n est premier avec m, n divise t (lemme de Gauss)... a On a admis le th´ eor` eme des

Le droit d’usage défini par la licence autorise un usage à destination de tout public qui comprend : – le droit de reproduire tout ou partie du document sur support informatique

Le droit d’usage d´ efini par la licence autorise un usage ` a destination de tout public qui comprend : – le droit de reproduire tout ou partie du document sur support informatique

| pour envoyer la sortie standard dans l’entrée d’un autre programme (p. ex., less, grep).. |&amp; pour envoyer les deux sorties dans l’entrée d’un

Recherche d’un ensemble de sous-cha^ınes dans une cha^ıne : Aho–Corasick ou arbre des suffixes (Aho–Corasick indexe les sous-cha^ınes, l’arbre des suffixes indexe la

Ajout/suppression d’un élément arbitraire par sa clef : O(1) amorti En Java, il existe aussi LinkedHashMap qui combine table de hachage et liste chaînée pour accès rapide et

Recherche d’une sous-chaîne de taille non négligeable d’une longue chaîne : Knuth–Morris–Pratt (ou Boyer–Moore, non traité ; KMP est meilleur quand l’alphabet est petit,