Projet ALGAV Master STL @UPMC 2017-2018
Author : Kaan YAGCI - 3201099
1. Présentation
1.1 Structure 1 : Patricia - Tries
RAPPEL
Trie : Représentation arborescente d'un ensemble de clés en évitant de répeter les préfixes communs.
- prem(cle) : Renvoie la première caractère de la clé.
- reste(cle) : Renvoie la clé privée de son premier caractère
- car(e,i) : Renvoie la i-ème caractère de la clé
- lgueur(cle) : Renvoie le nombre de caractères de la clé.
Question 1.1
Dans le vrai vie, on dit qu'un mot est fini quand il ne reste plus de caractères. Pour cela je choisi le caractère numéro 0 parmi les 128 caractères ASCII pour indiquer la fin d'un mot. Ce caractère est le caractère NUL (https://fr.wikipedia.org/wiki/American_Standard_Code_for_Information_Interchange)
Question 1.2
Pour la réalisation de la structure Patricia-tries j'ai créé et utilisé les classes suivantes :
TODO :
- Insert file structure
-
Noeud : La classe qui représente le structure du noeud. Elle contient un objet de type Noeud qui peut être undefined qui représente le noeud père s'il y en a un, une chaîne de caractères appelé cle qui représente la clé du noeud et une liste des objets de type Noeud qui représente les fils du noeud (les sous arbres dans le cas le noeud est la racine d'une arbre de recherche) et les primitives d'un structure noeud. (Dans le cas d'une feuille la liste des fils sont vide). Ces primitives sont les suivants :
- constructor(cle,fils,pere) : La fonction permet d'identifier un objet Noeud. Il prend une chaîne de caractères cle qui représente la clé du noeud, une liste des objets de type Noeuds qui représente la liste des fils du noeud et un objet de type Noeud qui peut être undefined dans le cas du neoud est une racine qui représente le père du noeud.
constructorcle : string, fils : Array<Noeud>, pere? : Noeud- getPere() : La fonction qui retourne le père du noeud et undefined si le noeud est le père d'un arbre.
getPere() : void -> Noeud|undefined
public getPere: Noeud|undefined- getCle() : La fonction retourne la clé du noeud.
getCle(): void -> string
public getCle: string- getFils() : La fonction retourn la liste des fils du noeud.
getFils(): void -> Array<Noeud>
public getFils: Array<Noeud>- setPere(p) : La fonction permet de reinitialiser le père du noeud avec l'objet de type Noeud passé en paramètre.
setPere(p): Noeud|undefined -> Noeud|undefined
public setPerep : Noeud|undefined: Noeud|undefined- setCle(c) : La fonction permet de reinitialiser la clé du noeud avec la clé passée en paramètres.
setCle(c): string -> string
public setClec : string: string- setFils(f) : La fonction permet de reinitialiser la liste des fils du noeud avec la nouvelle liste f passée en paramètres.
setFils(f): Array<Noeud> -> Array<Noeud>
public setFilsf : Array<Noeud>: Array<Noeud>- prem() : La fonction renvoie la première caractère de la clé du noeud.
prem(): void -> string
public prem: string- reste() : La fonction renvoie la clé privée de son premier caractère.
public reste: string- car(i) : La fonction renvoie la ième caractère de la clé.
car(i): number -> string
public cari : number: string- lgueur() : La fonction renvoie le nombre de caractères de la clé.
lgueur(): void -> number
public lgueur: number- compare(n) : La fonction permet de comparer le noeud avec le noeud passé en paramètre. Elle compare la clé du noeud actuelle avec la clé du noeud passé en paramètres.
compare(n): Noeud -> number
public comparen : Noeud: number- update() : La fonction permet de mettre à jour la liste des noeud fils du noeud. Elle trie la liste dans l'ordre l'alphabétique.
update(): void -> Array<Noeud>
public update: Array<Noeud>- add(mot) : La fonction permet d'ajouter le mot passé en paramètres dans le noeud.
add(mot): string -> boolean
public addmot : string : boolean- isFeuille() : La fonction permet de déterminer si le noeud est une feuille.
isFeuille(): void -> boolean
public isFeuille: boolean- showOnConsole() : La fonction permet d'afficher le contenu du noeud dans la console.
showOnCOnsole() : void -> void
public showOnConsole: void -
Arbre : La classe qui répresente la structure de l'arbre de recherche, en stockant un objet de type Noeud comme la racine de l'arbre et des primitives d'une stucture d'arbre de recherhe. Les primitives sont les suivants :
- constructor() : La fonction permet d'identifier un objet Arbre.
constructorracine: Noeud- getRacine() : La fonction qui renvoie la racine d'un arbre.
getRacine(): void -> Noeud
public getRacine: Noeud- setRacine(nouvelleRacine) : La fonction permet de changer la racine de l'arbre.
setRacine(r): Noeud -> Noeud
public setRaciner: Noeud: Noeud- compare(a) : La fonction permet de comparer l'arbre avec un autre objet de type Arbre.
compare(a): void -> number
public comparea: Arbre: number- canAdd(mot) : Le prédicat qui permet de tester si le mot passé en paramètre peut être ajouté dans l'arbre.
canAdd(mot): string -> boolean
public canAddmot: string: boolean- add(mot) : La fonction permet d'ajouter le mot passé en paramètre à l'arbre. Ici nous testons quand même la possibilité d'ajout du mot dans l'arbre.
add(mot): string -> boolean
public addmot: string: boolean- showOnConsole() : La fonction permet d'afficher l'arbre sur le console pour une affichage basique.
showOnConsole(): void->void
public showOnConsole: void -
PatriciaTrie : La classe qui représente la structure Patricia-tries. Elle régroupe des objets Arbre sous une liste et contient les primitives d'un structure Patricia-tries. Les primitives sont les suivants :
- constructor() : La fonction qui permet de identifier un objet PatriciaTrie.
constructor- update() : La fonction permet de trier la liste des sous-arbres alphabétiquement. Cette fonction est privée parce qu'elle est destiné uniquement à l'usage l'interne de l'objet PatriciaTrie.
update(): void -> Arbre[]
private update: Array<Arbre>- add(m) : La fonction qui permet d'ajouter un mot dans le patricia-trie. Elle trouve le sous arbre qu'elle doit ajouter le mot (crée une s'il n'y en existe pas) et mis à jour la liste des sous arbres pour qu'elle restent triée pour pour le cas qu'il n'y en a aucun sous-arbre existant que nous pouvons ajouter le mot passé en paramètres. Cette fonction n'est pas sensible à la casse pour éviter tout futur conflit.
add(m): string -> boolean
public addm: string: boolean- showOnConsole() : La fonction permet qui permet d'afficher l'objet dans le console. Pour une affichage basique.
showOnConsole(): void -> void
public showOnConsole: void
Question 1.3
L'exemple de base défini dans l'énoncé est le suivant A quel genial professeur de dactylographie sommes nous redevables de la superbe phrase ci dessous, un modele du genre, que toute dactylo connait par coeur puisque elle fait appel a chacune des touches du clavier de la machine a ecrire ?. J'ai fais l'hypothèse que ça ne soit pas sensible à la casse pour éviter les conflits liés aux changement de code ASCII par rapport à sa casse. Donc on obtient un Patricia-tries de 16 sous arbres. Le command suivant permet d'exécuter ces tests sur la console.
npm run question13
1.2 Structure 2 : Tries Hybrides
RAPPEL
Trie Hybride : Une trie hybride est un arbre ternaire dont chaque noeud contient un caractère et une valeur (non vide lorsque le noeud réprésente une clé). Chaque noeud a 3 pointeurs : un lien Inf (resp. Eq, resp. Sup) vers le sous arbre dont le premier caractère est inférieur (resp. égal, resp. supérieur) à son caractère.
Question 1.4
Pour la réalisation de la structure tries hybrides j'ai crée la classe TrieHybride. C'est la classe qui contient tous les attributs et les fonctions concernant le structure tries hybrides. Ces attributs sont suivantes :
- valeur : Attribut de type entier facultatif qui représente la valeur de la racine (s'il y en a une).
valeur : number|undefined
private valeur: number|undefined;
- cle : Attribut de type chaîne de caractères représente la clé de la racine.
cle: string
private cle: string;
- pere : Attribut de type TrieHybride qui permet représente le père de l'arbre (s'il y en a un, undefined sinon).
pere: TrieHybride|undefined
private pere: TrieHybride|undefined;
- inf : Attribut de type TrieHybride qui représente le sous-arbre Inf de l'arbre (s'il y en a un. undefined sinon).
inf : TrieHybride|undefined
private inf: TrieHybride|undefined;
- eq : Attribut de type TrieHybride qui représente le sous-arbre Eq de l'arbre (s'il y en a un, undefined sinon).
eq: TrieHybride|undefined
private eq: TrieHybride|undefined;
- sup : Attribut de type TrieHybride qui représente le sous-arbre Sup de l'arbre (s'il y en a un undefined sinon)
sup: TrieHybride|undefined
private sup: TrieHybride|undefined;
HYPOTHESE: Tous ces attributs sont privées.
Ses fonctions sont suivants :
- constructor(cle,valeur,inf,eq,sup,pere) : Le fonction permet d'identifier un objet TrieHybride. Les paramètres cle,valeur,inf,eq,sup,pere sont tous des paramètres facultatifs représentent la clé,la valeur, le sous-arbre inf, le sous-arbre eq, le sous-arbre sup et le pere de la racine. Dans le cas de non présence d'un des paramètres, celui ci est initalisé à la valeur null.
constructorcle?: string, valeur?: number, inf?: TrieHybride, eq?: TrieHybride, sup?: TrieHybride, pere?: TrieHybride
- getValeur() : Fonction retourne la valeur de la racine de l'arbre (et undefined s'il y en a pas)
getValeur(): void -> number|undefined
public getValeur: number|undefined
- getCle() : Fonction retourne la clé de la racine de l'arbre
getCle(): void -> string
public getCle: string
- getInf() : Fonction retourne le sous-arbre Inf de l'arbre (undefined s'il y en a pas).
getInf(): void -> TrieHybride|undefined
public getInf: TrieHybride|undefined
- getEq() : Fonction retourne le sous-arbre Eq de l'arbre (undefined s'il y en a pas).
getEq(): void -> TrieHybride|undefined
public getEq: TrieHybride|undefined
- getSup() : Fonction retourne le sous-arbre Sup de l'arbre (undefined s'il y en a pas).
getSup(): void -> TrieHybride|undefined
public getSup: TrieHybride|undefined
- getAllSuccessors() : Fonction retourne la liste de tous les sous-arbres.
getAllSuccessors(): void -> Array<TrieHybride|undefined>
public getAllSuccessors: Array<TrieHybride|undefined>
- getPere() : Fonction retourne le pere de l'arbre (s'il y en a, undefined sinon)
getPere(): void -> TrieHybride|undefined
public getPere: TrieHybride|undefined
- setValeur(valeur) : Fonction permet de changer la valeur de la racine de l'arbre.
setValeur(valeur): number|undefined -> number|undefined
public setValeurvaleur: number|undefined: number|undefined
- setCle(cle) : Fonction permet de changer la clé de la racine de l'arbre.
setCle(cle): string -> string
public setClecle: string: string
- setInf(inf) : Fonction permet de changer le sous-arbre Inf de l'arbre.
setInf(inf): TrieHybride|undefined -> TrieHybride|undefined
public setInfinf: TrieHybride|undefined: TrieHybride|undefined
- setEq(eq) : Fonction permet de changer le sous-arbre Eq de l'arbre.
setEq(eq): TrieHybride|undefined -> TrieHybride|undefined
public setEqeq: TrieHybride|undefined: TrieHybride|undefined
- setSup(sup) : Fonction permet de changer le sous-arbre Sup de l'arbre.
setSup(sup): TrieHybride|undefined -> TrieHybride|undefined
public setSupsup: TrieHybride|undefined: TrieHybride|undefined
- setPere(p) : Fonction permet de changer le père de la racine de l'arbre.
setPere(p): TrieHybride|undefined -> TrieHybride|undefined
public setPerep: TrieHybride|undefined: TrieHybride|undefined
- prem() : Fonction renvoie la première caractère de la clé de la racine de l'arbre.
prem(): void -> string
public prem: string
- reste() : Fonction renvoie la clé de la racine privée de son premier caractère
reste(): void -> string
public reste: string
- car(i) : Fonction renvoie la ième caractère de la clé de la racine.
car(i): number -> string
public cari : number: string
- lgueur() : Fonction renvoie le nombre de caractères de la clé de la racine.
lgueur(): void -> number
public lgueur: number
- estVide() : Fonction permet de déterminer si l'arbre est vide
estVide(): void -> boolean
public estVide: boolean
- compare(t) : Fonction permet de comparer deux tries hybrides.
compare(t): TrieHybride -> number
public comparet: TrieHybride: number
- add(mot) : Fonction permet d'ajouter un mot au trie hybride.
add(mot): string -> TrieHybride
public add mot: string, v:number: TrieHybride
- addChar(char) : Fonction permet d'ajouter qu'un seul caractère au trie hybride. Cette fonction est privée parce qu'elle est destiné uniquement à l'usage dans la classe.
addChar(char): string -> TrieHybride
private addChar char: string, v: number|undefined: TrieHybride
Question 1.5
On insère le même phrase que la questio 1.3 appelé exemple de base. Cet insetion nous donne un trie hybride de 40 mots. Le command suivant permet d'exécuter ces tests sur la console.
npm run question15
2. Fonctions avancées pour chacune des structures.
Question 2.6
4. Complexités
Question 4.10
L'étude de la complexités des fonctions de la question 2.6 sont les suivants :
-
Les fonctions du structure Patricia Tries sont les suivants:
- La fonction recherche(arbre,mot) -> booleéen de la classe ArbreFactory est le suivant :
static recherchearbre: PatriciaTrie|TrieHybride, mot:string:booleanIl fait dont un simple appel à la fonction recherche du structure Patricia Tries. On étudie donc la complexité de la fonction recherhce(mot) de la classe Patricia Trie qui le suivant :
public recherchemot: string,verbose: boolean = false: booleanDans le pire des cas le fonction parcourt tous la liste des sous-arbres, et à la fin il fait un appel à la fonction recherche(mot) de la classe ArbreNoeudSimple qui est le suivant :
public recherchemot: string, verbose: boolean = false: booleanLa fonction recherche du structure ArbreNoeudSimple a comme complexité dans le pire des cas O(2n). Qui fait la complexité de la fonction recherche précédent (de la classe PatriciaTrie) O(3n). Donc on peut dire que la complexité de la fonction recherche(arbre,mot) -> booleén du structure Patricia Tries est O(n).
- La fonction ComptageMots(arbre) -> entier de la classe ArbreFactory:
static comptageMotsarbre:PatriciaTrie|TrieHybride:numberFonction fait un simple appel à la fonnction comptageDeMots() de la classe PatriciaTrie qui est le suivant :
public comptageDeMots: numberLa compléxité de cette fonction est égal à la compléxité de la fonciton map de l'interface Array fois puis le compléxité e la fonction comptageDeMots() de la classe ArbreNoeudSimple plus la complexité de la fonction reduce de l'interface Array. D'après ECMA les fonctions .map et .reduce de l'interface Array ont comme complexité O(n). On va donc étudier la complexité de la fonction comptageDeMots() de la classe ArbreNoeudSimple qui est le suivant:
public comptageDeMotsverbose:boolean = false: numberLa complexité dans le pire des cas de cette fonction est O(n) qui viens des complexités des fonctions filter, map et reduce de l'interface Array et de l'appels recursives de la fonction elle-mmême. Donc on peut déduire que la coplexité de la fonction ComptageMots(arbre) -> number de la classe ArbreFactory est en O(n).
- La fonction listeDeMots(arbre) -> liste[mots] de la classe ArbreFactory est le suivant :
static listeMotsarbre: PatriciaTrie|TrieHybride: Array<string>Il fait un simple appel à la fonction listeMots de la classe Patricia Tries qui est le suivant :
public listeMotsprefixe: string = "",verbose:boolean = false: Array<string>La complexité de cette fonction est donc la complexité de la fonciton map de l'interface Array fois la complexité de la fonction listeMots de la classe ArbreNoeudSimple plus la complexité de la fonction reduce de l'interface Array. Les fonctions map et reduce de l'interface Array ont comme complexité O(n) d'après ECMA. Donc on va étudier la complexité de la fonction listeMots de la classe ArbreNoeudSimple qui est le suivant:
public listeMotsprefixe: string = "",verbose: boolean = false: Array<string>La complexité de cette fonciton est en O(n) qui venant des appels recursives et des fonctions reduce et concat. Donc on peut en déduire que la complexité de la fonction listeMots(arbre) -> Liste[mots] de la classe ArbreFactory est en O(n)
- La fonction ComptageNil(arbre) -> entier de la classe ArbreFactory est le suivant:
public comptageNilverbose?: boolean: numberSoit n le nombre d'arbre de Patricia Tries la complexité de cette fonction est en n fois (qu'il vient de la compléxité de la fonction filter de l'interface Array) la compléxité de la fonction comptageNil de la classe ArbreNoeudSimple. On étudie donc la fonction comptageNil de la classe ArbreNoeudSimple pour conclure sur l'étude de la complexité de la fonction ComptageNil(arbre) -> entier. Cette fonction est le suivant :
public comptageNilverbose?: boolean: numberLa fonction donc contrôle si la racine est bien défini et si elle est bien défini elle fait appel à la fonction comptageNil de la classe NoeudSimple parce que l'attribut racine est de cette type et rajoute cette resultat à la longueur de la liste des sousArbres qui est égal à undefined qui est aussi ajouté à 0 ou à 1 en fonction du père de l'arbre (si le père de l'arbre est défini 0 et 1 sinon) et la somme des resultats de l'appel de la fonction comptageNil sur chacune des sous-arbres. Don la complexité de cette fonction est en O(n²). D'où on peut déduire de la complexité de la fonction comptageNil(arbre) de la classe ArbreFactory pour le structure Patricia Tries.
- La fonction Hauteur(arbre) -> entier de la classe ArbreFactory est le suivant :
public hauteurverbose:boolean = false:numberCette fonction appel la fonction hauteur de chacun des sous-arbres et prend le max de tous ces resultats. Donc pour un Patricia Tries de n arbres elle fait n fois l'appel à la fonction hauteur de la classe ArbreNoeudSimple qui est le suivant :
public hauteurverbose: boolean= false: numberLa complexité de cette fonction est O(n) parce qu'elle parcourt tous les sous-arbres pour trouver la branche la plus longue. Donc on peut en déduire de la complexité de cette fonction est O(n).
- La fonction profondeurMoyen(arbre) -> entier de la classe ArbreFactory est le suivant:
static profondeurMoyennearbre: PatriciaTrie|TrieHybride: numberCette fonction donc fait une simple appel à la fonction profondeurMoyen de la classe Patricia Tries qui est le suivant :
public profondeurMoyenverbose:boolean = false: numberCette fonction calcule le profondeur moyen en faisant la somme de profondeur de tous les feuilles et le divise par le nombre de feuilles dant l'arbre. On étudie donc la complexité de la fonction profondeurs qui calcule la liste des profondeurs de tous les feuilles de l'arbre qui est le suivant:
public profondeursverbose:boolean=false,index:number = 0: Array<number>Cette fonction parcourt l'arbre niveaux par niveaux et ajoute le profondeur du niveau aux feuilles qui ont trouvé dans le niveau. Donc la complexité de cette fonction est O(n) avec n l'hauteur de l'arbre.
- La fonction Prefixe(arbre,mot) -> entier de la classe ArbreFactory est le suivant :
static prefixearbre: PatriciaTrie|TrieHybride, mot: string: numberLa fonction fait simplement un appel à la fonction prefixe(mot) de la classe ArbreNoeudSimple qui est le suivant:
public prefixemot:string,verbose:boolean= false: numberLa fonciton calcule la liste des mots de la sous-partie de l'arbre que le mot passé en paramètres est une préfixe. Donc on étudie la fonction find de la classe ArbreNoeudSimple qui est le suivant:
public findmot:string, verbose: boolean = false: ArbreNoeudSimpleCette fonction a les mêmes démarches de la fonction recherche donc sa complexités aussi en O(n). Alors la complexité de la fonction prefixe(arbre,mot) pour le structure Patricia Tries est en O(n) qui est la même que la recherche.
- La fonction Suppression(arbre,mot) -> PatriciaTrie de la classe ArbreFactory est le suivant:
static suppressionarbre: PatriciaTrie|TrieHybride, mot: string: PatriciaTrie|TrieHybrideLa fonction fait simplement un appel à la fonciton suppression de la classe PatriciaTrie qui est le suivant:
public supprimermot:string,verbose:boolean = false: PatriciaTrieLa fonction parcourt la liste des arbres de la Patricia Tries et pour chacun des arbres elle appelle la fonciton supprimer(mot) de la classe ArbreNoeudSimple qui est le suivant:
public supprimermot:string,verbose:boolean=false: ArbreNoeudSimpleLa fonction teste d'abord si le mot existe dans l'arbre et si il y existe il trouve la sous-partie associé au mot et supprime juste le noeud qui indique le fin de mots. Donc la complexité de cette fonction est le même que la recherche qui est en O(n).
-
Les fonctions du structure Trie Hybride sont les suivants:
- Fonction recherche(arbre,mot) -> booléen de la classe ArbreFactory fait simplement un appel à la fonction recherche(mot) de la classe TrieHybride qui est le suivant:
public recherchemot: string,verbose: boolean = false: booleanEn fonction du premier lettre du mot passé en paramètre la fonciton fait un appel d'elle même sur le sous-arbre concerncé (inf,eq ou sup). Et dans le cas que le mot n'a qu'un seul lettre elle cherche si la valeur de la racine de l'arbre dont le mot est la clé de la racine. Donc la complexité de cette fonction viens de parcourt des sous-arbres. La complexité de cette fonction est en O(n).
- Fonction ComptageMots(arbre) -> entier de la classe ArbreFactory fait simplement un appel à la fonction comptageDemots() de la classe TrieHybride qui est le suivant:
public comptageDeMotsverbose: boolean = false: numberLa fonction fait la somme des résultats de la fonction comptageDeMots() de tous les sous-arbres et si la valeur de la racine de l'arbre indique un fin de mots 1 et 0 sinon. Pour le cas que l'arbre n'aucun sous-arbre et regarde si la racine est définie ou pas. Donc la complexité de cette fonciton est en 0(n) qui vient de la parcourt des sous-arbres.
- Fonction ListeMots(arbre) -> Liste[mots] de la classe ArbreFactory fait simplement un appel à la fonction listeMots() de la classe TrieHybride qui est le suivant:
public listeMotsprefixe: string = "",verbose: boolean = false: Array<string>La fonction parcourt tous les noeuds de l'arbre un par un et regarde si le noeud est un noeud qui indique la fin d'un mot. Pour cela la complexité de cette fonction est en O(n).
- Fonction ComptageNil(arbre) -> entier de la classe ArbreFactory fait simplement un appel à la fonction comptageNil() de la classe TrieHybride qui est le suivant:
public comptageNilverbose: boolean = false: numberla fonction fait une somme de résultats de la fonction comptageNil sur les sous-arbres, le résultat de la fonction comptageNil() de la racine de l'arbre et aussi 0 ou 1 en fonction du pere de l'arbre (si le père de l'arbre n'est pas définie elle est aussi nil donc 1). Donc la complexité de cette fonction est en O(n) qui vient de parcourt de tous les noeuds de l'arbre.
- Fonction Hauteur(arbre) -> entier de la classe ArbreFactory fait simplement un appel à la fonction hauteur() de la classe TrieHybride qui est le suivant:
public hauteurverbose: boolean= false: numberCette fonction est appelé pour chaque sous-arbres. Donc elle parcourt tous les noeuds de l'arbre pratiquement. Donc la complexité elle vient de ce parcours qui est en O(n).
- Fonction ProfonfeurMoyenne(arbre) -> entier de la classe ArbreFactory fait simplement un appel à la foction profondeurMoyen de la classe TrieHybride qui est le suivant:
public profondeurMoyenverbose?:boolean: numberLA fonction fait appel à la fonction profondeurs() qui donne la liste de profondeurs de tous les feuilles de l'arbre. Fait la somme de cette liste et divise par le nombre d'éléments de la liste. Pour calculer la moyenne. La fonction profondeurs() de la classe TrieHybride est donc le suivant:
public profondeursverbose:boolean = false,index: number = 0: Array<number>La fonction fait trouve d'abord la liste des feuilles et calcule la profondeur de chaque feuille. Donc cette fonction est en O(n²).
- Fonction Prefixe(arbre,mot) -> entier de la classe ArbreFactory fait simplement un appel à la foction prefixe(mot) de la classe TrieHybride qui est le suivant:
public prefixemot:string,verbose?:boolean: numberLa fonction fait un appel à la fonction find pour trouver la sous-partie de l'arbre dont le mot passé en paramètre est un préfixe de tout l'arbre. Sur l'arbre résultant il appel la fonction listeMots() pour calculer la longueur et rajoute 1 ou 0 en fonction de si le mot passé en paramètre existe dans l'arbre. Alors la complexité de notre fonction est O(n) qui vient de parcourt de tous les noeuds de l'arbre. (On parcourt un partie des noeuds dans la fonction find et la reste dans la fonction listeMots())
- Fonction Suppression(arbre,mot) -> TrieHybride de la classe ArbreFactory qui fait un appel à la fonction supprimer(mot) de la classe TrieHyride qui est le suivant:
public supprimermot:string,verbose:boolean=false: TrieHybrideLa fonction a les mêmes démarches de la fonction recherche. Mais cette fois ci si le mot est trouvé dans l'arbre on met la valeur de la racine assosicé à nil (undefined pour notre cas). Donc la complexité de la fonction est en O(n).
En suite on étudie la complexité de deux fonctions fusionner(arbre) de la question 3.7 pour chacun de nos structures. Cet étude est le suivant:
- Le fonction fusionner de la classe ArbreFactory est le suivant:
static fusionner a1: PatriciaTrie|TrieHybride, a2: PatriciaTrie|TrieHybride: PatriciaTrie|TrieHybride|undefined
Donc la fonction appelle la fonction fusionner de chaque structure pour chaque structure. Alors on étudie d'abord le structure Patricia Tries. La fonction fusionner(PatriciaTrie) est le suivant:
public fusionnerpt: PatriciaTrie,verbose: boolean = false:PatriciaTrie
La fonction récupère d'abord la liste des mots du Patricia Trie passé en paramètres et les ajoute à la Patricia Tries courant. Donc la complexité est O(n) avec n nombre de noeuds de Patricia Tries passé en paramètres. Et puis, on étudie le structure Trie Hybride. la fonction fusionner(TrieHybride) est le suivant:
public fusionnera: TrieHybride,vebose:boolean = false: TrieHybride
La fonction ajoute tous les mots strocké dans Trie Hybride passé en paramètres à Trie Hybride courant. Donc cette fonction est en O(n).
Puis on étudie les fonctions de conversion de la question 3.8 pour chacune des structures comme ceci:
- Les fonction conversion définis dans la classe ArbreFactory sont les suivants:
static convertPatricia2Hybridept:PatriciaTrie: TrieHybride
static convertHybride2Patriciath: TrieHybride: PatriciaTrie
Ces deux fonctions ont les mêmes démarches, ce qui est retrouver la liste des mots de l'arbre passé en paramètre et de les ajouter à une nouvelle arbre au fur à une mesure. Donc pour ces deux fonctions la complexité est en O(n).
Pour finir on étudie la complexité de la fonction de la question 3.9 ce qui est suivant:
static convertPatricia2THEquilibrept:PatriciaTrie,verbose: boolean = false: TrieHybride
Dans le développement de cette fonction j'ai fais le choix d'être précis que d'être optimal. Donc la complexité de cette fonction va être trop trop grande. La fonction récupère la liste des mots de l'arbre passé en paramètres. Elle parcourt cette liste pour trouver le milieu. Elle recrée un nouvelle liste que chaque élément de cette liste est l'élément au milieu d'une des soulistes de la liste des préfixes des mots stocké dans l'arbre passé en paramètres. Pour chacun des mots préfixe, elle crée des sous listes dont les éléments de la liste sont triées aléatoirement et crée un structrue Trie Hyride avec la liste pour calculer on suite le profondeur moyen et l'hauteur. Elle crée des liste àléatoires 1000 fois afin d'avoir un meilleur estimation pour trouver le cas le plus équilibré. Puis elle cherche une combinaison des éléments de la liste des mots du préfixe mieux que les combinaisons essayés, pour ajouter en suite à la nouvelle Trie Hyrbide. Donc la complexité de cette fonction est en O(n * 1000) ce qui est gigantesque.