CPGE Oujda                                                                        Problème sur les chaines de caractères                                                                                     Spé

                                             

Révisions

 

Définitions préliminaires

- La compression de données est le traitement informatique utilisant un algorithme particulier, qui permet  de  transformer une suite de bits A en une suite de bits B plus courte. Les suites A et B contiennent les mêmes informations, mais codées dune manière différente

- La décompression est l’opération inverse de la compression

- L’algorithme RLE (Run-Length Encoding), appe en français le codage par plages, est un algorithme de compression informatique qui consiste à repérer et à éliminer la redondance des données. Toute suite de bits ou de caractères identiques est remplacée par un couple (caractère répété suivi de son nombre d’occurrences (son nombre de répétitions)). Exemple: CCCCBBBRCC donne: C4B3R1C2

 

Dans ce qui suit, on se propose détudier l’algorithme RLE pour compresser des chaînes de caractères :

- On appelle chaîne dorigine, toute  chaîne de caractères avant sa compression.

- On appelle chaîne compressée de la chaîne d’origine ch, la chaîne de caractères contenant une occurrence unique (un seul caractère) de toute suite de caractères identiques consécutifs se trouvant dans la chaîne dorigine ch .

 

Exemple :- si ch = AAARTTAAVVTTT , sa chaîne compressée = ARTAVT

 

- Soient ch une chaîne d’origine et s sa chaîne compressée. On appelle tableau d’occurrences de s dans ch, un tableau dentiers contenant le nombre des

répétions successives de chaque caractère de s dans la chaîne dorigine ch

 

Exemple :- Si la chaîne dorigine ch = BBBXXXXXXBBBYYYYYB et s sa chaîne compressée, alors le tableau d’occurrences de s dans ch  est {:3, 6, 3, 5,1}

 

Mise en œuvre de l’algorithme RLE en langage Python

Dans ce problème, il s’agit décrire des fonctions en langage python utilisant l’algorithme RLE pour la compression et la compression de chaînes de caractères

 

Rappels :

- Une chaîne de caractères en langage python  est un tableau de caractères non modifiable , sa longeur est donnée par la fonction len

-Le premier élément dune liste en langage python a pour indice zéro ( 0) Remarques

- On suppose que toutes le chaînes de caractères manipulées dans ce problème, ont des longueurs strictement inférieurs à 255.

Dans cette partie, on se propose décrire des fonctions en langage pyhon avec paratres pour la compression et la décompression de chaîne de caractères

- On suppose  avoir claré comme paramètres ch  pour la chaîne dorigine et ch_compress  pour sa chaîne compressée)

Soit  une variable  tableau de nom occur destie à contenir le tableau d’occurrences de ch_compress dans ch,

Question  1 ) Ecrire le code dune fonction  dentête : def compresser(ch)

qui met dans la chaîne  ch_compress , la chaîne compressée de ch

Exemple :     - Si la chaîne ch = AAAXRRZZZAAAA

-  l’appel de la fonction compresser(ch) retourne AXRZA

Question  2) Ecrire le code dune fonction  dentête: def occurrence(ch)

qui retourne le tableau occur (occurrences de ch_compress dans ch) Exemple

- Si la chaîne dorigine ch = DDDRRRRDTTYYYY,

-  lappel de la fonction occurrence (ch) retourne le tableau occur tel que : occur[0]=3, occur[1]=4, occur[2]=1, occur[3]=2, occur[4]=4

Question 3) Ecrire le code dune fonction  dentête :

 def  decompresser(ch_compress,ch,occur) qui permet de décompresser la chaîne ch_compress  en chaîne dorigine ch

Exemple :

- Si la chaîne ch_compress = BACB et occur={3,5,4,1}

-  l’appel de la fonction decompresser(ch_compress,occur) retourne BBBAAAAACCCCB

Dans cette question on se propose  de compresser une chaîne de caractères sans utiliser le tableau doccurrences  

- On appelle chaîne codée dune chaîne dorigine, la chaîne de caractères contenant une occurrence unique de toute suite de caractères identiques consécutifs

se trouvant dans la chaîne dorigine, suivie du nombre doccurrence du caractère dans la chaîne dorigine

Question 4) Ecrire le code dune fonction  dentête :

def coder(s) qui permet de mettre dans la chaîne  s_codee , la chaîne codée de s,

Exemple : - Si la chaîne s = EEEEEAAACCCCAAX

- Après l’appel de la fonction coder(s) , s_codee=E5A3C4A2X1

Solutions  Q 1)

def compresser(ch):

ch_compress=""

i=0

while i<len(ch):

while ((i<(len(ch)-1)) and ( ch[i]==ch[i+1])):

i+=1

if(i<len(ch)):

ch_compress=ch_compress+ch[i]

i+=1

return ch_compress

print(compresser("AAARTTAAVVTTT"))

 

Q2)

 

def occurrence(ch_compress,ch):

i,j=0,0

occur=[]

while(i<len(ch_compress)):

nb=0;

while (j<len(ch))and (ch[j]==ch_compress[i]) :

j+=1

nb+=1

occur.append(nb)

i+=1

return occur

ch="AAARTTAAVVTTT"

ch_c=compresser(ch)

print(ch_c)

occ=occurrence(ch_c,ch)

print(occ)

 

Q3)

 

def decompresser(ch_compress,occur):

i,j=0,0

ch=""

while(i<len(ch_compress)):

for k in range(occur[i]):

ch=ch+ch_compress[i];

i+=1

return ch

 

Q4)

 

def coder(s):

i=0

s_codee=""

while (i<len(s)):

occ=1;

while((i<len(s)-1) and (s[i]==s[i+1]) ):

i+=1

occ+=1

if(i<len(s)):

s_codee=s_codee+s[i]

s_codee=s_codee+str(occ)

i+=1

return s_codee