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" |