diff options
-rw-r--r-- | config.h.in | 189 | ||||
-rw-r--r-- | doc/Makefile.am | 11 | ||||
-rw-r--r-- | doc/README.en | 0 | ||||
-rw-r--r-- | doc/README.fr | 0 | ||||
-rw-r--r-- | doc/algo.tex | 89 | ||||
-rw-r--r-- | doc/algorithmes.tex | 57 | ||||
-rw-r--r-- | doc/bib.tex | 7 | ||||
-rw-r--r-- | doc/conclusion.tex | 9 | ||||
-rw-r--r-- | doc/description.tex | 19 | ||||
-rw-r--r-- | doc/intro.tex | 11 | ||||
-rw-r--r-- | doc/manuel.tex | 124 | ||||
-rw-r--r-- | doc/outils.tex | 21 | ||||
-rw-r--r-- | doc/structures.tex | 64 | ||||
-rw-r--r-- | doc/temps.tex | 26 | ||||
-rw-r--r-- | lib/BHeap.cc | 2 | ||||
-rw-r--r-- | po/PriorityLists.pot | 2 | ||||
-rw-r--r-- | po/de.po | 6 | ||||
-rw-r--r-- | po/fr.po | 6 |
18 files changed, 534 insertions, 109 deletions
diff --git a/config.h.in b/config.h.in index 40247eb..ba885e2 100644 --- a/config.h.in +++ b/config.h.in @@ -1,5 +1,51 @@ /* config.h.in. Generated automatically from configure.in by autoheader. */ -#undef HAVE_LIBINTL_H + +/* Define if using alloca.c. */ +#undef C_ALLOCA + +/* Define to empty if the keyword does not work. */ +#undef const + +/* Define to one of _getb67, GETB67, getb67 for Cray-2 and Cray-YMP systems. + This function is required for alloca.c support on those systems. */ +#undef CRAY_STACKSEG_END + +/* Define if you have alloca, as a function or macro. */ +#undef HAVE_ALLOCA + +/* Define if you have <alloca.h> and it should be used (not on Ultrix). */ +#undef HAVE_ALLOCA_H + +/* Define if you have a working `mmap' system call. */ +#undef HAVE_MMAP + +/* Define as __inline if that's what the C compiler calls it. */ +#undef inline + +/* Define to `long' if <sys/types.h> doesn't define. */ +#undef off_t + +/* Define if you need to in order for stat and other things to work. */ +#undef _POSIX_SOURCE + +/* Define to `unsigned' if <sys/types.h> doesn't define. */ +#undef size_t + +/* If using the C implementation of alloca, define if you know the + direction of stack growth for your system; otherwise it will be + automatically deduced at run-time. + STACK_DIRECTION > 0 => grows toward higher addresses + STACK_DIRECTION < 0 => grows toward lower addresses + STACK_DIRECTION = 0 => direction of growth unknown + */ +#undef STACK_DIRECTION + +/* Define if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Define if your processor stores words with the most significant + byte first (like Motorola and SPARC, unlike Intel and VAX). */ +#undef WORDS_BIGENDIAN /* Define to 1 if NLS is requested. */ #undef ENABLE_NLS @@ -30,150 +76,93 @@ #endif #define N_(Text) Text - -/* Define if you need to in order for stat and other things to work. */ -#undef _POSIX_SOURCE - -/* Define if using `alloca.c'. */ -#undef C_ALLOCA - -/* Define to empty if `const' does not conform to ANSI C. */ -#undef const - -/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP - systems. This function is required for `alloca.c' support on those systems. - */ -#undef CRAY_STACKSEG_END - -/* Define if you have the `__argz_count' function. */ +/* Define if you have the __argz_count function. */ #undef HAVE___ARGZ_COUNT -/* Define if you have the `__argz_next' function. */ +/* Define if you have the __argz_next function. */ #undef HAVE___ARGZ_NEXT -/* Define if you have the `__argz_stringify' function. */ +/* Define if you have the __argz_stringify function. */ #undef HAVE___ARGZ_STRINGIFY -/* Define if you have `alloca', as a function or macro. */ -#undef HAVE_ALLOCA - -/* Define if you have <alloca.h> and it should be used (not on Ultrix). */ -#undef HAVE_ALLOCA_H - -/* Define if you have the <argz.h> header file. */ -#undef HAVE_ARGZ_H - -/* Define if you have the `dcgettext' function. */ +/* Define if you have the dcgettext function. */ #undef HAVE_DCGETTEXT -/* Define if you have the <fcntl.h> header file. */ -#undef HAVE_FCNTL_H - -/* Define if you have the `getcwd' function. */ +/* Define if you have the getcwd function. */ #undef HAVE_GETCWD -/* Define if you have the `getpagesize' function. */ +/* Define if you have the getpagesize function. */ #undef HAVE_GETPAGESIZE -/* Define if you have the `getwd' function. */ +/* Define if you have the getwd function. */ #undef HAVE_GETWD -/* Define if you have the `i' library (-li). */ -#undef HAVE_LIBI - -/* Define if you have the `intl' library (-lintl). */ -#undef HAVE_LIBINTL - -/* Define if you have the <libintl.h> header file. */ -#undef HAVE_LIBINTL_H - -/* Define if you have the <limits.h> header file. */ -#undef HAVE_LIMITS_H - -/* Define if you have the <locale.h> header file. */ -#undef HAVE_LOCALE_H - -/* Define if you have the <malloc.h> header file. */ -#undef HAVE_MALLOC_H - -/* Define if you have a working `mmap' system call. */ -#undef HAVE_MMAP - -/* Define if you have the `munmap' function. */ +/* Define if you have the munmap function. */ #undef HAVE_MUNMAP -/* Define if you have the <nl_types.h> header file. */ -#undef HAVE_NL_TYPES_H - -/* Define if you have the `putenv' function. */ +/* Define if you have the putenv function. */ #undef HAVE_PUTENV -/* Define if you have the `setenv' function. */ +/* Define if you have the setenv function. */ #undef HAVE_SETENV -/* Define if you have the `setlocale' function. */ +/* Define if you have the setlocale function. */ #undef HAVE_SETLOCALE -/* Define if you have the <stdlib.h> header file. */ -#undef HAVE_STDLIB_H - -/* Define if you have the `stpcpy' function. */ +/* Define if you have the stpcpy function. */ #undef HAVE_STPCPY -/* Define if you have the `strcasecmp' function. */ +/* Define if you have the strcasecmp function. */ #undef HAVE_STRCASECMP -/* Define if you have the `strchr' function. */ +/* Define if you have the strchr function. */ #undef HAVE_STRCHR -/* Define if you have the `strdup' function. */ +/* Define if you have the strdup function. */ #undef HAVE_STRDUP -/* Define if you have the <string.h> header file. */ +/* Define if you have the <argz.h> header file. */ +#undef HAVE_ARGZ_H + +/* Define if you have the <fcntl.h> header file. */ +#undef HAVE_FCNTL_H + +/* Define if you have the <libintl.h> header file. */ +#undef HAVE_LIBINTL_H + +/* Define if you have the <limits.h> header file. */ +#undef HAVE_LIMITS_H + +/* Define if you have the <locale.h> header file. */ +#undef HAVE_LOCALE_H + +/* Define if you have the <malloc.h> header file. */ +#undef HAVE_MALLOC_H + +/* Define if you have the <nl_types.h> header file. */ +#undef HAVE_NL_TYPES_H + +/* Define if you have the <string.h> header file. */ #undef HAVE_STRING_H -/* Define if you have the <strings.h> header file. */ +/* Define if you have the <strings.h> header file. */ #undef HAVE_STRINGS_H -/* Define if you have the <sys/param.h> header file. */ +/* Define if you have the <sys/param.h> header file. */ #undef HAVE_SYS_PARAM_H -/* Define if you have the <sys/stat.h> header file. */ -#undef HAVE_SYS_STAT_H - -/* Define if you have the <unistd.h> header file. */ +/* Define if you have the <unistd.h> header file. */ #undef HAVE_UNISTD_H -/* Define as `__inline' if that's what the C compiler calls it, or to nothing - if it is not supported. */ -#undef inline - -/* Define to `long' if <sys/types.h> does not define. */ -#undef off_t +/* Define if you have the i library (-li). */ +#undef HAVE_LIBI /* Name of package */ #undef PACKAGE -/* Define to `unsigned' if <sys/types.h> does not define. */ -#undef size_t - -/* If using the C implementation of alloca, define if you know the - direction of stack growth for your system; otherwise it will be - automatically deduced at run-time. - STACK_DIRECTION > 0 => grows toward higher addresses - STACK_DIRECTION < 0 => grows toward lower addresses - STACK_DIRECTION = 0 => direction of growth unknown */ -#undef STACK_DIRECTION - -/* Define if you have the ANSI C header files. */ -#undef STDC_HEADERS - /* Version number of package */ #undef VERSION /* define if compiled symbols have a leading underscore */ #undef WITH_SYMBOL_UNDERSCORE -/* Define if your processor stores words with the most significant byte first - (like Motorola and SPARC, unlike Intel and VAX). */ -#undef WORDS_BIGENDIAN diff --git a/doc/Makefile.am b/doc/Makefile.am index ee5aba4..d27abf6 100644 --- a/doc/Makefile.am +++ b/doc/Makefile.am @@ -1 +1,10 @@ -EXTRA_DIST = README.fr README.en +ps: + make -f Makefile.doc ps + +clean: + make -f Makefile.doc clean + +distclean: + make -f Makefile.doc clean + +EXTRA_DIST = algo.tex algorithmes.tex bib.tex conclusion.tex description.tex intro.tex manuel.tex outils.tex structures.tex temps.tex diff --git a/doc/README.en b/doc/README.en deleted file mode 100644 index e69de29..0000000 --- a/doc/README.en +++ /dev/null diff --git a/doc/README.fr b/doc/README.fr deleted file mode 100644 index e69de29..0000000 --- a/doc/README.fr +++ /dev/null diff --git a/doc/algo.tex b/doc/algo.tex new file mode 100644 index 0000000..c1c164e --- /dev/null +++ b/doc/algo.tex @@ -0,0 +1,89 @@ +%initialisations---------------------------------------------------------------- +\documentclass[french,11pt,a4paper,twoside,openright]{report} +\usepackage[T1]{fontenc} +\usepackage[latin1]{inputenc} +\usepackage[francais]{babel} +\usepackage{a4} +\usepackage{ulem} +\usepackage{multirow} +\usepackage[dvips]{graphics} +\usepackage{vmargin} +\usepackage{fancyhdr} +\usepackage{oldstyle} +\usepackage{listings} +\usepackage{verbatim} +%fin des initialisations-------------------------------------------------------- + +\pagestyle{fancyplain} +\addtolength{\headwidth}{\marginparsep} +\addtolength{\headwidth}{\marginparwidth} +% titre de chapitre +\renewcommand{\chaptermark}[1]{\markboth{#1} {}} +% titre de section +\renewcommand{\sectionmark}[1]{\markright{\thesection\ #1}} + +\lhead[\fancyplain{}{\bfseries\textos{\thepage}}]{\fancyplain{}{\bfseries\rightmark}} +\rhead[\fancyplain{}{\bfseries\leftmark}]{\fancyplain{}{\bfseries\textos{\thepage}}} +\cfoot{\fancyplain{\textos{\thepage}}{}} + +\newcommand{\clearemptydoublepage}{\newpage{\pagestyle{empty}\cleardoublepage}} + +\def\addcontentsline#1#2#3{% + \addtocontents{#1}{\protect\contentsline{#2}{#3}{\textos{\thepage}}}} +% \setmargrb{leftmargin}{topmargin}{rightmargin}{bottommargin} +\setmargrb{1.5cm}{2cm}{1.5cm}{4cm} + +\begin{document} +\renewcommand{\chaptername}{Section} +\newcommand{\bracebits}{$\underbrace{\hspace{2cm}}$} + +%page de garde +\title{Projet d'Algorithmique\\ + Rapport \vspace{1.0cm}} +\author{Barrère Jordi, Noble Nicolas\vspace{2.0cm}} +\date{\textit{dernière révision: \today}} +\maketitle +\strut\thispagestyle{empty} +\vfill +\pagebreak +\setcounter{page}{1} + + + +\tableofcontents + +\clearemptydoublepage + +\input{intro} +\clearemptydoublepage +\part{Analyse} +\input{description} +\clearemptydoublepage +\input{structures} +\clearemptydoublepage +\input{algorithmes} +\clearemptydoublepage +\input{temps} +\clearemptydoublepage +\part{Synthèse} +\input{manuel} +\clearemptydoublepage +\input{outils} +\clearemptydoublepage + +\chapter{Code source} +\lstset{language=C++,basicstyle=\scriptsize,stringspaces=false} +\input{source} + +\clearemptydoublepage +\input{conclusion} +\clearemptydoublepage +\input{bib} +\clearpage +\strut\thispagestyle{plain} +\begin{tiny} +\begin{center} +Cette documentation a été réalisée sous Linux Slackware 7.1 à l'aide de \LaTeX\ et cvs. +\end{center} +\end{tiny} +\end{document} diff --git a/doc/algorithmes.tex b/doc/algorithmes.tex new file mode 100644 index 0000000..d4c43c5 --- /dev/null +++ b/doc/algorithmes.tex @@ -0,0 +1,57 @@ +\chapter{Algorithmes} +\section{Tas Binomial} +\paragraph{} +L'implémentation de certaines parties des algorithmes sur les tas binomiaux ont nécessité quelques changements, notemment +en ce qui concerne la gestion des cellules. En effet, il se pose un grave problème lors de l'implémentation de "DIMINUER-CLÉ", +car nous effectuons des changements dans les cellules. Et si l'appelant a gardé des pointeurs sur les cellules elles-mêmes, alors +leur contenu ne correspondra plus à la valeur d'insertion. Il faudrait pouvoir modifier aussi les pointeurs sur les cellules +qui ont été renvoyés à l'appelant, ce qui est impossible, vu que ces variables ne font pas partie de l'espace de données de notre +structure. +\paragraph{} +Pour résoudre ce problème, nous avons une table de pointeurs "tampon" qui vont stoquer les vrais pointeurs sur +les cellules du tas binomial. Comme ces pointeurs sont conservés dans la structure +de données, nous pouvons les modifier à loisir, lors d'une opération diminuer clef. Ainsi les pointeurs renvoyés à l'appelant +ne sont pas les pointeurs sur le tas directement, mais des pointeurs sur cette structure tampon, qui joue le role d'intermédiaire. +\paragraph{} +Cette structure est une liste doublement chaînée non triée (afin de pouvoir libérer la mémoire correctement +à la fin du programme), et vu que les deux seules opérations que nous effectuons dessus sont "INSERER" et "SUPPRIMER", nous ne +faisons que des opérations en $O(1)$ ce qui n'aura aucune influence sur le déroulement des algorithmes eux-mêmes. +\paragraph{} +L'implémentation de l'algorithme "FUSIONNER-TAS-BINOMIAUX" a été réalisé différemment de l'idée du cormen. En effet, le livre +suggérait de créer un troisième tas, et d'y placer les éléments de T1 et de T2 pour effacer T1 et T2 ensuite. Nous nous contentons +d'effectuer une fusion "sur place". C'est à dire nous vidons le tas T2 et nous insérons ses éléments à la bonne place dans le tas +T1. Ceci a pour but d'éviter la copie des cellules, pour la même raison que ci-dessus. Autant limiter les opérations et nous +contenter d'utiliser les blocs mémoires déjà alloués. +\paragraph{} +L'implémentation de l'algorithme "UNION" ne diffère que très légèrement de l'algorithme proposé, et nous obtenons un algorithme +légèrement plus simple. En effet, dans l'algorithme proposé, nous avons un cas particulier dans le cas où nos pointeurs se +trouvent en début de liste. Nous résolvons le problème directement car notre structure de données est récursive et le tas est +aussi une cellule de tas binomial. Ainsi, physiquement, nous ne commençons pas à la première, mais à la deuxième cellule du tas. +Le problème du cas particulier est donc réglé. +\section{Tas de Fibonacci} +\paragraph{} +Le tas de Fibonacci, quique d'allure complexe, n'a pas posé de problèmes d'implémentations particuliers. La seule particularité +fut d'implémenter certaines des phrases "en français dans le texte" telles que "parcourir la liste des pointeurs de base". Nous avons +aussi inversé en général l'ordre des choses lors de l'implémentation, ceci afin d'eviter de complexifier le code C++. En effet, +deux opérations consécutives peuvent influencer l'une sur l'autre, et mener à des situations de programmation délicates. Les +inverser peut présenter un aventage d'un point de vue conception, et n'influencer en rien le déroulement de l'algorithme. Le code +source des tas de Fibonacci est commenté de manière à pouvoir suivre les changements effectués lors de l'implémentation. +\paragraph{} +La seule restriction que nous avons posé fut sur l'algorithme "CONSOLIDER" pour lequel le tableau A possède une taille fixe. +En effet, nous ne pouvons évaluer à l'avance le nombre de case dont nous aurons besoin, sachant que certaines branches du +tas peuvent être dégénérées. +\section{Liste chaînée triée} +\paragraph{} +Cette implémentation n'a posé aucun problèmes particuliers, la structure étant extrèmement simple. La seule particularité qu'il +peut être amusant de souligner, est que l'algorithme "UNION" est en fait la partie "FUSION" de l'algorithme de tri fusion. +\section{Tas Binaire} +\paragraph{} +Comme pour le tas binomial, les cellules pouvant être échangées, nous ne pouvons renvoyer directement de pointeur sur le +tableau lui-même. De ce fait, nous avons utilisé exactement la même structure "tampon" que pour le tas binomial. +\paragraph{} +Le tableau dans lequel nous stoquons les valeurs n'est en aucun cas limité en revanche. Nous avons inclus un mécanisme qui +va redimentionner le tableau automatiquement en fonction des indices demandés, ce qui nous permet d'effectuer des tests +comme si la structure avait une dimension infinie. +\paragraph{} +Le reste de l'implémentation n'a posé aucun problème. Il est à noter en revanche qu'il a fallu inverser les conditions par rapport +à ce qui est décrit dans le livre. En effet, le tas binaire du livre nous donne une structure permettant d'effectuer "EXTRAIRE-MAX". diff --git a/doc/bib.tex b/doc/bib.tex new file mode 100644 index 0000000..1203fbb --- /dev/null +++ b/doc/bib.tex @@ -0,0 +1,7 @@ +\begin{thebibliography}{WWW99} +% pour citer le Tanenbaum : \cite{Tanenbaum} +% pour citer le Tanenbaum page 238 : \cite[page 238]{Tanenbaum} + +\bibitem[COR]{Cormen} T. Cormen, C. Leiserson, R. Rivest \textit{Introduction à l'algorithmique}, Dunod. + +\end{thebibliography} diff --git a/doc/conclusion.tex b/doc/conclusion.tex new file mode 100644 index 0000000..e5d9edf --- /dev/null +++ b/doc/conclusion.tex @@ -0,0 +1,9 @@ +\chapter*{Conclusion} +\addcontentsline{toc}{chapter}{Conclusion} +\markboth{CONCLUSION}{CONCLUSION} + +Ce projet a été mené à terme, et l'ensemble des conditions du sujet ont été respectées. +L'effort de recherche mené sur la manière d'implémenter les algorithmes en C++ a +sans aucun doute été profitable pour notre connaissance personnelle. De plus, les algorithmes +implémentés sont "durables": ils peuvent nous resservir dans n'importe quel autre projet nécessitant +des structures de files de priorités, ce qui porte un intérêt quant au développement de ce projet. diff --git a/doc/description.tex b/doc/description.tex new file mode 100644 index 0000000..e86c698 --- /dev/null +++ b/doc/description.tex @@ -0,0 +1,19 @@ +\chapter{Description} +\paragraph{} +Nous allons décrire dans cette première partie tous ce que nous avons effectué comme travail de réflexion afin de +programme ce projet. Il y a beaucoup de détails relatifs à l'implémentation dont nous ne parlerons pas, comme les structures +sur les listes chaînées, ou l'initialisation du terminal pour gérer le menu du programme de test. En revanche, nous appuyerons +sur les détails d'implémentation purement algorithmiques qui nous ont posé problème. +\paragraph{} +En ce qui concerne le langage de programmation, nous avons choisi le C++, car c'est le langage qui nous semblait le plus +adapté pour créer les structures de données nécessaire à la programmation de ce projet. +\paragraph{} +Nous avons implémenté les algorithmes de files de priorités suivants: +\begin{itemize} +\item Tas Binaire +\item Tas Binomial +\item Tas de Fibonacci +\item Liste chaînée triée +\end{itemize} +\paragraph{} +L'algorithme utilisant les files de priorité implémenté est l'algorithme de compression de dictionnaire Huffman. diff --git a/doc/intro.tex b/doc/intro.tex new file mode 100644 index 0000000..46d0e3c --- /dev/null +++ b/doc/intro.tex @@ -0,0 +1,11 @@ +\chapter*{Introduction} +\addcontentsline{toc}{chapter}{Introduction} +\markboth{INTRODUCTION}{INTRODUCTION} + +\paragraph{} +Ce projet a pour but d'une part l'implémentation d'algorithmes de files de priorités et l'implémentation d'un algorithme +utilisant ces files de priorités d'autre part. + +\paragraph{} +Ce présent document va tenter de décrire en totalité la progression de la +mise en forme de ce projet. Nous vous souhaitons bonne lecture. diff --git a/doc/manuel.tex b/doc/manuel.tex new file mode 100644 index 0000000..fcdc3af --- /dev/null +++ b/doc/manuel.tex @@ -0,0 +1,124 @@ +\chapter{Manuel d'utilisation} +\paragraph{} +Ce projet génère deux binaire. Le premier appelé testTas n'est qu'une petite application nous permettant d'utiliser l'API +C++ générée par notre classe de file de priorités. Voici un exemple d'exécution: +\begin{verbatim} +Priority list type: 0 - Binary Heap +Choice: Please select an action +a - Add a key into the priority list +c - Change priority list type +d - Delete a Key from the priority list +e - Extract Min onto the priority list +l - Lower Key onto a key of the priority list +p - Print the current priority list on the screen +r - Remove the whole priority list +t - Test the priority list algorithms +q - Quit +\end{verbatim} + +A partir de cet instant, le programme nous propose un menu nous permettant d'effectuer plusieurs actions sur le tas. La +fonction 'a' permet d'ajouter une clef dans le tas en cours. Comme il est impossible d'effectuer une recherche sur un tas +pour y retrouver le pointeur d'un élément, le programme nous propose de sauvegarder le pointeur résultat dans un tableau: + +\begin{verbatim} +Choice: Please select a slot to save the cell +0 - Empty slot +1 - Empty slot +2 - Empty slot +3 - Empty slot +4 - Empty slot +5 - Empty slot +6 - Empty slot +7 - Empty slot +8 - Empty slot +9 - Empty slot +n - Don't store +c - Cancel +\end{verbatim} + +Ce tableau apparaitra régulièrement dans toutes les fonctions du menu afin de choisir une cellule sur laquelle agir. Toutes +les fonctions du menu parlent d'elles mêmes. La fonction 't' va lancer une batterie de tests sur les algorithmes de la +file de priorité sélectionnée. + +\paragraph{} +Le deuxième binaire généré est 'Huffman'. Il sert à utiliser l'algorithme d'huffman implémenté. Voici sa ligne d'aide: +\begin{verbatim} +$ ./Huffman -h +Huffman [{-f|-i} file] {type} +Huffman -h +This will encode the input file with the Huffman code +using the priority list defined by type. +Type is a number taken from this list: + 0 : Binary Heap (default) + 1 : Binomial Heap + 2 : Fibonacci Heap + 3 : Sorted chained list +-f file means that you specify a dictionnary file which is + structured as described into the README file. +-i file means that you specify a file to encode. It will + built a quiet dumb dictionnary. +By default, a dictionnary will be built from stdin. +-h prints this help and exit. +\end{verbatim} + +La structure d'un dictionnaire est la suivante: +\begin{verbatim} +Mot1 : Fréquence1 +Mot2 : Fréquence2 +... +\end{verbatim} + +Chaque mot est une chaîne de caractères servant à identifier la fréquence associée. Voici un exemple complet de dictionnaire +et d'utilisation du programme avec ce dictionnaire: + +\begin{verbatim} +Pixel@the-babel-tower:~/Projets_LI/Semestre1/Projet-Algo/src$ cat dict.sample +MOT1 : 2000 +MOT2 : 1234 +MOT3 : 15987 +MOT4 : 1203 +MOT5 : 192837 +MOT6 : 12987 +Pixel@the-babel-tower:~/Projets_LI/Semestre1/Projet-Algo/src$ ./Huffman -f dict.sample +MOT3 (15987) = 00 +MOT1 (2000) = 0100 +MOT4 (1203) = 01010 +MOT2 (1234) = 01011 +MOT6 (12987) = 011 +MOT5 (192837) = 1 +Bitstream length : 283957 bits (= 35495 bytes) +Real size input : 7239936 bits (= 904992 bytes) +Size squeezed by : 96.0779 percents +Dictionnary size : 336 bits (= 42 bytes) +Total bitstream length : 284293 bits (= 35537 bytes) +Real gain (4 bytes header) : 96.0728 percents +\end{verbatim} + +Il est indiqué que le programme est capable de générer un dictionnaire à partir d'un fichier. Il s'agit simplement de compter +les caractères provenant de l'entrée et d'en générer un dictionnaire. Exemple: + +\begin{verbatim} +$ cat dict.sample | Huffman +\32 (12) = 00 +6 (1) = 01000 +4 (2) = 01001 +3 (4) = 0101 +0 (4) = 0110 +5 (2) = 01110 +7 (3) = 01111 +1 (6) = 1000 +M (6) = 1001 +: (6) = 1010 +\10 (6) = 1011 +O (6) = 1100 +8 (3) = 11010 +9 (3) = 11011 +2 (6) = 1110 +T (6) = 1111 +Bitstream length : 294 bits (= 37 bytes) +Real size input : 608 bits (= 76 bytes) +Size squeezed by : 51.6447 percents +Dictionnary size : 512 bits (= 64 bytes) +Total bitstream length : 806 bits (= 101 bytes) +Real gain (4 bytes header) : -38.1579 percents +\end{verbatim} diff --git a/doc/outils.tex b/doc/outils.tex new file mode 100644 index 0000000..69bbc53 --- /dev/null +++ b/doc/outils.tex @@ -0,0 +1,21 @@ +\chapter{Outils utilisés} +\paragraph{} +Pour développer ce projet, nous avons choisi d'utiliser une série d'outils GNU pour nous simplifier la tâche. +Nous utilisons entre-autres, GNU autoconf \& automake pour gérer notre arborescence de développement. Ainsi le +présent projet est découpé en ces répertoires: +\begin{itemize} +\item src contenant les sources des programmes exécutables. C'est notemment dans ce répertoire que seront stoqués +les binaires des exécutables produit par la compilation du projet. +\item lib contenant tous les sources purement algorithmiques, dont ne dépend pas l'implémentation finale. +\item include contenant tous les fichiers .h +\item doc contenant le source \LaTeX\ de cette présente documentation +\item po contenant les fichiers d'internationalisation (traduction française) +\item intl contenant le code source nécessaire au support de l'internationalisation. +\end{itemize} +En dehors de autoconf \& automake, nous avons utilisé un serveur CVS (Concurrent Version System) qui nous a permis +de travailler à plusieurs sur ce projet, sans avoir à nous soucier de rapatrier et de fusionner les codes sources +de tout le monde. +\paragraph{} +Enfin, pour pouvoir compiler ce projet, il suffit de taper la commande './configure' au shell et de suivre les instructions. +Les binaires seront placés dans le répertoire src. Pour générer cette documentation, il suffit d'aller dans le répertoire doc +et de taper 'make ps'. diff --git a/doc/structures.tex b/doc/structures.tex new file mode 100644 index 0000000..c6c7013 --- /dev/null +++ b/doc/structures.tex @@ -0,0 +1,64 @@ +\chapter{Structures de données} +\section{Files de priorités} +Pour l'implémentation des files de priorités, nous avons remarqué que, comme pour des arbres ou des listes +chaînées, la structure est (dans le cas des tas Binomiaux et des tas de Fibonacci) récursive. Nous avons donc +choisi comme structure de données de base C++ une classe récursive. Qu'importe si les informations de récursivités +ne sont pas utilisés dans les autres dérivés de file de priorité. La classe implémentée est la suivante: + +\begin{lstlisting}{} +class PriorityList { + protected: + class GeneralException; + int type; + Key_t Key; + Datas_t Datas; + PriorityList(Key_t IKey, Datas_t const &IDatas); + + public: + PriorityList(void); + virtual ~ PriorityList(void); + + virtual Key_t ReadKey(Cell C); + virtual Datas_t ReadDatas(Cell C); + virtual int n(void); + virtual int rn(void) = 0; + + virtual void Dump(ostream & os) = 0; + virtual bool IsEmpty(void) = 0; + + virtual Cell Min(void) = 0; + virtual Cell Insert(Key_t IKey, Datas_t const &IDatas) = 0; + virtual Key_t Extract_Min(Datas_t & Datas) = 0; + virtual PriorityList *Union(PriorityList * P) = 0; + virtual bool Lower_Key(Cell x, Key_t NKey) = 0; + virtual Key_t Delete(Datas_t & Datas, Cell x) = 0; + PriorityList *GenericUnion(PriorityList * P); + int GetType(void); +}; +\end{lstlisting} + +Les types Key\_t, Datas\_t et Cell sont définis dans un include, et n'influencent en rien le comportement des algorithmes. +Il suffit que Key\_t soit un type "comparable" (nous avons mis int), et que Datas\_t et Cell soient capables de véhiculer +des informations. Pour ces deux derniers types, nous avons mis void *. A partir de cette classe de base, nous allons +dériver toutes les classes suivantes pour permettre l'implémentation des files de priorités. + +\section{Huffman} +Pour l'implémentation de l'algorithme de Huffman, nous avons eu besoin d'écrire une petite structure d'arbre toute simple: + +\begin{lstlisting}{} +class HTree { + private: + HTree * left, *right; + int freq; + char *objet; + public: + HTree(int n_freq, char *n_objet); + HTree(HTree * n_left, HTree * n_right); + ~HTree(); + ostream & Trace(ostream & os, int d = 0); + int ReadFreq(void); + char *ReadObj(void); +}; +\end{lstlisting} + +Notez au passage que la sturcture de données possède une fonction "trace" qui nous sert à générer visuellement le résultat de la compression. diff --git a/doc/temps.tex b/doc/temps.tex new file mode 100644 index 0000000..8763553 --- /dev/null +++ b/doc/temps.tex @@ -0,0 +1,26 @@ +\chapter{Analyse de temps} +\paragraph{} +L'analyse de temps n'est pas très difficile. En effet les différents temps sont déjà calculés pour ce qui est des +tas Binomiaux, des tas de Fibonacci et des tas binaires. Nous présenterons aussi les temps pour les files de priorités. +Voici donc les différents temps nécessaires pour les opérations de bases pour tous les algorithmes: +\paragraph{} +\begin{center} +\begin{tabular}{lcccc} +Procédure & Tas binaire & Tas binomial & Tas de Fibonacci & Liste chaînée triée\\ +\hline\\ +\textsc{Créer-Tas} & $\Theta(1)$ & $\Theta(1)$ & $\Theta(1)$ & $\Theta(1)$\\ +\textsc{Insérer} & $\Theta(\lg n)$ & $O(\lg n)$ & $\Theta(1)$ & $O(n)$\\ +\textsc{Minimum} & $\Theta(1)$ & $O(\lg n)$ & $\Theta(1)$ & $\Theta(1)$\\ +\textsc{Extraire-Min} & $\Theta(\lg n)$ & $\Theta(\lg n)$ & $O(\lg n)$ & $\Theta(1)$\\ +\textsc{Union} & $\Theta(n)$ & $O(\lg n)$ & $\Theta(1)$ & $O(n)$\\ +\textsc{Diminuer-Clé} & $\Theta(\lg n)$ & $\Theta(\lg n)$ & $\Theta(1)$ & $O(n)$\\ +\textsc{Supprimer} & $\Theta(\lg n)$ & $\Theta(\lg n)$ & $O(\lg n)$ & $\Theta(1)$\\ +\end{tabular} +\end{center} +\paragraph{} +Les temps de la liste chaînée triée sont simples à analyser et à expliquer. La liste étant triée et doublement chaînée, +les opérations MINIMUM, EXTRAIRE-MIN, et SUPPRIMER sont directes, donc en $\Theta(1)$. Ensuite, l'insertion doit trouver +le bon emplacement, donc parcourir au pire toute la liste chaînée afin d'effectuer l'insertion. C'est pourquoi l'opération +UNION est en $O(n)$. De même, l'opération DIMINUER-CLE va effectuer l'opération inverser, et déplacer l'élément vers la +gauche jusqu'à trouver sa nouvelle place, donc au pire va parcourir toute la liste. Ce qui nous fait des opérations en $O(n)$. +Enfin, l'opération UNION est l'implémentation de l'algorithme FUSIONNER du tri fusion. Nous avons donc un temps en $O(n)$ aussi. diff --git a/lib/BHeap.cc b/lib/BHeap.cc index 7d7caf5..37f63e3 100644 --- a/lib/BHeap.cc +++ b/lib/BHeap.cc @@ -171,7 +171,7 @@ Degree(0), Father(NULL), Child(NULL), Brother(NULL) /* * Le destructeur. S'il est appelé sur l'entête, nous effacons récursivement * la liste des pointeurs intermédiaires, ainsi que tout le tas - * récursivement (voir rapport). + * récursivement. */ BHeap::~BHeap(void) diff --git a/po/PriorityLists.pot b/po/PriorityLists.pot index bc15857..64e52f8 100644 --- a/po/PriorityLists.pot +++ b/po/PriorityLists.pot @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"POT-Creation-Date: 2001-03-22 13:52+0100\n" +"POT-Creation-Date: 2001-04-17 23:50+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"POT-Creation-Date: 2001-03-22 01:30+0100\n" +"POT-Creation-Date: 2001-03-22 13:52+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -429,11 +429,11 @@ msgid "" " |\n" msgstr "" -#: lib/BinHeap.cc:131 +#: lib/BinHeap.cc:133 msgid "Not enough memory" msgstr "" -#: lib/BinHeap.cc:161 +#: lib/BinHeap.cc:163 msgid "negative overflow" msgstr "" @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: PriorityList-1.0.0\n" -"POT-Creation-Date: 2001-03-22 01:30+0100\n" +"POT-Creation-Date: 2001-03-22 13:52+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Nicolas Noble <pixel@nobis-crew.org>\n" "Language-Team: French <fr@li.org>\n" @@ -453,11 +453,11 @@ msgstr "" " * Cellule d'entête.\n" " |\n" -#: lib/BinHeap.cc:131 +#: lib/BinHeap.cc:133 msgid "Not enough memory" msgstr "Pas assez de mémoire" -#: lib/BinHeap.cc:161 +#: lib/BinHeap.cc:163 msgid "negative overflow" msgstr "Débordement négatif" |