Commit bff57907 authored by Moïse Destin's avatar Moïse Destin
Browse files

Exo 1

parents 4fee2540 5c2b975a
No preview for this file type
......@@ -8,10 +8,10 @@ sda:test:
- echo "Exercice 1"
- ls -lF AUTHORS.md
- echo "Exercice 2"
- ls -lF plots/fixed_binary_heap_*_increasing.pdf
- ls -lF plots/fixed_binary_heap_*_decreasing.pdf
- ls -lF plots/fixed_binary_heap_*_random.pdf
- ls -lF plots/fixed_binary_heap_extract_*.pdf
- echo "Exercice 3"
- ls -lF plots/dynamic_binary_heap_*.pdf
- echo "Exercice 4"
- ls -lF RAPPORT.md
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Palette2">
<group name="Swing">
<item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
</item>
<item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
</item>
<item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.png" removable="false" auto-create-binding="false" can-attach-label="true">
<default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
</item>
<item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
<initial-values>
<property name="text" value="Button" />
</initial-values>
</item>
<item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="RadioButton" />
</initial-values>
</item>
<item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="CheckBox" />
</initial-values>
</item>
<item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
<initial-values>
<property name="text" value="Label" />
</initial-values>
</item>
<item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
</item>
<item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
</item>
<item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
<preferred-size width="-1" height="20" />
</default-constraints>
</item>
<item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
</item>
<item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
</item>
</group>
</component>
</project>
\ No newline at end of file
......@@ -2,8 +2,14 @@
<project version="4">
<component name="ChangeListManager">
<list default="true" id="298fa7eb-9511-4983-9e33-1e1f5e3f9ebe" name="Changes" comment="">
<change afterPath="$PROJECT_DIR$/Java/TasMainExtraction.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.gitlab-ci.yml" beforeDir="false" afterPath="$PROJECT_DIR$/.gitlab-ci.yml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Java/Tas.java" beforeDir="false" afterPath="$PROJECT_DIR$/Java/Tas.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Java/TasUtilisateur.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/RAPPORT.md" beforeDir="false" afterPath="$PROJECT_DIR$/RAPPORT.md" afterDir="false" />
<change beforePath="$PROJECT_DIR$/README.md" beforeDir="false" afterPath="$PROJECT_DIR$/README.md" afterDir="false" />
<change beforePath="$PROJECT_DIR$/launch_analysis_tas_utilisateur.sh" beforeDir="false" afterPath="$PROJECT_DIR$/launch_analysis_tas_extraction.sh" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
......@@ -41,8 +47,8 @@
</key>
</component>
<component name="RunManager">
<configuration name="TasUtilisateur" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
<option name="MAIN_CLASS_NAME" value="TasUtilisateur" />
<configuration name="TasMainExtraction" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
<option name="MAIN_CLASS_NAME" value="TasMainExtraction" />
<module name="sda" />
<method v="2">
<option name="Make" enabled="true" />
......@@ -50,7 +56,7 @@
</configuration>
<recent_temporary>
<list>
<item itemvalue="Application.TasUtilisateur" />
<item itemvalue="Application.TasMainExtraction" />
</list>
</recent_temporary>
</component>
......@@ -70,6 +76,10 @@
<workItem from="1635251962630" duration="689000" />
<workItem from="1635365695090" duration="598000" />
<workItem from="1635770461992" duration="28196000" />
<workItem from="1636559057255" duration="4105000" />
<workItem from="1637312628002" duration="11337000" />
<workItem from="1637691394538" duration="66000" />
<workItem from="1638457678589" duration="11318000" />
</task>
<servers />
</component>
......
......@@ -8,12 +8,15 @@ public class Tas {
private int nombreEchange = 0;
private int nombreEchangePourSuppression = 0;
/**
* initialiser tas
*/
public Tas(int taille){
positionDansTas = 0;
monTas = new int[ taille+1]; //+0
monTas = new int[taille+1]; // +1 parce que l'utilisateur ne pense pas a l'index 0
}
/**
......@@ -23,14 +26,16 @@ public class Tas {
return positionDansTas == monTas.length;
}
private int parent(int pos) { return pos / 2; }
private int parent(int pos) { return (pos-1) / 2; } // en index 2 dans un taille 3, 2-1/2
private void echanger(int tas_courant_position, int tas_parent_position)
private boolean isParentExist(int pos) { return parent(pos) >= 0; } // l'index 0 nous donnera un element entier negatif
private void echanger(int position_1, int position_2)
{
int tmp = monTas[tas_courant_position];
int tmp = monTas[position_1];
monTas[tas_courant_position] = monTas[tas_parent_position];
monTas[tas_parent_position] = tmp;
monTas[position_1] = monTas[position_2];
monTas[position_2] = tmp;
this.nombreEchange++;
}
......@@ -40,8 +45,8 @@ public class Tas {
* dependemment du chiffre on peut remonter jusqu au root
*/
public void insererElement(int x){
if(isTasPlein())
throw new UnsupportedOperationException("le tas est plein, il n'y a plus de place pour inserer de nouveau element");
// if(isTasPlein())
// throw new UnsupportedOperationException("le tas est plein, il n'y a plus de place pour inserer de nouveau element");
int position_courant = positionDansTas;
......@@ -50,11 +55,15 @@ public class Tas {
positionDansTas++;
while (monTas[position_courant] < monTas[parent(position_courant)]) {
entasserDeBasEnHaut(position_courant);
}
private void entasserDeBasEnHaut(int position_courant) {
while (isParentExist(position_courant) && monTas[position_courant] < monTas[parent(position_courant)]) {
echanger(position_courant, parent(position_courant));
position_courant = parent(position_courant);
}
}
/**
......@@ -64,11 +73,67 @@ public class Tas {
public void afficherTas()
{
System.out.print("Tas = ");
for (int i = 0; i < positionDansTas; i++)
System.out.print(monTas[i] +" ");
// for (int i = 0; i < positionDansTas; i++)
// System.out.print(monTas[i] +" ");
for (int i = 0; i < (positionDansTas / 2); i++) {
System.out.print("Parent : " + monTas[i]);
if (enfantGauche(i) < positionDansTas)
System.out.print(" Left : " + monTas[enfantGauche(i)]);
if (enfantDroite(i) < positionDansTas)
System.out.print(" Right :" + monTas[enfantDroite(i)]);
System.out.println();
}
System.out.println();
}
// retourne la cle de plus petite valeur
public int supprimerValeurMinimale(){
if(this.positionDansTas == 0)
throw new UnsupportedOperationException("le tas vide !");
int elementSupprimer = monTas[0];
monTas[0] = monTas[positionDansTas-1];
positionDansTas--;
parcourirTasDeHautEnBas(0);
return elementSupprimer;
}
public void parcourirTasDeHautEnBas(int position){
while (isEnfantGaucheExist(position)){
int plusPetitEnfantIndex = enfantGauche(position); // on l'initiallise avec l'enfant du gauche, plus tard, on verifiera si droite est plus petit
if(isEnfantDroiteExist(position) && monTas[enfantDroite(position)] < monTas[enfantGauche(position)])
plusPetitEnfantIndex = enfantDroite(position); // c'est l'enfant du droite le plus petit, du coup apres un enchange, on aura plus a s'inquiter de la gauche
if(monTas[position] > monTas[plusPetitEnfantIndex]){
echanger(position, plusPetitEnfantIndex);
this.nombreEchangePourSuppression++;
}
position = plusPetitEnfantIndex;
}
}
public int enfantGauche(int position){
return (2 * position)+1;
}
public boolean isEnfantGaucheExist(int position){
return enfantGauche(position) < positionDansTas;
}
public int enfantDroite(int position){
return (2 * position) + 2;
}
public boolean isEnfantDroiteExist(int position){
return enfantDroite(position) < positionDansTas;
}
public int getNombreEchange() {
return nombreEchange;
}
......@@ -80,4 +145,8 @@ public class Tas {
public int getNombreDelementStocker() {
return positionDansTas;
}
public int getNombreEchangePourSuppression() {
return nombreEchangePourSuppression;
}
}
import java.util.Scanner;
public class TasMainExtraction {
public static void main(String[] args) {
// notre tas
Tas tas;
// int taille_du_tableau;
//
// Scanner entreUtilisateur = new Scanner(System.in);
// System.out.print("Entrer la taille du tableau: ");
//
// taille_du_tableau = entreUtilisateur.nextInt();
//
// tas = new Tas(taille_du_tableau);
// demandeInsertionElement();
//
//
// while(entreUtilisateur.hasNext())
// {
// tas.insererElement(entreUtilisateur.nextInt());
// tas.afficherTas();
// System.out.println("\nNombre d'echange effectue: "+tas.getNombreEchange());
// demandeInsertionElement();
// }
tas = new Tas(10);
// croissanr
for(int i = 1; i<=10; i++){
tas.insererElement(i);
}
// decroissanr
// for(int i = 10; i>=1; i--){
// tas.insererElement(i);
// }
tas.supprimerValeurMinimale();
tas.afficherTas();
System.out.println("Nbre d'echange : "+tas.getNombreEchangePourSuppression());
}
private static void demandeInsertionElement() {
System.out.println("\nEntrer les clés du tableau(entier): ");
}
}
import java.util.Scanner;
public class TasUtilisateur {
public static void main(String[] args) {
// notre tas
Tas tas;
int taille_du_tableau;
Scanner entreUtilisateur = new Scanner(System.in);
System.out.print("Entrer la taille du tableau: ");
taille_du_tableau = entreUtilisateur.nextInt();
tas = new Tas(taille_du_tableau);
demandeInsertionElement();
while(entreUtilisateur.hasNext())
{
tas.insererElement(entreUtilisateur.nextInt());
tas.afficherTas();
System.out.println("\nNombre d'echange effectue: "+tas.getNombreEchange());
demandeInsertionElement();
}
}
private static void demandeInsertionElement() {
System.out.println("\nEntrer les clés du tableau(entier): ");
}
}
Puisqu'on a alloué la quantité de mémoire dès le départ,
on voit sur la courbe de nos trois cas (croissant, décroissant, aléatoire)
que la quantité de mémoire gaspillée est la meme et décroît après chaque insertion,
ce qui est logique. Tant qu'on approche de la capacite maximale du tableau tand qu'on aura moins de memoire gaspillee.
avec un tableau de 10 elements où les éléments sont insérés dans l'ordre croissant, on effectue trois echanges
le nombre de swaps effectués quand on incrémente est nul car une strice croissance d'insertion des elements respectera sans aucun doute la règle d'ordre de notre tas,pour le graphe decroissant et aleatoire, on remarque qu il y a beaucoup de changement au fil du temps qu'on ajoute les cles
avec un tableau de 10 elements où les éléments sont insérés dans l'ordre decroissant, on effectue trois echanges
Que se passe t-il lorsque l'on ajoute des opérations de suppression? En temps? En mémoire?
En ce qui concerne le temps amorti, on constate tres bien sur notre coubre que le temps est faible dans le cas de la croissance car on a vus precedemment quand on insere dans l'ordre croissant, on ne fait pas beaucoup de changement donc, la courbe de l'increasing prend moins de temps que les autres.
La complexité amortie des opérations d’ajout et de suppression/extraction a t-elle changé sur les expériences
utilisant un tableau dynamique ? Pourquoi ?
# Sujet de TP 3: Tas Binaire
# Sujet de TP 4: Tas Binaire, suite
## Règles pour ce semestre
......@@ -15,50 +15,62 @@ rendre le TP si vous ne finissez pas à temps) via gitlab.
Vos travaux seront évalués une fois à mi-semestre et une fois à la fin du semestre.
## Exercice 1: Tas binaire borné
## Exercice 1: Tas binaire avec extraction
Le nom de votre branche est constitué de vos numéros d'étudiants séparés par un _
`git checkout -b tp3_NUMERO1_NUMERO2`
### Pour conserver les données du tp3 et récupérer le tp4
Placez vous dans votre branche du tp3.
`git checkout tp3_NUMERO1_NUMERO2`
Créez la branche du tp4 à partir de celle du tp3.
Rajouter le fichier `AUTHORS.md` avec vos noms, prénoms et numéros d'étudiants.
`git checkout -b tp4_NUMERO1_NUMERO2`
<<<<<<< HEAD
Développez une structure/classe de tas binaire dans laquelle le tableau servant
à stocker les clés est de taille fixe. Cette taille est fixée à la création du tas. Si
l’utilisateur tente d’ajouter une valeur dans un tas plein, un programme en C
affichera une erreur et un programme en C++, Python ou Java jettera une exception. La
structure de tas ne permettra pour l'instant que d’ajouter des clés.
Pour chaque opération, on veut pouvoir récupérer le nombre d'échanges que la fonction a effectué.
=======
Fusionnez cette nouvelle branche avec le tp4
`git merge -Xtheirs tp4`
Modifier la strcture de tas pour pouvoir extraire la clé de plus petite valeur.
On voudra connaître le nombre d'échanges effectués par cette opération.
## Exercice 2: Benchmark
Effectuez des expériences sur l’efficacité en temps et en mémoire de cette structure :
- dans le cas où l’on ne fait qu’ajouter des clés dans l’ordre croissant,
- dans le cas où l’on ne fait qu’ajouter des clés dans l’ordre décroissant,
- dans le cas où l’on ne fait qu’ajouter des clés aléatoires.
- dans le cas où l'on ajoute une valeur aléatoire avec un probabilité `p` et on extrait
la clé de valeur minimale avec probabilité `1-p`.
Les noms des fichiers pdf seront de la forme `fixed_binary_heap_extract_MESURE_LANGAGE.pdf`
Inspirez vous des expériences menées sur les tableaux dynamiques. Attention, pour
chaque expérience, vous devez impérativement écrire de nouvelles fonctions `main`
dans de nouveaux fichiers et sauvegarder les différents fichiers `pdf` que vous ob-
tenez grâce à vous expériences.
## Exercice 3: Tas binaire dynamique
Les noms des fichiers pdf seront de la forme `fixed_binary_heap_MESURE_LANGAGE_ORDRE.pdf`
Modifier la structure de tas binaire en remplacant le tableau de taille fixe par un tableau dynamique.
### Exemple:
Relancer toutes les expériences faites sur les tas binaires de taille fixe sur les tas binaires dynamiques.
Pour la mesure du temps amorti de l'ajout d'un élément dans l'ordre croissant en `C`,
le fichier de sortie sera `fixed_binary_heap_amortized_time_C_INCREASING.pdf`
Vous devez impérativement créer un programme distinct pour chaque expérience.
On a donc:
- MESURE peut valoir \{ amortized_time, wasted_memory, swap \}.
- LANGAGE peut valoir \{ C, CPP, Java, Python\}
- ORDRE peut valoir \{ increasing, descrasing, random\}
Le nom des fichiers `pdf` commencera par `dynamic_binary_heap_*`
## Exercice 3:
## Exercice 4:
Commentez le resultat de vos expériences dans un fichier `RAPPORT.md`
- Que se passe t-il lorsque l'on ajoute des opérations de suppression? En temps? En mémoire?
- La complexité amortie des opérations d’ajout et de suppression/extraction a t-elle changé sur les expériences
utilisant un tableau dynamique ? Pourquoi ?
A RENDRE AVANT DIMANCHE!
\ No newline at end of file
......@@ -11,7 +11,7 @@ cd Java
javac *
echo "${RED} Exécution des benchmarks en Java ${NC}"
java TasUtilisateur
java TasMainExtraction
echo "${RED} Nettoyage ${NC}"
rm *.class
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment