PC2 (16 Novembre 2000).

Transcription

PC2 (16 Novembre 2000).
TC Informatique
Points en suspens
PC N° 2
16 Novembre 2000
• Délégués ?
• Accès à la documentation, aux transparents
• Questions ?
François Sillion
http://w3.edu.polytechnique.fr/informatique
PC 2
François Sillion
1
PC 2
François Sillion
2
1
Un programme ultra simple :
Crible d'Eratosthène
public class crible
{
final int max = 100;
boolean EstPremier[]
}
Enveloppe convexe
= new boolean [max];
static void remplit ( int p )
{
int k = 2;
while ( k*p < max ) {
EstPremier[k*p] = false;
k++;
}
}
static void Initialise()
{
for ( int i = 0 ; i < max ; ++i )
EstPremier[i] = true;
}
public static void main ( String[] arg )
{
int i;
Initialise();
for ( i = 2 ; i < max ; ++i )
remplit(i);
for ( i = 1 ; i < max ; ++i )
if ( EstPremier[i] )
writeln(i + "est premier");
}
PC 2
François Sillion
3
PC 2
François Sillion
4
2
Enveloppe convexe
PC 2
François Sillion
Algorithme du cordeau
5
PC 2
François Sillion
6
3
Enveloppe convexe :
Algorithme du cordeau
Algorithme du cordeau
•
Remarques
–
–
La fonction Angle retourne une mesure de l'angle entre P[i]P[j] et l'horizontale.
Pas forcément l'angle lui-même…
Échange de deux éléments du tableau :
static void Echange(int a, int b)
{
Point p = P[a];
P[a] = P[b];
P[b] = p;
}
–
Nouvel objet
class Point
{
double x,y;
}
Point Pt = new Point();
Pt.x = 2.0;
Point[] P = new Point[5];
on verra qu'on peut définir des constructeurs…
PC 2
François Sillion
7
PC 2
François Sillion
8
4
Enveloppe convexe :
Algorithme du cordeau
Notions de complexité
public class cordeau
{
final static int max = 100;
static Point[] P = new Point[max+1];
}
static int wrap ( Point[] P, int max )
{
int min = TrouveOrdonnéeMinimum();
// place une sentinelle
P[max] = P[min];
double angle = 0;
for ( j=0 ; j < max ; ++j )
{
Echange(j,min);
min = max; angle = 360;
for ( int k=j+1; k <= max; ++k )
if ( Angle ( P[j], P[k] ) < angle )
{
min = k; angle = Angle(P[j],P[k]);
}
if ( min == max ) return j;
}
}
}
public static void main ( String[] arg )
{
Initialise();
int Nb = wrap ( P , max );
}
PC 2
François Sillion
9
• Complexité des opérations demandées par
un algorithme en fonction de la taille des
données d'entrée
• Temps ou espace
• Comportement asymptotique
• Cas le pire, comportement en moyenne
• Notations
– O(n), O(n log(n) )…
• Complexité dépendant de la sortie
PC 2
François Sillion
10
5
Complexité de l'algorithme
du cordeau ?
Tris simples
• O(n2) dans le cas le pire (tous les points sur
l'enveloppe convexe)
• O(n p) si p est le nombre de points sur
l'enveloppe
• Peut-on faire mieux ?
• Organisation en modules fonctionnels
• Structures de données
– Objets Java
– Constructeurs
– Classes
• Algorithmes simples
• Complexité
PC 2
François Sillion
11
PC 2
François Sillion
12
6
Tri (avec variables globales)
Tri (avec variables locales)
class Tri {
// Tableau à a trier
static String[] noms;
// Fonctions de tri
static void trier() { ... }
// Fonction d’impression
static void imprimer() { ... }
// Fonction principale
public static void main(String[] args) {
// Initialisation du tableau de noms
noms = new String[3];
noms[0] = "Annie";
noms[1] = "Julie";
noms[2] = "Armand";
class Tri {
static void trier(String[] t)
{ ... }
static void imprimer(String[] t)
{ ... }
public static void main(String[] args) {
String[] noms = new String[] {
"Annie",
"Julie",
"Armand"
};
trier(noms);
imprimer(noms);
trier();
imprimer();
}
}
}
}
PC 2
François Sillion
13
PC 2
François Sillion
14
7
Tri (ligne de commande)
Utilisation d'un objet spécifique
% java Tri Annie Julie Armand
class Eleve {
String nom;
float note;
}
class Tri {
static void trier(Eleve[] eleves) { ... }
static void imprimer(Eleve[] eleves) { ... }
class Tri {
static void trier(String[] t)
{ ... }
static void imprimer(String[] t)
{ ... }
public static void main(String[] args) {
trier(args);
imprimer(args);
}
public static void main(String[] args) {
Eleve[] eleves = new Eleve[3];
eleves[0] = new Eleve();
eleves[0].nom = "Annie"; eleves[0].note = 13.0;
eleves[1] = new Eleve();
eleves[1].nom = "Julie"; eleves[1].note = 7.0;
eleves[2] = new Eleve();
eleves[2].nom = "Armand"; eleves[2].note = 18.0;
trier(eleves);
imprimer(eleves);
}
}
}
PC 2
François Sillion
15
PC 2
François Sillion
16
8
Utilisation d'un constructeur
De quoi a-t-on besoin pour le tri ?
class Eleve {
String nom;
float note;
Eleve(String s, float x) {
nom = s;
note = x;
}
}
class Tri {
static void trier(Eleve[] eleves) { ... }
static void imprimer(Eleve[] eleves) { ... }
public static void main(String[] args) {
Eleve[] eleves = new Eleve[] {
new Eleve("Annie", 13.0),
new Eleve("Julie", 7.0),
new Eleve("Armand", 18.0)
};
trier(eleves);
imprimer(eleves);
}
PC 2
François Sillion
• Comparaison
static boolean meilleur(Eleve e1, Eleve e2)
{
return (e1.note > e2.note);
}
• Echange
static void echanger(Eleve[] eleves, int i1, int i2)
{
Eleve e = eleves[i1];
eleves[i1] = eleves[i2];
eleves[i2] = e;
}
17
PC 2
François Sillion
18
9
Tri par sélection
Tri par insertion
void trier(Eleve[] eleves) {
final int N = eleves.length;
for (int i = 0 ; i < N - 1 ; ++i) {
int m = i;
for (int j = i + 1 ; j < N ; ++j) {
if (meilleur(eleves[m], eleves[j]))
{
m = j;
}
}
echanger(eleves, i, m);
}
}
static void trier(Eleve[] eleves) {
final int N = eleves.length;
for (int i = 1 ; i < N ; ++i) {
Eleve e = eleves[i];
int j = i;
while (j > 0 && meilleur(eleves[j - 1], e) )
{
eleves[j] = eleves[j - 1];
--j;
}
eleves[j] = e;
}
}
• Complexité ?
• Sentinelle (plus mauvais élève)
• Complexité ? Cas le pire, en moyenne ?
PC 2
François Sillion
19
PC 2
François Sillion
20
10
Tri à bulles
Complexité du tri
static void trier(Eleve[] eleves) {
final int N = eleves.length;
for (int i = N - 1 ; i >= 0 ; --i) {
for (int j = 1 ; j <= i ; ++j) {
if (meilleur(eleves[j - 1],
eleves[j])) {
echanger(eleves, j - 1, j);
}
}
}
}
• Comparaisons, échanges
• Borne inférieure en N log N
• Importance pratique de la boucle la plus
interne
(inner loop)
• Cas pire, complexité moyenne
• Exemples
• Complexité ?
PC 2
François Sillion
21
PC 2
François Sillion
22
11
Enveloppe convexe :
Balayage de Graham
Enveloppe convexe :
Balayage de Graham
• Suppose que l'on sache trier le tableau
• Une fois le tri réalisé, parcours linéaire des
sommets (non trivial).
• On considère chaque point dans l'ordre
comme prochain point de l'enveloppe.
PC 2
PC 2
François Sillion
23
François Sillion
24
12
Enveloppe convexe :
Balayage de Graham
Enveloppe convexe :
Balayage de Graham
• Back-tracking: on revient en arrière pour
assurer qu'on ne prend que des virages à
gauche.
PC 2
François Sillion
• Eventuellement on revient de plusieurs
crans en arrière (boucle while)
• Complexité: N log N
25
PC 2
François Sillion
26
13