Universitatea
“Politehnica” Bucuresti
DICTIONARE
amarfoaie.home.ro/paa.html
Amarfoaie Andrei – Sabin
Ghica Alexandru
334 CA
anul III
Proiectul are ca date de intrare un sir de cuvinte ‘c’ si doi întregi: ‘a’ si ‘b’. Se folosesc, pe rând, urmatoarele structuri de date:
I.BArbori
Fiecare cuvânt din ‘c’ este inserat într-un BArbore de coeficient ‘a’ (cu interpretarea ca fiecare nod poate retine cel mult 2*a-1 informatii).
Clasa ‘Barbore’ cuprinde cinci metode pentru inserarea si cautarea unei chei:
public
void insereazaBArbore(String k,...)
{
Nod r=radacina;
. . .
if (r.n==dt-1)
{
Nod s = new Nod();
radacina=s;
s.frunza=0;
s.n=0;
s.copii.add(1,r);
divideCopilBArbore(s,1,r);
. . .
insereazaBArboreNeplin(s,k,col);
}
else
{
insereazaBArboreNeplin(r,k,col);
}
. . .
}
private void divideCopilBArbore(Nod x, int i, Nod y)
{
int j;
Nod z=new Nod();
z.frunza=y.frunza;
z.n=t-1;
for (j=1;j<=t-1;j++)
z.cheie.add(j,y.cheie.elementAt(j+t));
if (y.frunza==0)
for (j=1;j<=t;j++)
z.copii.add(j,y.copii.elementAt(j+t));
y.n=t-1;
x.copii.add(i+1,z);
x.cheie.add(i,y.cheie.elementAt(t));
x.n=x.n+1;
}
private void insereazaBArboreNeplin(Nod x, String k,int col)
{
int i=x.n;
if (x.frunza==1)
{
while(i>=1&&k.compareTo((String)x.cheie.elementAt(i))<0)
i=i-1;
x.cheie.add(i+1,k);
x.n=x.n+1;
. . .
}
else
{
while (i>=1 &&
k.compareTo((String)x.cheie.elementAt(i))<0)
i=i-1;
i=i+1;
Nod cix=(Nod)x.copii.elementAt(i);
. . .
if (cix.n==dt-1)
{
divideCopilBArbore(x,i,cix);
if (k.compareTo((String)x.cheie.elementAt(i))>0)
i=i+1;
cix=(Nod)x.copii.elementAt(i);
. . .
}
insereazaBArboreNeplin(cix,k,col);
}
}
public int cautaBArbore(String k,int col)
{
return(cautare(radacina,k,col));
}
private int cautare(Nod x,String k,int col)
{
int i=1;
while ((i<=x.n) && (k.compareTo(x.cheie.elementAt(i))>0))
i=i+1;
if ((i<=x.n) &&
(k.compareTo(x.cheie.elementAt(i))==0))
{
return(1);
}
if (x.frunza==1)
return(0);
else
return(cautare((Nod)x.copii.elementAt(i),k,col));
}
La un moment dat
arborele poate fi descris astfel:
Literele cuvintelor din ‘c’ apar în nodurile arborelui trie începând de la cel de-al treilea nivel, primul fiind considerat radacina logica, si notat cu ‘*’.
Clasa ‘ArboreTrie’ cuprinde urmatoarele metode pentru inserarea si cautarea unei informatii:
private
char inf(String s,Nod n,int k)
{
if (s.length()==k)
return (1);
Nod aux = new Nod();
char cautat = s.charAt(k);
for (int i=0;i<n.v.size();i++)
{
aux = (Nod) n.v.elementAt(i);
char q[]={aux.cheie};
String afisat=new String(q);
int a=aux.x,b=aux.y;
. . .
if (cautat==aux.cheie)
return(inf(s,aux,++k));
}
return(0);
}
public int cauta(String s,int col)
{
if (s.length()!=0)
return(inf(s,radacina,0));
return(0);
}
private char inserare(String s,Nod n,int k)
{
char inserat= s.charAt(k);
Nod aux=new Nod();
if (!n.v.isEmpty())
for (int i=0;i<n.v.size();i++)
{
aux = (Nod) n.v.elementAt(i);
if (inserat == aux.cheie)
{
if (s.length()==k+1)
{
aux.inf = '1';
return('1');
}
else
return(inserare(s,aux,++k));
}
}
Nod nn = new Nod();
nn.cheie=inserat;
if (s.length()==k+1)
{
nn.inf='1';
n.v.addElement(nn);
return('1');
}
n.v.addElement(nn);
return(inserare(s,nn,++k));
}
public void adauga (String s,int col)
{
inserare(s,radacina,0);
. . .
}
In timpul executiei arborele trie poate ajunge la urmatoarea forma:
III.Tabele de dispersie
Fiecarei litere îi corespunde un numar calculat în functie de intregul ‘b’. Un cuvânt este evaluat prin realizarea operatiei SAU – logic pentru fiecare bit al valoarilor asociate literelor sale.
Secventa urmatoare corespunde unui exemplu de calcul al codului fiecarei litere (‘a’-‘z’):
for(i=0;i<26;i++)
{
d=new Double(Math.pow(2,i%c));
v1[i]=new Integer(d.intValue());
},
iar urmatoarea, calculului
codului (‘j’) al unui cuvânt ‘s’
for (i=0;i<s.length();i++)
if ((s.charAt(i)>='a')||(s.charAt(i)<='z'))
j=j|(v1[s.charAt(i)-97]).intValue();