Professional Documents
Culture Documents
Mòdul 8. Grafs
Mòdul 8. Grafs
PID_00161974
Mòdul 8
© FUOC • PID_00161974 • Mòdul 8 Grafs
Índex
Introducció .............................................................................................. 5
Objectius ................................................................................................... 6
Resum ........................................................................................................ 28
Solucionari ............................................................................................... 30
Glossari ..................................................................................................... 30
Bibliografia .............................................................................................. 30
© FUOC • PID_00161974 • Mòdul 8 5 Grafs
Introducció
En aquest mòdul s’introdueix el tipus abstracte de dades Graf, en les dues va-
riants: grafs dirigits i grafs no dirigits, així com la seva implementació eficient
mitjançant llistes d’adjacència.
Objectius
Els objectius que s’espera que pugueu assolir amb els continguts d’aquest mò-
dul són els següents:
1. El concepte de graf
En moltes situacions, ens trobem amb un conjunt d’elements entre els quals
s’estableixen certes relacions. Per exemple, a qualsevol universitat, els alumnes
estan relacionats amb les assignatures que estudien, i els professors amb les que
ensenyen. De la mateixa manera es poden representar els llaços d’amistat en
una comunitat de veïns. També es poden considerar relacions les connexions
de vol entre països europeus, o les interconnexions entre els components d’un
circuit electrònic.
Per exemple, si volem representar les relacions d’amistat entre els estudiants
d’una universitat, ho podem fer mitjançant el model UML de la figura 1.
Figura 1
Doncs bé, les instàncies i els enllaços concrets que es produeixin d’acord amb
aquest model en una situació determinada, formaran un graf. En la figura 2,
es mostra un exemple de diagrama d’objectes i la representació equivalent en
termes de nodes i arestes, segons la notació gràfica habitual que se sol utilitzar
per als grafs.
© FUOC • PID_00161974 • Mòdul 8 8 Grafs
Figura 2
Els grafs es poden subdividir en dues categories importants: els grafs di-
rigits i els grafs no dirigits. En un graf dirigit, cal tenir en compte el
sentit de la relació, mentre que en els grafs no dirigits, el sentit és indi-
ferent.
esGermaDe i esClientDe
La relació esGermaDe és una relació recíproca o simètrica, és a dir, si en Joan esGermaDe Pep,
llavors en Pep ha de complir que en Pep esGermaDe Joan. Dit d’una altra manera, és igual
que expressem la relació com esGermaDe(Pep,Joan) que com esGermaDe(Joan,Pep), el sentit
de la relació no és rellevant. Tanmateix, si tenim una relació denominada esClientDe entre
empreses, el sentit de la relació sí que aporta una informació rellevant, i el fet que l’empresa
A sigui clienta de l’empresa B no implica necessàriament que l’empresa B sigui clienta de
l’empresa A. El diagrama de la figura 3 representa un possible graf dirigit amb la relació es-
ClientDe, en el qual la presència de puntes en les fletxes representa el sentit de cada relació
particular; per exemple, e3 és client de e5 i de e4, i e5 i e6 són clients l’un de l’altre.
Figura 3
© FUOC • PID_00161974 • Mòdul 8 9 Grafs
Una variant addicional dels grafs (siguin dirigits o no) són els grafs va-
lorats. En aquests grafs, les arestes tenen associat un valor (habitual-
ment un número, encara que no necessàriament) que representa
informació sobre la aresta en si.
Figura 4
Figura 5
Una altra subdivisió possible i important dels grafs seria la dels grafs bi-
partits. En els grafs bipartits, no tots els nodes són iguals. És a dir, hi ha
nodes de dos tipus diferents, i només es permeten relacions entre nodes
de diferent tipus.
© FUOC • PID_00161974 • Mòdul 8 10 Grafs
Figura 6
Figura 7
És important tenir en compte des d’ara que un graf és un tipus abstracte de dades molt
general. De fet, els arbres i les estructures lineals com les llistes es poden considerar grafs
connexos en els quals les relacions permeses entre els nodes estan restringides d’alguna
manera. Un arbre binari, per exemple, seria un graf dirigit en què cada node només pot
tenir enllaços que “en surten”, com a màxim, a uns altres dos nodes; i només pot tenir
un enllaç que “hi entra” i, a més, no permet cicles en la seqüència d’arestes. En el cas
d’una llista, tindríem un graf dirigit en què cada element només pot tenir, a tot estirar,
un enllaç que “en surt” i un altre que “hi entra”.
D’aquesta manera, en un graf no dirigit, una aresta és un conjunt {x, y}, en què x,
y ∈ V, i x ≠ y. Per coherència amb la notació habitual dels grafs dirigits, se sol uti-
litzar una notació de parells (x, y) en lloc de la notació de conjunts {x, y}, però sem-
pre cal tenir en compte que (x, y) i (y, x) es consideren la mateixa aresta.
Vegem ara la definició de graf dirigit i assenyalem-ne les diferències amb els
grafs no dirigits.
© FUOC • PID_00161974 • Mòdul 8 12 Grafs
Terminologia
Un graf dirigit G es defineix com el parell ordenat G = (V, A), en què V
és un conjunt finit no buit de nodes o vèrtexs, i A és un conjunt d’ares- En molts textos es considera
que un graf “a seques” és un
tes o arcs entre aquests nodes, amb la propietat que cada aresta en A és graf no dirigit, i els grafs dirigits
(o digrafs) es consideren una
un parell ordenat d’elements (vèrtexs) a V. classe especial de graf.
Enllaços reflexius
De les dues definicions anteriors, es dedueix que en un graf dirigit, hi poden haver enlla-
ços “reflexius”, és a dir, arestes del tipus (a, a). Això no té sentit en el cas de grafs no di-
rigits, ja que una aresta d’aquest tipus en un graf no dirigit no representaria informació
rellevant. Això no obstant, hi pot haver cicles dins dels dos tipus de grafs, és a dir, se-
qüències d’arestes que formen un camí tancat dins del graf.
El tipus abstracte de dades graf tindrà, per tant, dues variants fonamentals: graf
dirigit i graf no dirigit.
Un TAD Graf no dirigit es pot definir d’acord amb el següent conjunt mínim
d’operacions d’inserció i eliminació. Per a identificar els vèrtexs, és necessari
que tinguin alguna dada distintiva, com un nombre o una cadena de caràcters,
que aquí denominarem nom o etiqueta del vèrtex. En principi, el tipus del valor
associat als vèrtexs pot ser qualsevol, per la qual cosa hem indicat el tipus T
com a genèric en la descripció següent.
crearGraf(): Graf
Crea un graf buit.
@pre Cap
@post El graf està buit
© FUOC • PID_00161974 • Mòdul 8 13 Grafs
obtenirVertexs(): Iterador
Torna un iterador sobre la col·lecció de vèrtexs del graf.
@pre Cap.
@post Torna un iterador sobre la col·lecció de vèrtexs del graf.
obtenirArestes(): Iterador
Torna un iterador sobre la col·lecció d’arestes del graf.
@pre Cap.
@post Torna un iterador sobre la col·lecció d’arestes del graf.
Les operacions descrites permeten la manipulació bàsica dels vèrtexs i les ares-
tes del graf. Sens dubte, és convenient que les implementacions del tipus abs-
tracte continguin a més altres operacions per a una manipulació més fàcil dels
grafs, però aquestes dependran de la representació escollida i del llenguatge de
programació.
© FUOC • PID_00161974 • Mòdul 8 14 Grafs
Exemples d’aquestes operacions poden ser l’obtenció directa del grau del graf,
o el nombre d’arestes que conté.
La descripció anterior es basa en dos tipus abstractes de dades, que són Vèrtex
i Aresta, i que tindran les operacions necessàries per a una fàcil manipulació,
com poden ser l’obtenció dels vèrtexs a partir d’una aresta o l’obtenció de les
arestes que incideixen en un vèrtex.
La definició de grafs valorats a partir del que s’ha exposat és immediata, ja que
la biblioteca de TAD de l’assignatura implementa les arestes de manera que si
són etiquetades o són valorades (per a obtenir grafs valorats) porten associat un
valor corresponent a l’etiqueta. Si l’aresta no és valorada, aquest valor serà
‘nul’. a
El TAD GrafDirigit té molt en comú amb el TAD GrafNoDirigit, ja que les dife-
rències rauen en el tipus d’aresta, que es pot canviar per un nou tipus Aresta-
Dirigida. D’aquesta manera, totes les operacions bàsiques de GrafNoDirigit
continuen servint per a GrafDirigit. Ho veurem amb més detall en la imple-
mentació, que es presenta més endavant.
Una classe especial de graf són els grafs bipartits. En els grafs bipartits, el con-
junt dels vèrtexs V no es considera homogeni, ja que conté dos “tipus” de no-
des clarament diferenciats i, a més, es prohibeixen les “relacions” (és a dir, les
arestes) entre nodes del mateix tipus.
TAD GrafNoDirigitBipartit<A,B> {
@pre El valor associat al vèrtex ha de ser del tipus A o del tipus B.
@post Afegeix el vèrtex amb el valor associat al graf}
inserirVertex(g:Graf, valor:A):Graf
inserirVertex(g:Graf, valor:B):Graf
@pre: Els vèrtexs n i m han de formar part del graf i ser de diferent tipus,
d'entre els tipus A i B. No hi ha una aresta entre els nodes m i n.
@post El graf conté una aresta entre els vèrtexs m i n}
D’aquesta manera, es garanteix que els valors associats als vèrtexs seran dels
tipus que accepta el graf concret, i es restringeixen les arestes de manera que
connectin elements de diferents tipus.
© FUOC • PID_00161974 • Mòdul 8 16 Grafs
uoc.ei.tads.grafs.Vertex
Com que no hi poden haver dos grafs amb la mateixa “etiqueta” o identifica-
ció, en les implementacions de Vèrtex és habitual trobar una redefinició del
mètode equals, que permet comparar dos objectes.
uoc.ei.tads.grafs.Aresta
Segons aquest disseny, qualsevol aresta pot tenir un valor associat. Per això,
quan es programa amb aquesta biblioteca, si volem utilitzar grafs no valorats,
simplement hem de deixar totes les arestes amb el seu valor per defecte, que
© FUOC • PID_00161974 • Mòdul 8 17 Grafs
Encara que en aparença totes dues interfícies són molt semblants, cal destacar
que les responsabilitats de les classes que les implementen tenen diferències
subtils però importants. Concretament, la implementació d’una aresta no di-
rigida pot tornar com a vèrtex1 qualsevol dels dos, mentre que en el cas d’ares-
tes dirigides, el vèrtex origen i destinació s’especificaran clarament mitjançant
el constructor, o mitjançant mètodes que n’indiquin clarament la funció.
Les interfícies dels grafs també seran lleugerament diferents segons si el graf és
dirigit o no. Per això és convenient agrupar en una interfície Graf allò que és
comú a totes dues variants. Una especificació en llenguatge Java del TAD Graf
és la interfície següent:
/**
* Elimina l’aresta del graf (si hi era)
*/
public void eliminarAresta(Aresta<TEtiqueta,TElem> a);
/**
* Obté un iterador als vèrtexs adjacents al vèrtex v.
*/
public Iterador<Vertex<TElem>>adjacents(Vertex<TElem> v);
}
Com es veu en la interfície anterior, l’operació per a crear una aresta s’ha omès,
ja que és la part que varia en els casos dirigit i no dirigit. Així, en el cas d’un
graf no dirigit tindríem la definició següent:
En canvi, en el cas d’un graf dirigit, tindríem una definició com la següent:
/**
* Crea i inclou una nova aresta en el graf.
*/
public ArestaDirigida<TEtiqueta,TElem> crearAresta(Vertex<TElem> n,
Vertex<TElem> m);
/**
* Obté un iterador a les arestes amb origen en v.
*/
© FUOC • PID_00161974 • Mòdul 8 19 Grafs
Fixeu-vos que, en el cas d’un graf dirigit, té sentit sol·licitar les arestes “amb
destinació” o “amb origen” en un determinat vèrtex, mentre que en el cas de
grafs no dirigits, això no té cap sentit.
© FUOC • PID_00161974 • Mòdul 8 20 Grafs
4. Implementació de grafs
Figura 8
G = (V, A)
V = {1, 4, 5, 7, 8, 9}
A = {(1, 5), (5, 1), (4, 5), (5, 9), (8, 5), (8, 7), (7, 9), (9, 7)}
En el cas d’un graf no dirigit, s’ocuparà només una part de la matriu, per sota
o per sobre de la seva diagonal principal, per a representar les arestes.
© FUOC • PID_00161974 • Mòdul 8 21 Grafs
En la representació que acabem de veure, la matriu té una mida fixa, que de-
pèn de la mida del domini dels valors associats als vèrtexs (que anteriorment
hem anomenat etiquetes). En l’exemple numèric que acabem de veure, supo-
sant que un node pot tenir com a valor associat un nombre enter positiu, seria
necessari tenir una matriu de D × D, essent D el nombre d’enters positius dife-
rents que es podrien representar en el llenguatge de programació; una mida
molt gran, especialment en comparació amb la petita quantitat d’arestes em-
magatzemades realment en l’exemple.
Figura 9
Pel que acabem de veure, podem formular la següent regla general respecte a
la implementació dels grafs.
La regla anterior val per a grafs dirigits. En el cas de grafs no dirigits, les matrius
d’adjacència només seran convenients quan:
V!
A ≈
2 ⋅ ( V − 2)!
essent A el nombre d’arestes d’un graf no dirigit “dens”. Cal tenir en compte
que, en aquest cas, encara es desaprofita una quantitat considerable de posici-
ons, ja que només s’ocuparà una part de la matriu (per sota o per sobre de la
diagonal principal). L’expressió anterior per a estimar el càlcul del nombre
d’arestes que un graf no dirigit ha de tenir per a ser considerat dens és molt
precisa, però es pot simplificar amb |A| = |V|2/2, és a dir, la meitat del nombre
d’arestes que pot tenir un graf dirigit dens; ja que en un graf no dirigit entre
dos vèrtexs qualssevol només hi pot haver una aresta, mentre que en un de
dirigit, n’hi pot haver un parell: una en cada direcció.
Les implementacions de grafs per matrius d’adjacència –com la que hem vist
en el subapartat anterior– requereixen una estructura de dades de mida |D| ×
|D|, o amb una implementació compacta, de |V| × |V|. Per exemple, en el cas
de relacions de “préstec d’apunts” entre els estudiants d’una classe de 30 alum-
nes, hauríem d’utilitzar una estructura de 30 × 30 = 900 posicions per a allotjar
totes les possibles arestes dins del graf dirigit resultant. En la pràctica, això so-
vint redueix molt l’eficiència en espai de memòria, ja que hi ha un gran nom-
bre de posicions de la matriu que estan buides, perquè molts grafs són
esparsos, és a dir, tenen una proporció relativament baixa d’arestes respecte a
totes les possibles.
© FUOC • PID_00161974 • Mòdul 8 23 Grafs
Considerant el mateix graf que vam posar com a exemple anteriorment, la re-
presentació quedaria com mostra la figura 10.
Figura 10
L’estructura que emmagatzema els vèrtexs pot ser ordenada o no, i les pròpies
llistes també. Per exemple, si la llista de vèrtexs i les llistes d’adjacència estan
totes ordenades, l’operació de buscar un vèrtex en el graf ocuparia un temps
O(log |V|) + O(max(|adjacents(vi)|)), si considerem que adjacents(vi) és el con-
junt de vèrtexs adjacents al vèrtex vi. Això resulta en el fet que la recerca d’una
aresta té una complexitat superior a O(1) però inferior a O(|A|).
© FUOC • PID_00161974 • Mòdul 8 24 Grafs
L’ús de llistes per a emmagatzemar les arestes es pot substituir per altres estruc-
tures que proporcionin un accés més eficient en alguns casos, com seria, per
exemple, un arbre AVL.
Activitat
Plantegeu un esquema de com es duria a terme aquesta implementació, i analitzeu-ne els
principals avantatges des del punt de vista de l’eficiència.
© FUOC • PID_00161974 • Mòdul 8 25 Grafs
Una vegada que un alumne supera una assignatura, aquesta passa a formar
part del seu expedient acadèmic, juntament amb la qualificació que ha obtin-
gut. Els professors de l’acadèmia, que són pocs (un nombre P estable encara
que desconegut), imparteixen un nombre petit (NA) d’assignatures. Els do-
cents sempre imparteixen les mateixes assignatures, sense deixar-ne cap ni in-
corporar-ne de noves. En el TAD s’ha d’emmagatzemar quines assignatures
imparteix cada professor, tenint en compte que cada semestre s’ha d’actualit-
zar aquesta dada, ja que sí que es poden produir baixes d’alguns professors i
noves incorporacions.
• Tenim les assignatures A1, A2, A3, A4, i A5 en què la A1 és clau de A2 i A3 (és
a dir, no es poden cursar ni A2 ni A3 sense aprovar abans A1). Al seu torn, A2
i A3 són clau de A4, i A4 és clau de A5. Totes les assignatures tenen 3,5 crèdits,
menys A5 que en té 6.
1) Les operacions de consulta han de ser tan ràpides com sigui possible.
2) Les operacions d’inserció no han de ser innecessàriament lentes.
3) No s’ha de malbaratar espai.
Per a resoldre aquest cas es parteix d’una anàlisi tant de les restriccions de
la quantitat d’elements que cal emmagatzemar en cada part de l’estructura,
com del tipus de relacions que es donen entre els elements del domini i dels
tipus d’operacions que s’hi poden fer, i també de l’eficiència que s’espera
de l’estructura.
Com s’especifica en l’enunciat, per a cursar una assignatura pot ser que calgui
haver-ne aprovat una altra o més. Això indica que les assignatures de la titulació
conformen un graf dirigit. És molt probable que el graf conformat no sigui dens,
per la qual cosa la implementació més adequada per al graf serà una llista d’ad-
jacència. Cada vèrtex emmagatzemarà el nom i els crèdits d’una assignatura.
Activitat
Es deixa com a exercici la descripció de l’algorisme pel qual un alumne es matricula d’una
assignatura i el càlcul de la seva eficiència.
© FUOC • PID_00161974 • Mòdul 8 27 Grafs
El nombre d’alumnes és elevat i desconegut i, atès que les consultes han de ser
tan ràpides com sigui possible, hi ha dues possibilitats per a emmagatzemar-
los: una taula de dispersió, que es descarta en no conèixer el nombre exacte
d’alumnes, i un arbre AVL, que serà l’estructura que farem servir. L’arbre està
ordenat pel nom i els cognoms dels alumnes. Cada alumne ha de mantenir un
apuntador a un contenidor amb les assignatures matriculades. Com que no se-
ran gaires i el nombre és estimable, es pot optar per implementar una llista se-
qüencial afitada. El mateix, i pels mateixos motius, passarà amb les assignatures
ja aprovades.
El nombre de docents és desconegut, però estable i petit. Per això, s’opta per
implementar un contenidor de tipus llista seqüencial afitada. Cada docent
mantindrà un apuntador a un altre contenidor en què s’emmagatzema una re-
ferència a les assignatures que imparteix. Com que, altre cop, les assignatures
són poques, es poden emmagatzemar en una llista afitada seqüencial.
Figura 11
Activitat
Resum
En aquest mòdul, s’ha descrit el tipus abstracte de dades Graf com una represen-
tació general de relacions binàries entre elements d’un domini. Els elements
d’aquest domini es representen mitjançant vèrtexs (o nodes) amb una informa-
ció associada, i les relacions es representen mitjançant arestes (o arcs) que asso-
cien o igualen en tots dos sentits. Per exemple, la relació esGermaDe. Això no
obstant, en els grafs dirigits, entre cada parell de nodes hi poden haver zero, una
o dues arestes. Per exemple, la relació esClientDe entre dues empreses.
Exercicis d’autoavaluació
1. Quines diferències, en les estructures de dades, tenen la implementació amb llistes d’ad-
jacència d’un graf dirigit i d’un de no dirigit?
3. Si tenim un graf no dirigit bipartit que representa les regions d’Espanya, i volem represen-
tar com a arestes la relació “fa frontera amb”, quin serà el percentatge de posicions ocupa-
des si implementem el graf amb una matriu d’adjacència?
4. Implementeu en Java una matriu d’adjacència per a un graf amb nodes en el domini d’un
rang dels enters que comencen en 1. El rang d’enters representat serà un paràmetre del
constructor. Resoleu l’exercici implementant les interfícies corresponents de la biblioteca
de TAD de l’assignatura.
5. Suposem que tenim un graf que representa la distància entre ciutats dins d’un país.
a) El viatger A vol saber el camí òptim entre dues ciutats, X i Y, segons la ràtio entre la
distància i el preu total del viatge. Cada connexió entre ciutats té un preu determinat, que
és el que s'utilitza per a calcular el preu total d’un viatge.
b) El viatger B també vol saber el camí òptim entre dues ciutats, X i Y, però en aquest cas,
segons la menor distància, i només en cas que hi hagi més d’un camí amb la mateixa dis-
tància, considera el preu, i lògicament prefereix el camí de menys cost d’entre els d’igual
distància.
Implementeu els algorismes que resolen els dubtes dels viatgers A i B, i calculeu la seva Consulteu els materials de
l’assignatura Grafs i complexitat per
eficiència temporal asimptòtica. repassar els algorismes de recorreguts
de grafs.
6. La disciplina d’anàlisi de xarxes socials (AXS) estudia, entre altres coses, les relacions de
centralitat de la xarxa i dels individus (actors) dins de la xarxa social d’una organització o
situació determinada. Les relacions socials entre individus es representen com a arestes no
valorades, i els actors com a vèrtexs dins d’un graf. La centralitat s’estima amb mesures
com les següents:
a) Centralitat en l’actor, c(A), definida com el nombre de connexions socials de l’actor A,
normalitzada en l’interval [0,1]. És a dir, per a un actor determinat, es compten les seves
relacions socials i, posteriorment, es divideixen pel total de relacions totals en el graf, i
dóna com a resultat un nombre entre 0 i 1, que indica la quantitat relativa de relacions
socials en les quals l’individu pren part.
b) Centralitat en el grup. Es tracta d’una magnitud única per a tot el grup o conjunt de tots
els actors, definida com:
CG =
∑ V
[max[ c( vi )] − c( vi )]
,
max[ c( vi )]
−1
⎡ ⎤
CC(a) = ⎢ ∑ d(a, vi )⎥ ,
⎣V ⎦
en què d(a,vi) és la distància entre l’actor a i l’actor vi, entenent per distància la longitud
del camí mínim entre a i vi.
Implementeu les tres operacions definides utilitzant la biblioteca de TAD descrita, i ana-
litzeu-ne l’eficiència temporal asimptòtica.
Glossari
aresta f Enllaç que uneix dos vèrtexs del graf. Representa algun tipus de vincle entre tots dos
nodes.
graf m Tipus abstracte de dades que representa un conjunt d’elements d’informació o vèr-
texs, i un conjunt de relacions binàries entre aquests elements d’informació, denominats
arestes.
graf bipartit m Tipus de graf en què les relacions entre els vèrtexs inclouen un element de
cada un de dos conjunts que conformen una partició del conjunt de vèrtexs.
graf valorat m Tipus de graf en què cada aresta té associada una informació, que es deno-
mina habitualment pes.
vèrtex (node) f Element d’informació en un graf del qual s’emmagatzemen les relacions
mitjançant arestes.
Bibliografia
Bibliografia bàsica
Cormen, T. H.; Leiserson C. E.; Rivest; R. L. (1990). Introduction to algorithms (cap. 5 i 23).
MIT Press.
Weiss, M. A. (2003). Data structures & problem solving using Java (2a. ed.). Upper Saddle River:
Addison Wesley. Disponible en línia:
http://www.cs.fiu.edu/~weiss
© FUOC • PID_00161974 • Mòdul 8 31 Grafs
Annex
Figura 12
Per a aconseguir aquests camins mínims s’ha d’executar l’algorisme següent. D’altra banda, en la figura 13 es mostren les fases que
executaria l’algorisme aplicat en l’exemple.
Figura 13
Per a estudiar la complexitat de l’algorisme es pot dividir en di- • Fase de marcatge, en què s’afegeix el vèrtex seleccionat a la
verses fases: solució. En tots dos casos d’implementació del graf (llistes
d’adjacència o matrius d’adjacència) s’executa en O(n), ja
que per a cada node cal realitzar aquesta operació d’afegir a
• Fase d’inicialització, en què s’inicialitza el vector amb les
la solució i excloure el vèrtex seleccionat dels no tractats.
distàncies del node de partida a la resta. Aquesta fase té un
cost temporal de O(n), essent n el nombre de nodes, tant si
• Fase de recàlcul, en què es tornen a calcular les distàncies
es realitza la implementació utilitzant llistes com matrius
tenint en compte el nou node incorporat en la solució, i
d’adjacència, ja que implica un recorregut per tots els nodes
s’actualitzen les rutes si la distància és més curta. Aquesta
del graf.
fase s’executa en O(n2) si el graf s’implementa amb una ma-
triu d’adjacència, i en O(n + a), essent a el nombre d’arestes,
• Fase de selecció, en què es tria el vèrtex més proper (amb si s’implementa amb una llista d’adjacència, ja que el càlcul
distància més curta) del que es tracta. Aquesta fase s’executa es fa acumulant a la distància que hi ha fins al vèrtex selec-
en O(n2) tant si s’utilitzen llistes com si s’utilitzen matrius cionat la distància des d’aquest fins als seus adjacents, i
d’adjacència per a implementar el graf, ja que per a cada aquesta operació es repeteix per a cada vèrtex de la solució.
node del graf cal recórrer els nodes no tractats, i buscar el
que està unit amb una distància mínima. Aquesta operació Això fa que la complexitat de l’algorisme sigui en tots dos ca-
s’ha realitzar mentre quedin vèrtexs per tractar. sos de O(n2). Ara bé, si s’aconsegueix realitzar la fase de selecció
© FUOC • PID_00161974 • Mòdul 8 33 Grafs
en temps menor de O(n2) en el cas d’utilitzar una implemen- qualsevol en O(1) i modificar el valor associat a un node en
tació amb llistes d’adjacència, es millorarà l’eficiència total de O(log n), operacions totes elles necessàries en la fase de recàl-
l’algorisme per a aquest cas. cul.
Com ja s’ha exposat, la fase de selecció consisteix a buscar D’aquesta manera, el cost de l’algorisme implementat amb
l’element més petit d’un conjunt i eliminar-lo. L’ús d’una cua llistes d’adjacència quedaria de la manera següent:
prioritària permetria tenir els elements ordenats, i si s’imple-
mentés amb un piló es podria consultar l’element més petit a • Fase d’inicialització (insercions reiterades en la cua de prio-
O(1), i eliminar l’element més petit en O(log n), amb la qual ritat): O(n log n).
cosa es podria aconseguir un cost temporal per a l’algorisme
més petit. • Fase de selecció (consultes reiterades de l’element més petit
de la cua): O(n).
En introduir una cua prioritària, cal tenir en compte que en la
fase de recàlcul es pot demanar la modificació de la distància • Fase de marcatge (eliminacions reiterades de l’element més
de qualsevol vèrtex en la cua. Perquè aquesta operació es rea- petit en la cua): O(n log n).
litzi de la manera més senzilla possible, és convenient actua-
litzar l’estructura CuaPrioritaria afegint un vector indexat per • Fase de recàlcul (examen de totes les arestes del graf i, si és
vèrtexs. Cada posició del vector ha d’apuntar al vèrtex del piló oportú, modificació d’un element de la cua): O(a log n).
(–1 si no hi és). Amb això, s’aconseguiria comprovar l’existèn-
cia d’un vèrtex en O(1), obtenir el valor associat a un node Per tot , l’algorisme adquireix un cost total de O((a + n) log n).