Graafiteoriassa graafi on abstrakti rakenne, joka edustaa objektijoukkoa yhdessä näiden objektien välisten yhteyksien kanssa. Objektien matemaattisia abstraktioita kutsutaan graafin solmuiksi (tai kulmiksi ). Solmujen välisiä parittaisia yhteyksiä kutsutaan reunoiksi (joskus myös kaariksi ). Reunat voivat olla suunnattuja tai suuntaamattomia . Kaaviot piirretään usein graafisesti esittämällä solmut pisteillä ja reunat viivoilla. [1]
Kuvaavia esimerkkejä kaavioista ovat sukupuu tai kaupungin metroverkko (katso kuvat). Sukupuussa jokainen solmu edustaa perheenjäsentä ja jokainen reuna on yhteys vanhemman ja lapsen välillä. Metroverkossa jokainen solmu edustaa metroasemaa ja jokainen reuna edustaa suoraa junayhteyttä kahden aseman välillä.
Suuntaamattomissa graafisissa solmujen väliset yhteydet on merkitty reunoilla . Reunoilla ei ole suuntaa. Kukin reuna voidaan ajaa molempiin suuntiin.
Digrafeissa reunat merkitään nuolilla viivojen sijaan , ja nuoli osoittaa niiden alusta niiden päätesolmuun. Tämä tekee selväksi, että graafin jokainen reuna voidaan kulkea vain yhteen suuntaan. [2]
Graafiteoriassa puu on erityinen graafi, joka on yhdistetty eikä sisällä suljettuja polkuja , eli syklejä , joiden pituus on suurempi tai yhtä suuri kuin 3. Kaikilla puilla kärkien lukumäärä on selvästi 1 suurempi kuin reunojen lukumäärä.
Puilla on monia käytännön käyttötarkoituksia, varsinkin tietojenkäsittelytieteessä . Monet algoritmit ohjelmoidaan puiden avulla . Esimerkiksi verkot , liikenneverkot tai sähköverkot voidaan kulkea tehokkaasti leveys- tai syvyyshakulla . Tekoäly- ja strategiapelien alalla alfabeta-haku on tärkeä. Se perustuu hakupuihin .
Ns. multigrafeissa kaksi solmua voidaan yhdistää myös useilla reunoilla [3] , mikä ei ole sallittua yksinkertaisissa graafisissa graafisissa muodoissa . Lisäksi multigrafit saavat sisältää silmukoita: reunoja, jotka johtavat samaan kärkeen, josta ne ovat peräisin. [1]
Jos solmuja yhdistää useita reunoja [3] , piirretään usein vain yksi reuna ja näiden kahden solmun välinen reunojen lukumäärä kirjoitetaan yhden reunan reunapainoksi. Esimerkissä solmujen A ja D välillä on 60 reunaa . Sen sijaan, että piirrettäisiin kaikki 60 reunaa, piirretään reuna, jonka reunapaino on 60.
Tasograafi on graafi , joka voidaan piirtää tasolle ja jossa on pisteet solmuille ja viivat reunoille siten, että mikään reuna ei leikkaa. Jokaisella tasograafilla on kaksoisgraafi . Tämä on kaavio, jossa kaavion jokainen pinta liittyy solmuun , joka sijaitsee kyseisen pinnan sisällä, ja päinvastoin. Tasograafien duaalisuus on aina molemminpuolinen, eli minkä tahansa tasograafin duaaligraafin duaaligraafi on alkuperäinen tasograafi.
Eulerin monitahoteoreema pätee tasokaavioihin, jotka usein esitetään yhtälöllä
Hypergrafeissa reuna (kutsutaan myös hyperedgeksi ) ei yhdistä vain kahta, vaan useita solmuja samanaikaisesti. Esimerkiksi hypergraafit voidaan esittää useilla tasokaavioilla , joissa on reunaindeksointi . Vähäreunaiset hypergraafit (ns. harvat graafit ) piirretään piirtämällä joukko pisteitä, jotka vastaavat huippuja, ja sitten hyperreunaan kuuluvat pisteet ympäröidään suljetulla viivalla, joka on siten osajoukko .siihen kuuluvista solmuista kaikissa solmuissa. Hypergrafeissa, joissa on useita reunoja, tämä esitys tulee kuitenkin nopeasti hämmentäväksi. On vähemmän intuitiivista, mutta selvempää esittää hypergrafia kaksiosaisena metagraafina, jossa toinen kahdesta kaksiosaisesta joukosta vastaa hypergraafin solmuja ja toinen kaksiosaisuus on asetettu hypergraafin hyperreunoihin. Näiden kahden bipartitiojoukon väliset reunat symboloivat sitten solmujen liittymistä hyperreunoihin.
Stephen Wolframin fysiikkaprojekti (katso myös: Wolfram Research and Mathematica ) fysiikan perusteiden selittämiseksi perustuu muun muassa hypergraafien sääntöavaruuteen: "Ja ainakin tietyllä likiarvolla voimme sitten sanoa, että energia liittyy aktiivisuuteen hypergrafissa, joka levittää tietoa ajan kuluessa, kun taas liikemäärä liittyy toimintaan, joka levittää tietoa avaruudessa." [4]
Graafi on järjestetty pari , joka tarkoittaa joukkoa solmuja ( kärkipisteitä , joskus kutsutaan myös kulmiksi ) ja joukkoa reunoja ( reuna /reunat , joskus kutsutaan myös kaariksi ). missä on
Lisäys "ilman useita reunoja" jätetään yleensä pois ja kaavioita, joissa on useita reunoja, kutsutaan multigrafeiksi . Lisäksi attribuutti "ohjaamaton" jätetään yleensä pois ja vain suunnatut graafit merkitään eksplisiittisesti. Suuntaamattomia kuvaajia, joissa ei ole useita reunoja, kutsutaan usein myös tavallisiksi tai yksinkertaisiksi . Suunnattujen graafien toinen nimi on digraph (suunnattu graafi).
Sen sijaan , että tunnistaisit graafin kärkijoukot ja reunat symboleilla ja , voidaan myös määritellä yleisiä karttoja , jotka kuvaavat graafin sen kärkijoukkoon tai reunaan. Kahdelle kaaviolle ja merkitse ja sekä ja .
Epäselvyys ja hyväksytään tällä merkinnällä, vaikka kuvaukset edustavat jotain muuta kuin niihin liittyvää solmu- ja reunajoukkoa. Käytännössä on suositeltavaa merkitä solmujen tai reunojen joukko argumentin kanssa tai ilman , tai määritetyt kuvaukset argumentilla.
Jos on graafi, niin sanotaan yleensä olevan solmu tai kärki , jos kuuluu . Reunat merkitään myös nimellä
Suuntaamattomassa reunassa merkitsemme ja -kohdan loppusolmuina . Suunnatussa reunassa kutsumme aloitussolmua ja loppusolmua . _ _
Multigraphs tarkoittaa moninkertaisuutta . _ Tarvittaessa puhutaan moni- tai monireunasta .
Jos suunnattujen graafien reunalla on muoto , sitä kutsutaan silmukaksi . Jos monigraafin silmukka on myös monireuna , sitä kutsutaan monisilmukaksi . Suunnattuja kaavioita ilman silmukoita kutsutaan silmukattomiksi tai silmukattomiksi .
Graafin solmujen lukumäärä on sen solmujen lukumäärä ja reunojen määrä sen reunojen lukumäärä (multigrafeissa yksi summautuu reunojen moninaisuuteen).
Kahta solmua kutsutaan vierekkäisiksi , jos reuna yhdistää ne.
Jos reuna yhdistää kaksi solmua suunnatussa graafissa ja reuna yhdistää samat solmut vastakkaiseen suuntaan, voidaan myös pitää molempia yhdessä suuntaamattomana reunana suunnatussa graafissa. Jos särmiä on useita, molempien reunojen kertoimien on vastattava toisiaan.
Jos suunnatun graafin jokaisella reunalla on tällainen vastakkainen reuna graafissa, niin se on symmetrinen graafi .
Graafia, jonka solmujoukko on äärellinen, kutsutaan äärelliseksi graafiksi . Sitä vastoin graafia, jonka solmujoukko on ääretön, kutsutaan äärettömäksi graafiksi . Yleensä otetaan huomioon vain äärelliset graafit ja siksi jätetään pois attribuutti "finite", kun taas äärettömät graafit merkitään eksplisiittisesti.
Graafin aligraafi sisältää vain solmut ja reunat, jotka myös sisältyvät . Solmujoukosta U indusoitu aligraafi sisältää U :n solmut ja kaikki G :n reunat näiden solmujen välillä.
Pareittain erillisten solmujen sarjaa , jossa peräkkäiset solmut ja graafissa on yhdistetty reunalla, kutsutaan poluksi , joskus myös poluksi . Jos , ja tämä on ainoa kaksoissolmu, sitä kutsutaan sykliksi tai ympyräksi . Vierekkäisten solmujen sekvenssiä, jossa solmut saavat toistaa, kutsutaan reunasekvenssiksi . Käsitteet tie, polku, reunasekvenssi, ympyrä ja sykli on joskus määritelty kirjallisuudessa eri tavalla.
Jos suunnattu graafi ei sisällä sykliä, sitä kutsutaan asykliseksi tai syklittömäksi – eli suunnatuksi asykliseksi graafiksi ( DAG, suunnattu asyklinen graafi ). Tällainen graafi voidaan laajentaa (äärelliseen ja diskreettiin) osittaiseen järjestykseen lisäämällä poluiksi kaikki reunat, joilla on samat aloitus- ja loppusolmut , eli lyhentämällä kiertoteitä muiden reunojen kautta kohdesolmuun . Tätä prosessia kutsutaan transitiivisen sulkeutumisen muodostukseksi . Hasse - kaavio on suunnattu asyklinen graafi, jossa transitiivisuuden lain mukaan implisiittiset reunat jätetään pois ( transitiivinen vähennys ).
Graafin ominaisuuksia tarkasteltaessa käy usein niin, että graafiin joutuu soveltamaan yksinkertaisia operaatioita voidakseen kirjoittaa mahdollisimman tiiviisti ja siten helpommin ymmärrettävästi. Joukkoteorian tavanomaisia operaatioita (liitto, leikkaus, ero ja komplementti) sovelletaan erityisen usein graafien solmujoukkoon tai reunoihin, jolloin ne määritellään suoraan graafissa.
Ovat ja kuvaajat ovat samaa tyyppiä , niin merkitty
Huomaa joukon ja monijoukon termien liitto ja ero erilaiset määritelmät . Kirjoitat myös lyhennettynä
Reunojen supistuminen ja komplementtigraafin muodostaminen ovat muita perustoimintoja.
Suuntaamattomat graafit ilman useita reunoja ovat hypergraafien erikoistapauksia. Multigrafit, joissa ei esiinny useita reunoja, eivät ole muodollisesti vastaavia graafien kanssa, joissa ei ole useita reunoja, mutta ne ovat deskriptiivisesti ekvivalentteja, minkä vuoksi niitä kutsutaan myös graafiksi ilman useita reunoja. Kahden muunnelman välillä on bijektiivinen kartoitus. Tässä mielessä graafit ilman useita reunoja ovat erikoistapauksia graafista, jossa on useita reunoja. Vastaavasti suuntaamattomat graafit ovat tietyssä mielessä suunnattujen graafien erikoistapauksia. Jos suunnattu graafi on symmetrinen ja ilman silmukoita, sitä kutsutaan myös suuntaamattomaksi , koska näiden kahden muunnelman välillä on myös yksinkertainen yksi-yhteen osoitus (katso myös viereisyysmatriisi ).
Tietenkin on myös mahdollista määritellä ohjaamattomia graafeja silmukoilla, jolloin ne on luultavasti helpoimmin määritelty suunnattujen graafien (muodollisiksi) erikoistapauksiksi ja silmukattomuuden ehto jätetään pois. Tällaiset graafit ovat kuitenkin harvoin graafiteorian harkinnan kohteena.
Yleisin graafityyppi on suunnattu hypergraafi , jossa on useita reunoja. Jokaista edellä määriteltyä kaaviotyyppiä voidaan sitten pitää tämän erikoistapauksena. Tällaisia graafisia graafisia piirteitä ei kuitenkaan juuri koskaan tarkastella graafiteoriassa, minkä vuoksi niitä ei selitetä tässä tarkemmin.
Jos kaavioiden on tarkoitus toimia tosiasian esityksenä, tarvitaan algoritmeja, joita tarvitaan kaavioiden piirtämiseen . Tämä tietojenkäsittelytieteen tieteenala on edelleen kehittynyt viime vuosina ja tarjoaa ratkaisuja erilaisiin graafiin perustuviin visualisointeihin.
Kaavioita voidaan täydentää lisäominaisuuksilla tai tiedoilla.
Graafeiden laajennus solmuvärisiin kaavioihin saadaan täydentämällä monikko muodostamaan kolminkertainen . on kartoitus luonnollisten lukujen joukkoon . On selvää, että jokaiselle solmulle on annettu väri.
Solmujen sijasta voidaan myös värjätä graafien reunat ilman useita reunoja ja hypergrafeissa ja sitten puhua reunavärisestä graafista . Tätä varten myös monikko laajennetaan kolmiosaiseksi , mutta missä on kartoitus numerosta (sen sijaan ) luonnollisten lukujen joukkoon . On selvää, että jokaiselle reunalle on annettu väri. Periaatteessa tämä on mahdollista myös monireunaisissa kaavioissa, mutta sitä on vaikeampi määritellä, varsinkin jos useille reunuksille on määrä antaa useita eri värejä niiden moninkertaisuuden mukaan.
Huomaa, että termeillä "värjätä" ja "värjätä" on myös tarkempi merkitys graafiteoriassa. Täsmälleen yksi puhuu kelvollista väritystä , mutta yleensä jättää pois attribuutin "valid".
Vastaavasti on olemassa myös nimettyjä kaavioita , joissa solmuilla ja/tai reunoilla on nimi, ja kuvaukset tai solmut tai reunat antavat nimen. Aiemmin esitetyt esimerkit ovat nimettyjä kaavioita, joissa solmut on nimetty kirjaimilla. Tämä tehdään usein visualisoinneilla, jotta kaaviosta voidaan keskustella paremmin.
Solmu- tai reunavärillisten graafien sijaan puhutaan solmu- tai reunapainotetuista graafista, jos ne kartoitetaan luonnollisiin lukuihin, vaan ne kartoitetaan todellisiin lukuihin . Solmu- tai reunaväriset graafit ovat siksi solmu- tai reunapainotettujen graafien erikoistapauksia.
Kutsumme tai myös solmun tai reunan painoa . Erottamiseksi puhutaan myös solmun painosta tai reunapainosta . Tällainen painotus tulee välttämättömäksi, kun tiedot solmusuhteista ovat riittämättömiä. Jos esimerkiksi tieverkostoa tarkastellaan (yksinkertaistettuna) graafina (paikat ovat solmuja, paikkoja yhdistävät kadut ovat reunoja), reunojen painotus voisi antaa tietoa kahden paikan välisestä etäisyydestä. Graafin reunapainot voidaan kerätä neliöpainomatriisiin, viereisyysmatriisiin .
Lopuksi voidaan myös määritellä kuvaajien välisiä kartoituksia. Erityisen kiinnostavia ovat ne, jotka ovat yhteensopivia näiden kahden rakenteen kanssa , niin kutsutut "homomorfismit" .
Olkoon ja samantyyppisiä kuvaajia. Kartoitusta kutsutaan homomorfismiksi välillä ja jos :
Kuva p ( G1 ) on tällöin G2 : n osagraafi . Jos p on käännettävä ja käänteisfunktio on myös homomorfismi, niin p on graafien isomorfismi .
Huomaa, että kärjet ovat etusijalla reunoihin nähden määrittämällä p funktiona vain kärkipisteille , mikä vaikuttaa vain reunoihin.
Yksinkertaisten suuntaamattomien graafien, joissa on solmuja , määrä kasvaa nopeasti solmujen määrän myötä ja on yhtä suuri kuin . Joten se kasvaa eksponentiaalisesti koko graafin reunojen lukumäärän mukaan . Jos solmuja ei ole numeroitu, eli isomorfisia graafeja ei lasketa, tämä luku on likimäärin verrannollinen , koska useimmissa isomorfismiluokissa kaikki numeroitujen solmujen permutaatiosta johtuvat graafit ovat erilaisia. Alla oleva taulukko näyttää tietokoneen käytön tietyt numerot : [6]
Yksinkertaisten suuntaamattomien kaavioiden lukumäärä | ||
---|---|---|
n | numeroiduilla solmuilla | ilman numeroituja solmuja |
1 | 1 | 1 |
2 | 2 | 2 |
3 | 8 | 4 |
4 | 64 | 11 |
5 | 1,024 | 34 |
6 | 32,768 | 156 |
7 | 2 097 152 | 1,044 |
8 | 268.435.456 | 12,346 |
Suuntaamaton kaavio | viereisyysmatriisi |
---|---|
![]() |
Graafeiden esittämiseen tietokoneessa on olennaisesti kaksi yleistä muotoa : viereisyysmatriisi (myös naapurimatriisi) ja viereisyysluettelo (naapuriluettelo). Kahden esityksen tärkeys piilee siinä, että käytännössä jokainen graafiteoreettisten ongelmien algoritminen ratkaisu pätee ainakin toiseen kahdesta esityksestä. Toinen, mutta harvemmin käytetty tapa esittää kuvaajia tietokoneessa on esiintymismatriisi , joka tunnetaan myös solmureunamatriisina.
Vaikka esiintymismatriisit ovat kalliimpia toteuttaa ja ylläpitää, ne tarjoavat joukon etuja viereisyysmatriiseihin verrattuna. Toisaalta kiinteällä määrällä reunoja ne vievät aina vain lineaarisen määrän tallennustilaa suhteessa solmujen määrään, mikä on erityisen edullista ohuille graafiille (eli graafiille, joissa on vähän reunaa), kun taas vierekkäisyysmatriisi vaatii neliötilaa suhteessa solmujen määrään (mutta on kompaktimpi tiheissä graafisissa eli monireunaisissa graafisissa). Toisaalta monet graafiteoreettiset ongelmat voidaan ratkaista vain vierekkäisyyslistoilla lineaarisessa ajassa . Käytännössä siis yleensä käytetään tätä esitystapaa.
Seuraava esimerkki C++- ohjelmointikielellä näyttää ohjatun graafin toteutuksen vierekkäisyysluetteloilla . Suunnattu graafi ilmoitetaan DirectedGraph - luokaksi . Päämenetelmää käytetään ohjelmaa suoritettaessa . [7]
#include <iostream>
käyttäen nimiavaruutta std ;
// Ilmoittaa datatyypin
graafirakenteen Solmu solmuille
{
int indeksi ;
merkkijonoarvot ; _
solmu * seuraava ;
};
// Ilmoita tietotyyppi
graafirakenteen Edge reunuksille
{
int aloitushakemisto ;
int endIndex ;
};
// Ilmoita ohjatun graafin
luokan DirectedGraph luokka
{
julkinen :
solmu ** headNode ;
// Tämä menetelmä lisää uuden solmun graafin viereisyysluetteloon ja palauttaa sen palautusarvona
Node * insertNewNode ( int index , string value , Node * node )
{
Node * newNode = uusi solmu ; // Luo uuden solmun tyyppiä Node newNode -> index = index ; // asettaa indeksin newNode -> arvo = arvo ; // asettaa arvon newNode -> next = node ; // asettaa osoittimen seuraajalle return newNode ;
}
// konstruktori, joka luo suunnatun graafin annetuilla solmuilla ja reunoilla
DirectedGraph ( Solmusolmut [ ], Edge edges [], int numberOfEdges , int numberOfNodes )
{
headNode = uusi solmu * [ numberOfNodes ](); // alustaa osoittimien joukon solmuja varten ( int i = 0 ; i < numberOfEdges ; i ++ ) // silmukan iterointia varten graafin kaikkien reunojen yli {
int startIndex = reunat [ i ]. startIndex ; // Reunan aloitussolmun indeksi int endIndex = reunat [ i ]. endIndex ; // Reunamerkkijonon loppusolmun indeksi = solmut [ endIndex ] . arvot ; // reunan loppusolmun arvo Solmu * newNode = insertNewNode ( endIndex , value , headNode [ startIndex ]);
// kutsua insertNewNode-metodi lisätäksesi uuden solmun
headNode [ startIndex ] = newNode ; // asettaa osoittimen uuteen solmuun }
}
};
// tulostaa konsolin kaikki vierekkäiset solmun solmut
void writeAdjacencyList ( Node * node , int i )
{
cout << "solmu" << ( i + 1 ) << ":" ;
while ( solmu != nullptr )
{
cout << "(" << solmu -> indeksi << ", " << solmu -> arvo << ")" ;
solmu = solmu -> seuraava ;
}
cout << endl ;
}
// päämenetelmä, joka suorittaa ohjelman
int main ()
{
// Ilmoittaa ja alustaa taulukot solmuille ja reunoille
Solmusolmut [ ] = { { 0 , "A" },{ 1 , "B" },{ 2 , "C" },{ 3 , "D" },{ 4 , "E" } };
Reunareunat [ ] = { { 0 , 1 }, { 0 , 2 }, { 1 , 4 }, { 2 , 3 }, { 3 , 1 }, { 4 , 3 } };
int numberOfNodes = koko ( solmut ) / koko ( solmut [ 0 ]); // Hanki solmujen lukumäärä int numberOfEdges = sizeof ( reunat ) / sizeof ( reunat [ 0 ]); // Hae reunojen lukumäärä DirectedGraph directedGraph ( solmut , reunat , numberOfEdges , numberOfNodes ); // Luo suunnatun graafin annetuilla pisteillä ja reunoilla
for ( int i = 0 ; i < numberOfNodes ; i ++ ) // silmukan iterointiin graafin kaikkien solmujen läpi {
Node * headNode = suunnattuGraph . headNode [ i ];
writeAdjacencyList ( headNode , i ); // tulostaa solmun headNode viereisyysluettelon }
}