logo

Python-tietorakenteet

Tietorakenteet ovat tapa järjestää tietoja niin, että niitä voidaan käyttää tehokkaammin tilanteesta riippuen. Tietorakenteet ovat minkä tahansa ohjelmointikielen perusta, jonka ympärille ohjelma rakennetaan. Python auttaa oppimaan näiden tietorakenteiden perusteet yksinkertaisemmalla tavalla muihin ohjelmointikieliin verrattuna.

Python-tietorakenteet

Tässä artikkelissa keskustelemme Python-ohjelmointikielen tietorakenteista ja siitä, miten ne liittyvät joihinkin tiettyihin sisäänrakennettuihin tietorakenteisiin, kuten listatupleihin, sanakirjoihin jne., sekä joihinkin edistyneisiin tietorakenteisiin, kuten puihin, kaavioihin jne.



Luettelot

Python-listat ovat aivan kuten taulukot, ilmoitettu muilla kielillä, mikä on järjestetty datakokoelma. Se on erittäin joustava, koska luettelon kohteiden ei tarvitse olla samaa tyyppiä.

Python Listin toteutus on samanlainen kuin Vectors C++:ssa tai ArrayList JAVA:ssa. Kallis toiminto on elementin lisääminen tai poistaminen luettelon alusta, koska kaikkia elementtejä on siirrettävä. Listan lopusta lisääminen ja poistaminen voi myös tulla kalliiksi, jos esivarattu muisti täyttyy.

Voimme luoda luettelon pythonissa alla olevan kuvan mukaisesti.

Esimerkki: Python-luettelon luominen

Python 3




List> => [>1>,>2>,>3>,>'GFG'>,>2.3>]> print>(>List>)>

>

>

Lähtö

[1, 2, 3, 'GFG', 2.3]>

Luettelon elementtejä voi käyttää määritetyllä indeksillä. Listan python-aloitusindeksissä sekvenssi on 0 ja loppuindeksi (jos siinä on N elementtiä) N-1.

python-list-slicing

Esimerkki: Python List Operations

Python 3




# Creating a List with> # the use of multiple values> List> => [>'Geeks'>,>'For'>,>'Geeks'>]> print>(>' List containing multiple values: '>)> print>(>List>)> # Creating a Multi-Dimensional List> # (By Nesting a list inside a List)> List2>=> [[>'Geeks'>,>'For'>], [>'Geeks'>]]> print>(>' Multi-Dimensional List: '>)> print>(List2)> # accessing a element from the> # list using index number> print>(>'Accessing element from the list'>)> print>(>List>[>0>])> print>(>List>[>2>])> # accessing a element using> # negative indexing> print>(>'Accessing element using negative indexing'>)> > # print the last element of list> print>(>List>[>->1>])> > # print the third last element of list> print>(>List>[>->3>])>

>

koneella päivämäärä ja aika
>

Lähtö

List containing multiple values: ['Geeks', 'For', 'Geeks'] Multi-Dimensional List: [['Geeks', 'For'], ['Geeks']] Accessing element from the list Geeks Geeks Accessing element using negative indexing Geeks Geeks>

Sanakirja

Python-sanakirja on kuin hash-taulukot missä tahansa muussa kielessä, jonka aikamonimutkaisuus on O(1). Se on järjestämätön tietoarvojen kokoelma, jota käytetään data-arvojen, kuten kartan, tallentamiseen. Sanakirja sisältää avain:arvo-parin, toisin kuin muut tietotyypit, joissa on vain yksi arvo elementtinä. Avainarvo on annettu sanakirjassa, jotta se olisi optimoitu.

Python-sanakirjan indeksointi tapahtuu avainten avulla. Nämä ovat mitä tahansa tiivistettävää tyyppiä eli objekteja, jotka eivät voi koskaan muuttua, kuten merkkijonot, numerot, monikot jne. Voimme luoda sanakirjan käyttämällä kiharaa aaltosuluja ({}) tai sanakirjan ymmärtäminen .

Esimerkki: Python-sanakirjatoiminnot

Python 3




# Creating a Dictionary> Dict> => {>'Name'>:>'Geeks'>,>1>: [>1>,>2>,>3>,>4>]}> print>(>'Creating Dictionary: '>)> print>(>Dict>)> # accessing a element using key> print>(>'Accessing a element using key:'>)> print>(>Dict>[>'Name'>])> # accessing a element using get()> # method> print>(>'Accessing a element using get:'>)> print>(>Dict>.get(>1>))> # creation using Dictionary comprehension> myDict>=> {x: x>*>*>2> for> x>in> [>1>,>2>,>3>,>4>,>5>]}> print>(myDict)>

>

>

Lähtö

Creating Dictionary: {'Name': 'Geeks', 1: [1, 2, 3, 4]} Accessing a element using key: Geeks Accessing a element using get: [1, 2, 3, 4] {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}>

Tuple

Python Tuple on kokoelma Python-objekteja, kuten luettelo, mutta monikot ovat luonteeltaan muuttumattomia, eli monikossa olevia elementtejä ei voi lisätä tai poistaa luomisen jälkeen. Kuten luettelo, myös Tuple voi sisältää erityyppisiä elementtejä.

Pythonissa monikot luodaan sijoittamalla arvosarja, joka on erotettu 'pilkulla' joko sulkuilla tai ilman datasekvenssin ryhmittelyä.

Huomautus: Tuples voidaan luoda myös yhdestä elementistä, mutta se on hieman hankalaa. Yksi elementti sulkeissa ei riitä, vaan sen lopussa on oltava pilkku, jotta siitä tulee monikko.

Esimerkki: Python Tuple Operations

Python 3




# Creating a Tuple with> # the use of Strings> Tuple> => (>'Geeks'>,>'For'>)> print>(>' Tuple with the use of String: '>)> print>(>Tuple>)> > # Creating a Tuple with> # the use of list> list1>=> [>1>,>2>,>4>,>5>,>6>]> print>(>' Tuple using List: '>)> Tuple> => tuple>(list1)> # Accessing element using indexing> print>(>'First element of tuple'>)> print>(>Tuple>[>0>])> # Accessing element from last> # negative indexing> print>(>' Last element of tuple'>)> print>(>Tuple>[>->1>])> > print>(>' Third last element of tuple'>)> print>(>Tuple>[>->3>])>

>

>

Lähtö

Tuple with the use of String: ('Geeks', 'For') Tuple using List: First element of tuple 1 Last element of tuple 6 Third last element of tuple 4>

Aseta

Python-sarja on järjestämätön kokoelma dataa, joka on muuttuva ja joka ei salli päällekkäisiä elementtejä. Sarjoja käytetään periaatteessa jäsentestaukseen ja päällekkäisten merkintöjen poistamiseen. Tässä käytetty tietorakenne on Hashing, suosittu tekniikka lisätä, poistaa ja kulkea keskimäärin O(1):ssä.

Jos samassa indeksikohdassa on useita arvoja, arvo liitetään kyseiseen indeksipaikkaan linkitettyjen listan muodostamiseksi. Vuonna CPython Sets on toteutettu käyttämällä sanakirjaa, jossa on valemuuttujia, joissa avainolennot jäsenet asettavat suuremmilla optimoinnilla ajan monimutkaisuuteen.

Aseta toteutus:

Sarjan sisäinen toiminta

Sarjat, joissa on useita toimintoja yhdessä hash-taulukossa:

Sarjan sisäinen toiminta

Esimerkki: Python Set Operations

Python 3




# Creating a Set with> # a mixed type of values> # (Having numbers and strings)> Set> => set>([>1>,>2>,>'Geeks'>,>4>,>'For'>,>6>,>'Geeks'>])> print>(>' Set with the use of Mixed Values'>)> print>(>Set>)> # Accessing element using> # for loop> print>(>' Elements of set: '>)> for> i>in> Set>:> >print>(i, end>=>' '>)> print>()> # Checking the element> # using in keyword> print>(>'Geeks'> in> Set>)>

>

>

Lähtö

Set with the use of Mixed Values {1, 2, 'Geeks', 4, 6, 'For'} Elements of set: 1 2 Geeks 4 6 For True>

Jäädytetyt sarjat

Pythonin jäädytetyt joukot ovat muuttumattomia objekteja, jotka tukevat vain menetelmiä ja operaattoreita, jotka tuottavat tuloksen vaikuttamatta jäädytettyyn joukkoon tai sarjoihin, joihin niitä käytetään. Vaikka joukon elementtejä voidaan muokata milloin tahansa, jäädytetyn joukon elementit pysyvät samoina luomisen jälkeen.

Jos parametreja ei välitetä, se palauttaa tyhjän jäädytetyn joukon.

Python 3




# Same as {'a', 'b','c'}> normal_set>=> set>([>'a'>,>'b'>,>'c'>])> print>(>'Normal Set'>)> print>(normal_set)> # A frozen set> frozen_set>=> frozenset>([>'e'>,>'f'>,>'g'>])> print>(>' Frozen Set'>)> print>(frozen_set)> # Uncommenting below line would cause error as> # we are trying to add element to a frozen set> # frozen_set.add('h')>

>

>

Lähtö

Normal Set {'a', 'c', 'b'} Frozen Set frozenset({'g', 'e', 'f'})>

merkkijono

Python-merkkijonot ovat Unicode-merkkejä edustavia tavutaulukoita. Yksinkertaisemmin sanottuna merkkijono on muuttumaton merkkijono. Pythonilla ei ole merkkitietotyyppiä, yksi merkki on yksinkertaisesti merkkijono, jonka pituus on 1.

Huomautus: Koska merkkijonot ovat muuttumattomia, merkkijonon muokkaaminen johtaa uuden kopion luomiseen.

jouset

Esimerkki: Python-merkkijonotoiminnot

Python 3




String>=> 'Welcome to GeeksForGeeks'> print>(>'Creating String: '>)> print>(String)> > # Printing First character> print>(>' First character of String is: '>)> print>(String[>0>])> > # Printing Last character> print>(>' Last character of String is: '>)> print>(String[>->1>])>

>

>

Lähtö

Creating String: Welcome to GeeksForGeeks First character of String is: W Last character of String is: s>

Bytearray

Python Bytearray antaa muuttuvan kokonaislukujonon välillä 0 <= x < 256.

Esimerkki: Python Bytearray -toiminnot

Python 3




# Creating bytearray> a>=> bytearray((>12>,>8>,>25>,>2>))> print>(>'Creating Bytearray:'>)> print>(a)> # accessing elements> print>(>' Accessing Elements:'>, a[>1>])> # modifying elements> a[>1>]>=> 3> print>(>' After Modifying:'>)> print>(a)> # Appending elements> a.append(>30>)> print>(>' After Adding Elements:'>)> print>(a)>

>

>

Lähtö

Creating Bytearray: bytearray(b'x0cx08x19x02') Accessing Elements: 8 After Modifying: bytearray(b'x0cx03x19x02') After Adding Elements: bytearray(b'x0cx03x19x02x1e')>

Tähän mennessä olemme tutkineet kaikkia Python-ytimen sisäänrakennettuja tietorakenteita. Sukella nyt syvemmälle Pythoniin ja katso kokoelmamoduuli, joka tarjoaa joitain säiliöitä, jotka ovat hyödyllisiä monissa tapauksissa ja tarjoavat enemmän ominaisuuksia kuin yllä määritellyt toiminnot.

Kokoelmat moduuli

Python-kokoelmamoduuli otettiin käyttöön parantamaan sisäänrakennettujen tietotyyppien toimivuutta. Se tarjoaa erilaisia ​​​​säiliöitä, katsotaanpa jokainen niistä yksityiskohtaisesti.

Laskurit

Laskuri on sanakirjan alaluokka. Sitä käytetään pitämään iteroitavissa olevien elementtien lukumäärä järjestämättömän sanakirjan muodossa, jossa avain edustaa iteroitavissa olevaa elementtiä ja arvo edustaa iteroitavan elementin määrää. Tämä vastaa pussia tai muita kieliä.

Esimerkki: Python-laskuritoiminnot

Python 3




from> collections>import> Counter> > # With sequence of items> print>(Counter([>'B'>,>'B'>,>'A'>,>'B'>,>'C'>,>'A'>,>'B'>,>'B'>,>'A'>,>'C'>]))> > # with dictionary> count>=> Counter({>'A'>:>3>,>'B'>:>5>,>'C'>:>2>})> print>(count)> count.update([>'A'>,>1>])> print>(count)>

>

>

Lähtö

Counter({'B': 5, 'A': 3, 'C': 2}) Counter({'B': 5, 'A': 3, 'C': 2}) Counter({'B': 5, 'A': 4, 'C': 2, 1: 1})>

TilattuDict

An TilattuDict on myös sanakirjan alaluokka, mutta toisin kuin sanakirja, se muistaa järjestyksen, jossa avaimet lisättiin.

Esimerkki: Python OrderedDict Operations

Python 3




from> collections>import> OrderedDict> print>(>'Before deleting: '>)> od>=> OrderedDict()> od[>'a'>]>=> 1> od[>'b'>]>=> 2> od[>'c'>]>=> 3> od[>'d'>]>=> 4> for> key, value>in> od.items():> >print>(key, value)> print>(>' After deleting: '>)> od.pop(>'c'>)> for> key, value>in> od.items():> >print>(key, value)> print>(>' After re-inserting: '>)> od[>'c'>]>=> 3> for> key, value>in> od.items():> >print>(key, value)>

>

>

Lähtö

Before deleting: a 1 b 2 c 3 d 4 After deleting: a 1 b 2 d 4 After re-inserting: a 1 b 2 d 4 c 3>

OletusDict

OletusDict käytetään antamaan joitakin oletusarvoja avaimelle, jota ei ole olemassa ja joka ei koskaan aiheuta avainvirhettä. Sen objektit voidaan alustaa DefaultDict()-menetelmällä välittämällä tietotyyppi argumenttina.

Huomautus: default_factory on funktio, joka tarjoaa oletusarvon luodulle sanakirjalle. Jos tämä parametri puuttuu, KeyError nostetaan.

Esimerkki: Python DefaultDict -toiminnot

Python 3




from> collections>import> defaultdict> > # Defining the dict> d>=> defaultdict(>int>)> > L>=> [>1>,>2>,>3>,>4>,>2>,>4>,>1>,>2>]> > # Iterate through the list> # for keeping the count> for> i>in> L:> > ># The default value is 0> ># so there is no need to> ># enter the key first> >d[i]>+>=> 1> > print>(d)>

>

>

Lähtö

defaultdict(, {1: 2, 2: 3, 3: 1, 4: 2})>

Ketjukartta

ChainMap kapseloi useita sanakirjoja yhdeksi yksiköksi ja palauttaa luettelon sanakirjoista. Kun avain on löydettävä, kaikkia sanakirjoja etsitään yksitellen, kunnes avain löytyy.

Esimerkki: Python ChainMap -toiminnot

Python 3




from> collections>import> ChainMap> > > d1>=> {>'a'>:>1>,>'b'>:>2>}> d2>=> {>'c'>:>3>,>'d'>:>4>}> d3>=> {>'e'>:>5>,>'f'>:>6>}> > # Defining the chainmap> c>=> ChainMap(d1, d2, d3)> print>(c)> print>(c[>'a'>])> print>(c[>'g'>])>

>

>

Lähtö

ChainMap({'a': 1, 'b': 2}, {'c': 3, 'd': 4}, {'e': 5, 'f': 6}) 1>
KeyError: 'g'>

Nimetty Tuple

A Nimetty Tuple palauttaa monikkoobjektin, jossa on nimet jokaiselle sijainnille, joka tavallisilta monikoilta puuttuu. Ajatellaan esimerkiksi tuple names opiskelijaa, jossa ensimmäinen elementti edustaa fname, toinen edustaa lname ja kolmas elementti edustaa DOB. Oletetaan, että kutsuttaessa fname sen sijaan, että muistaisit indeksipaikan, voit itse kutsua elementtiä käyttämällä fname-argumenttia, niin tuples-elementin käyttäminen on todella helppoa. Tämän toiminnon tarjoaa NamedTuple.

Esimerkki: Python NamedTuple -toiminnot

Python 3




from> collections>import> namedtuple> > # Declaring namedtuple()> Student>=> namedtuple(>'Student'>,[>'name'>,>'age'>,>'DOB'>])> > # Adding values> S>=> Student(>'Nandini'>,>'19'>,>'2541997'>)> > # Access using index> print> (>'The Student age using index is : '>,end>=>'')> print> (S[>1>])> > # Access using name> print> (>'The Student name using keyname is : '>,end>=>'')> print> (S.name)>

>

>

Lähtö

The Student age using index is : 19 The Student name using keyname is : Nandini>

Mistä

Deque (kaksinkertainen jono) on optimoitu luettelo nopeampiin lisäys- ja pop-toimintoihin säilön molemmilta puolilta. Se tarjoaa O(1)-aikaisen monimutkaisuuden liittämis- ja pop-operaatioille verrattuna O(n)-aikaisen monimutkaisuuden luetteloon.

Python Deque on toteutettu käyttämällä kaksoislinkitettyjä listoja, joten elementtien satunnaisen käytön suorituskyky on O(n).

Esimerkki: Python Deque -toiminnot

Python 3




# importing 'collections' for deque operations> import> collections> # initializing deque> de>=> collections.deque([>1>,>2>,>3>])> # using append() to insert element at right end> # inserts 4 at the end of deque> de.append(>4>)> # printing modified deque> print>(>'The deque after appending at right is : '>)> print>(de)> # using appendleft() to insert element at left end> # inserts 6 at the beginning of deque> de.appendleft(>6>)> # printing modified deque> print>(>'The deque after appending at left is : '>)> print>(de)> # using pop() to delete element from right end> # deletes 4 from the right end of deque> de.pop()> # printing modified deque> print>(>'The deque after deleting from right is : '>)> print>(de)> # using popleft() to delete element from left end> # deletes 6 from the left end of deque> de.popleft()> # printing modified deque> print>(>'The deque after deleting from left is : '>)> print>(de)>

linkitetty lista

>

>

Lähtö

The deque after appending at right is : deque([1, 2, 3, 4]) The deque after appending at left is : deque([6, 1, 2, 3, 4]) The deque after deleting from right is : deque([6, 1, 2, 3]) The deque after deleting from left is : deque([1, 2, 3])>

UserDict

UserDict on sanakirjamainen säilö, joka toimii kääreenä sanakirjaobjektien ympärillä. Tätä säilöä käytetään, kun joku haluaa luoda oman sanakirjan, jossa on joitain muokattuja tai uusia toimintoja.

Esimerkki: Python UserDict

Python 3




from> collections>import> UserDict> # Creating a Dictionary where> # deletion is not allowed> class> MyDict(UserDict):> > ># Function to stop deletion> ># from dictionary> >def> __del__(>self>):> >raise> RuntimeError(>'Deletion not allowed'>)> > ># Function to stop pop from> ># dictionary> >def> pop(>self>, s>=> None>):> >raise> RuntimeError(>'Deletion not allowed'>)> > ># Function to stop popitem> ># from Dictionary> >def> popitem(>self>, s>=> None>):> >raise> RuntimeError(>'Deletion not allowed'>)> > # Driver's code> d>=> MyDict({>'a'>:>1>,> >'b'>:>2>,> >'c'>:>3>})> print>(>'Original Dictionary'>)> print>(d)> d.pop(>1>)>

>

>

Lähtö

Original Dictionary {'a': 1, 'b': 2, 'c': 3}>
RuntimeError: Deletion not allowed>

Käyttäjälista

UserList on luettelomainen säilö, joka toimii luetteloobjektien ympärillä olevana kääreenä. Tästä on hyötyä, kun joku haluaa luoda oman luettelonsa muokatuilla tai lisätoiminnoilla.

Esimerkkejä: Python UserList

Python 3




# Python program to demonstrate> # userlist> from> collections>import> UserList> # Creating a List where> # deletion is not allowed> class> MyList(UserList):> > ># Function to stop deletion> ># from List> >def> remove(>self>, s>=> None>):> >raise> RuntimeError(>'Deletion not allowed'>)> > ># Function to stop pop from> ># List> >def> pop(>self>, s>=> None>):> >raise> RuntimeError(>'Deletion not allowed'>)> > # Driver's code> L>=> MyList([>1>,>2>,>3>,>4>])> print>(>'Original List'>)> print>(L)> # Inserting to List'> L.append(>5>)> print>(>'After Insertion'>)> print>(L)> # Deleting From List> L.remove()>

>

>

Lähtö

Original List [1, 2, 3, 4] After Insertion [1, 2, 3, 4, 5]>
RuntimeError: Deletion not allowed>

UserString

UserString on merkkijonomainen säiliö ja aivan kuten UserDict ja UserList, se toimii kääreenä merkkijonoobjektien ympärillä. Sitä käytetään, kun joku haluaa luoda omia merkkijonoja muokatuilla tai lisätoiminnoilla.

Esimerkki: Python UserString

Python 3




from> collections>import> UserString> # Creating a Mutable String> class> Mystring(UserString):> > ># Function to append to> ># string> >def> append(>self>, s):> >self>.data>+>=> s> > ># Function to remove from> ># string> >def> remove(>self>, s):> >self>.data>=> self>.data.replace(s, '')> > # Driver's code> s1>=> Mystring(>'Geeks'>)> print>(>'Original String:'>, s1.data)> # Appending to string> s1.append(>'s'>)> print>(>'String After Appending:'>, s1.data)> # Removing from string> s1.remove(>'e'>)> print>(>'String after Removing:'>, s1.data)>

>

>

Lähtö

Original String: Geeks String After Appending: Geekss String after Removing: Gkss>

Nyt kun olet tutkinut kaikki tietorakenteet, katsotaanpa joitain edistyneitä tietorakenteita, kuten pino, jono, kaavio, linkitetty luettelo jne., joita voidaan käyttää Python-kielessä.

Linkitetty lista

Linkitetty lista on lineaarinen tietorakenne, jossa elementtejä ei ole tallennettu vierekkäisiin muistipaikkoihin. Linkitetyn luettelon elementit linkitetään osoittimilla alla olevan kuvan mukaisesti:

Linkitettyä luetteloa edustaa osoitin linkitetyn luettelon ensimmäiseen solmuun. Ensimmäistä solmua kutsutaan pääksi. Jos linkitetty lista on tyhjä, pään arvo on NULL. Jokainen listan solmu koostuu vähintään kahdesta osasta:

  • Data
  • Osoitin (tai viittaus) seuraavaan solmuun

Esimerkki: Linkitetyn luettelon määrittäminen Pythonissa

Python 3




# Node class> class> Node:> ># Function to initialize the node object> >def> __init__(>self>, data):> >self>.data>=> data># Assign data> >self>.>next> => None> # Initialize> ># next as null> # Linked List class> class> LinkedList:> > ># Function to initialize the Linked> ># List object> >def> __init__(>self>):> >self>.head>=> None>

>

>

Luodaan yksinkertainen linkitetty luettelo, jossa on 3 solmua.

Python 3




# A simple Python program to introduce a linked list> # Node class> class> Node:> ># Function to initialise the node object> >def> __init__(>self>, data):> >self>.data>=> data># Assign data> >self>.>next> => None> # Initialize next as null> # Linked List class contains a Node object> class> LinkedList:> ># Function to initialize head> >def> __init__(>self>):> >self>.head>=> None> # Code execution starts here> if> __name__>=>=>'__main__'>:> ># Start with the empty list> >list> => LinkedList()> >list>.head>=> Node(>1>)> >second>=> Node(>2>)> >third>=> Node(>3>)> >'''> >Three nodes have been created.> >We have references to these three blocks as head,> >second and third> >list.head second third> >| | |> >| | |> >+----+------+ +----+------+ +----+------+> >| 1 | None | | 2 | None | | 3 | None |> >+----+------+ +----+------+ +----+------+> >'''> >list>.head.>next> => second;># Link first node with second> >'''> >Now next of first Node refers to second. So they> >both are linked.> >list.head second third> >| | |> >| | |> >+----+------+ +----+------+ +----+------+> >| 1 | o-------->| 2 | nolla | | 3 | null |> >+----+------+ +----+------+ +----+------+> >'''> >second.>next> => third;># Link second node with the third node> >'''> >Now next of second Node refers to third. So all three> >nodes are linked.> >list.head second third> >| | |> >| | |> >+----+------+ +----+------+ +----+------+> >| 1 | o-------->| 2 | o-------->| 3 | null |> >+----+------+ +----+------+ +----+------+> >'''>

>

>

Linked List Traversal

Edellisessä ohjelmassa olemme luoneet yksinkertaisen linkitetyn luettelon, jossa on kolme solmua. Käydään läpi luotu lista ja tulostetaan kunkin solmun tiedot. Läpikulkua varten kirjoitetaan yleiskäyttöinen funktio printList(), joka tulostaa minkä tahansa listan.

Python 3




# A simple Python program for traversal of a linked list> # Node class> class> Node:> ># Function to initialise the node object> >def> __init__(>self>, data):> >self>.data>=> data># Assign data> >self>.>next> => None> # Initialize next as null> # Linked List class contains a Node object> class> LinkedList:> ># Function to initialize head> >def> __init__(>self>):> >self>.head>=> None> ># This function prints contents of linked list> ># starting from head> >def> printList(>self>):> >temp>=> self>.head> >while> (temp):> >print> (temp.data)> >temp>=> temp.>next> # Code execution starts here> if> __name__>=>=>'__main__'>:> ># Start with the empty list> >list> => LinkedList()> >list>.head>=> Node(>1>)> >second>=> Node(>2>)> >third>=> Node(>3>)> >list>.head.>next> => second;># Link first node with second> >second.>next> => third;># Link second node with the third node> >list>.printList()>

>

>

Lähtö

1 2 3>

Pino

A pino on lineaarinen tietorakenne, joka tallentaa kohteita Last-In/First-Out (LIFO) tai First-In/Last-Out (FILO) tavalla. Pinossa uusi elementti lisätään toiseen päähän ja elementti poistetaan vain siitä päästä. Lisää- ja poistotoimintoja kutsutaan usein push- ja pop-toiminnoiksi.

Pinoa pythonissa

Pinoon liittyvät toiminnot ovat:

    tyhjä() – Palauttaa onko pino tyhjä – Aika monimutkaisuus: O(1) size() – Palauttaa pinon koon – Aika monimutkaisuus: O(1) top() – Palauttaa viittauksen pinon ylimpään elementtiin – Aika monimutkaisuus: O(1) push(a) – Lisää elementin 'a' pinon yläosaan – Aika monimutkaisuus: O(1) pop() – Poistaa pinon ylimmän elementin – Aika monimutkaisuus: O( 1)

Python Stack -toteutus

Pino Pythonissa voidaan toteuttaa seuraavilla tavoilla:

  • lista
  • Collections.deque
  • jono.LifoQueue

Toteutus listalla

Pythonin sisäänrakennettua tietorakennelistaa voidaan käyttää pinona. Kommentin push() sijaan append()-funktiota käytetään lisäämään elementtejä pinon yläosaan, kun taas pop() poistaa elementin LIFO-järjestyksessä.

Python 3




stack>=> []> # append() function to push> # element in the stack> stack.append(>'g'>)> stack.append(>'f'>)> stack.append(>'g'>)> print>(>'Initial stack'>)> print>(stack)> # pop() function to pop> # element from stack in> # LIFO order> print>(>' Elements popped from stack:'>)> print>(stack.pop())> print>(stack.pop())> print>(stack.pop())> print>(>' Stack after elements are popped:'>)> print>(stack)> # uncommenting print(stack.pop())> # will cause an IndexError> # as the stack is now empty>

>

>

Lähtö

Initial stack ['g', 'f', 'g'] Elements popped from stack: g f g Stack after elements are popped: []>

Käyttöönotto collections.dequen avulla:

Python-pino voidaan toteuttaa käyttämällä deque-luokkaa kokoelmamoduulista. Deque on suositeltavampi kuin luettelo tapauksissa, joissa tarvitsemme nopeampia liite- ja pop-operaatioita säilön molemmista päistä, koska deque tarjoaa O(1)-ajan monimutkaisuuden liittämis- ja pop-operaatioille verrattuna luetteloon, joka tarjoaa O(n) aika monimutkaisuus.

Python 3




from> collections>import> deque> stack>=> deque()> # append() function to push> # element in the stack> stack.append(>'g'>)> stack.append(>'f'>)> stack.append(>'g'>)> print>(>'Initial stack:'>)> print>(stack)> # pop() function to pop> # element from stack in> # LIFO order> print>(>' Elements popped from stack:'>)> print>(stack.pop())> print>(stack.pop())> print>(stack.pop())> print>(>' Stack after elements are popped:'>)> print>(stack)> # uncommenting print(stack.pop())> # will cause an IndexError> # as the stack is now empty>

>

>

Lähtö

Initial stack: deque(['g', 'f', 'g']) Elements popped from stack: g f g Stack after elements are popped: deque([])>

Toteutus jonomoduulilla

Jonomoduulissa on myös LIFO-jono, joka on periaatteessa pino. Data lisätään jonoon put()-funktiolla ja get() ottaa tiedot pois jonosta.

Python 3




from> queue>import> LifoQueue> # Initializing a stack> stack>=> LifoQueue(maxsize>=> 3>)> # qsize() show the number of elements> # in the stack> print>(stack.qsize())> # put() function to push> # element in the stack> stack.put(>'g'>)> stack.put(>'f'>)> stack.put(>'g'>)> print>(>'Full: '>, stack.full())> print>(>'Size: '>, stack.qsize())> # get() function to pop> # element from stack in> # LIFO order> print>(>' Elements popped from the stack'>)> print>(stack.get())> print>(stack.get())> print>(stack.get())> print>(>' Empty: '>, stack.empty())>

>

>

Lähtö

0 Full: True Size: 3 Elements popped from the stack g f g Empty: True>

Jonottaa

Pinona, jonottaa on lineaarinen tietorakenne, joka tallentaa kohteet FIFO (First In First Out) -tavalla. Jonossa viimeksi lisätty kohde poistetaan ensin. Hyvä esimerkki jonosta on mikä tahansa kuluttajien jono resurssille, jossa ensin palvellaan ensin tullutta kuluttajaa.

Jono Pythonissa

Jonoon liittyvät toiminnot ovat:

    Jono: Lisää kohteen jonoon. Jos jono on täynnä, sen sanotaan olevan ylivuotoehto – Aika monimutkaisuus: O(1) Dequeue: Poistaa kohteen jonosta. Kohteet pompataan samassa järjestyksessä, jossa ne työnnetään. Jos jono on tyhjä, sen sanotaan olevan alivuotoehto – Ajan monimutkaisuus: O(1) Etuosa: Hae jonosta etuosa – Aika monimutkaisuus: O(1) Takana: Hae viimeinen kohde jonosta – Aika monimutkaisuus : O(1)

Python-jonon toteutus

Pythonin jono voidaan toteuttaa seuraavilla tavoilla:

  • lista
  • kokoelmat.deque
  • häntä.häntä

Toteutus listan avulla

Funktioiden enqueue() ja dequeue() sijasta käytetään append()- ja pop()-funktioita.

Python 3




# Initializing a queue> queue>=> []> # Adding elements to the queue> queue.append(>'g'>)> queue.append(>'f'>)> queue.append(>'g'>)> print>(>'Initial queue'>)> print>(queue)> # Removing elements from the queue> print>(>' Elements dequeued from queue'>)> print>(queue.pop(>0>))> print>(queue.pop(>0>))> print>(queue.pop(>0>))> print>(>' Queue after removing elements'>)> print>(queue)> # Uncommenting print(queue.pop(0))> # will raise and IndexError> # as the queue is now empty>

>

>

Lähtö

Initial queue ['g', 'f', 'g'] Elements dequeued from queue g f g Queue after removing elements []>

Toteutus collections.dequen avulla

Deque on suositeltavampi kuin luettelo tapauksissa, joissa tarvitsemme nopeampia liite- ja pop-operaatioita säilön molemmista päistä, koska deque tarjoaa O(1)-ajan monimutkaisuuden liittämis- ja pop-operaatioille verrattuna luetteloon, joka tarjoaa O(n) aika monimutkaisuus.

Python 3




from> collections>import> deque> # Initializing a queue> q>=> deque()> # Adding elements to a queue> q.append(>'g'>)> q.append(>'f'>)> q.append(>'g'>)> print>(>'Initial queue'>)> print>(q)> # Removing elements from a queue> print>(>' Elements dequeued from the queue'>)> print>(q.popleft())> print>(q.popleft())> print>(q.popleft())> print>(>' Queue after removing elements'>)> print>(q)> # Uncommenting q.popleft()> # will raise an IndexError> # as queue is now empty>

>

>

Lähtö

Initial queue deque(['g', 'f', 'g']) Elements dequeued from the queue g f g Queue after removing elements deque([])>

Toteutus käyttäen queue.Queue

muuntaa str int:ksi

queue.Queue(maxsize) alustaa muuttujan enimmäiskoon maksimikokoon. Maksimikoko nolla '0' tarkoittaa ääretöntä jonoa. Tämä jono noudattaa FIFO-sääntöä.

Python 3




from> queue>import> Queue> # Initializing a queue> q>=> Queue(maxsize>=> 3>)> # qsize() give the maxsize> # of the Queue> print>(q.qsize())> # Adding of element to queue> q.put(>'g'>)> q.put(>'f'>)> q.put(>'g'>)> # Return Boolean for Full> # Queue> print>(>' Full: '>, q.full())> # Removing element from queue> print>(>' Elements dequeued from the queue'>)> print>(q.get())> print>(q.get())> print>(q.get())> # Return Boolean for Empty> # Queue> print>(>' Empty: '>, q.empty())> q.put(>1>)> print>(>' Empty: '>, q.empty())> print>(>'Full: '>, q.full())> # This would result into Infinite> # Loop as the Queue is empty.> # print(q.get())>

>

>

Lähtö

0 Full: True Elements dequeued from the queue g f g Empty: True Empty: False Full: False>

Prioriteettijono

Prioriteettijonot ovat abstrakteja tietorakenteita, joissa jokaisella jonon tiedolla/arvolla on tietty prioriteetti. Esimerkiksi lentoyhtiöillä matkatavarat, joiden otsikko on Business tai First Class, saapuvat aikaisemmin kuin muut. Priority Queue on jonon laajennus seuraavilla ominaisuuksilla.

  • Korkean prioriteetin elementti poistetaan jonosta ennen matalan prioriteetin elementtiä.
  • Jos kahdella elementillä on sama prioriteetti, ne toimitetaan niiden järjestyksen mukaan jonossa.

Python 3




# A simple implementation of Priority Queue> # using Queue.> class> PriorityQueue(>object>):> >def> __init__(>self>):> >self>.queue>=> []> >def> __str__(>self>):> >return> ' '>.join([>str>(i)>for> i>in> self>.queue])> ># for checking if the queue is empty> >def> isEmpty(>self>):> >return> len>(>self>.queue)>=>=> 0> ># for inserting an element in the queue> >def> insert(>self>, data):> >self>.queue.append(data)> ># for popping an element based on Priority> >def> delete(>self>):> >try>:> >max> => 0> >for> i>in> range>(>len>(>self>.queue)):> >if> self>.queue[i]>>>.queue[>max>]:> >max> => i> >item>=> self>.queue[>max>]> >del> self>.queue[>max>]> >return> item> >except> IndexError:> >print>()> >exit()> if> __name__>=>=> '__main__'>:> >myQueue>=> PriorityQueue()> >myQueue.insert(>12>)> >myQueue.insert(>1>)> >myQueue.insert(>14>)> >myQueue.insert(>7>)> >print>(myQueue)> >while> not> myQueue.isEmpty():> >print>(myQueue.delete())>

>

>

Lähtö

12 1 14 7 14 12 7 1>

Keon jono (tai kasoq)

heapq-moduuli Pythonissa tarjoaa keon tietorakenteen, jota käytetään pääasiassa edustamaan prioriteettijonoa. Tämän Pythonin tietorakenteen ominaisuus on, että joka kerta kun pienin kasoelementti pompataan (min-heap). Aina kun elementtejä työnnetään tai poksetaan, kasarakenne säilyy. Hep[0]-elementti palauttaa myös pienimmän elementin joka kerta.

Se tukee pienimmän elementin poistamista ja lisäämistä O(log n)-ajoissa.

Python 3




# importing 'heapq' to implement heap queue> import> heapq> # initializing list> li>=> [>5>,>7>,>9>,>1>,>3>]> # using heapify to convert list into heap> heapq.heapify(li)> # printing created heap> print> (>'The created heap is : '>,end>=>'')> print> (>list>(li))> # using heappush() to push elements into heap> # pushes 4> heapq.heappush(li,>4>)> # printing modified heap> print> (>'The modified heap after push is : '>,end>=>'')> print> (>list>(li))> # using heappop() to pop smallest element> print> (>'The popped and smallest element is : '>,end>=>'')> print> (heapq.heappop(li))>

>

>

Lähtö

The created heap is : [1, 3, 9, 7, 5] The modified heap after push is : [1, 3, 4, 7, 5, 9] The popped and smallest element is : 1>

Binääripuu

Puu on hierarkkinen tietorakenne, joka näyttää alla olevasta kuvasta -

 tree ---- j <-- root /  f k /   a h z <-- leaves>

Puun ylintä solmua kutsutaan juureksi, kun taas alimpia solmuja tai solmuja, joissa ei ole lapsia, kutsutaan lehtisolmuiksi. Solmuja, jotka ovat suoraan solmun alla, kutsutaan sen lapsiksi ja solmuja, jotka ovat suoraan jonkin solmun yläpuolella, kutsutaan sen yläpääksi.

Binääripuu on puu, jonka elementeillä voi olla melkein kaksi lasta. Koska jokaisella binääripuun elementillä voi olla vain 2 alaosaa, annamme yleensä nimet vasemmalle ja oikealle lapselle. Binaaripuusolmu sisältää seuraavat osat.

  • Data
  • Osoitin vasemmalle lapselle
  • Osoita oikeaa lasta

Esimerkki: Solmuluokan määrittäminen

Python 3




# A Python class that represents an individual node> # in a Binary Tree> class> Node:> >def> __init__(>self>,key):> >self>.left>=> None> >self>.right>=> None> >self>.val>=> key>

>

>

Luodaan nyt puu, jossa on 4 solmua Pythonissa. Oletetaan, että puurakenne näyttää alla olevalta -

 tree ---- 1 <-- root /  2 3 / 4>

Esimerkki: Tietojen lisääminen puuhun

Python 3




# Python program to introduce Binary Tree> # A class that represents an individual node in a> # Binary Tree> class> Node:> >def> __init__(>self>,key):> >self>.left>=> None> >self>.right>=> None> >self>.val>=> key> # create root> root>=> Node(>1>)> ''' following is the tree after above statement> >1> >/> >None None'''> root.left>=> Node(>2>);> root.right>=> Node(>3>);> ''' 2 and 3 become left and right children of 1> >1> >/> >2 3> >/ /> None None None None'''> root.left.left>=> Node(>4>);> '''4 becomes left child of 2> >1> >/> >2 3> >/ /> 4 None None None> /> None None'''>

>

>

Puun läpikulku

Puut voidaan ajella eri tavoin. Seuraavassa on yleisesti käytettyjä tapoja puiden ylittämiseen. Tarkastellaanpa alla olevaa puuta -

 tree ---- 1 <-- root /  2 3 /  4 5>

Syvyys ensimmäiset matkat:

  • Järjestys (vasen, juuri, oikea): 4 2 5 1 3
  • Ennakkotilaus (juuri, vasen, oikea): 1 2 4 5 3
  • Postorder (vasen, oikea, juuri): 4 5 2 3 1

Algoritmin järjestys(puu)

  • Kävele vasemman alipuun läpi, eli kutsu Inorder(vasen-alipuu)
  • Vieraile juurella.
  • Kulje oikeanpuoleisen alipuun läpi, eli kutsu Inorder(oikea-alipuu)

Algoritmin ennakkotilaus (puu)

  • Vieraile juurella.
  • Kävele vasemman alipuun läpi, eli kutsu Preorder(left-subtree)
  • Kulje oikeanpuoleisen alipuun läpi, eli kutsu Preorder(oikea-alipuu)

Algoritmi Postimääräys (puu)

  • Kävele vasemman alipuun läpi, eli kutsu Postorder(vasen-alipuu)
  • Kulje oikeanpuoleisen alipuun läpi, eli kutsu Postorder(oikea-alipuu)
  • Vieraile juurella.

Python 3




# Python program to for tree traversals> # A class that represents an individual node in a> # Binary Tree> class> Node:> >def> __init__(>self>, key):> >self>.left>=> None> >self>.right>=> None> >self>.val>=> key> # A function to do inorder tree traversal> def> printInorder(root):> >if> root:> ># First recur on left child> >printInorder(root.left)> ># then print the data of node> >print>(root.val),> ># now recur on right child> >printInorder(root.right)> # A function to do postorder tree traversal> def> printPostorder(root):> >if> root:> ># First recur on left child> >printPostorder(root.left)> ># the recur on right child> >printPostorder(root.right)> ># now print the data of node> >print>(root.val),> # A function to do preorder tree traversal> def> printPreorder(root):> >if> root:> ># First print the data of node> >print>(root.val),> ># Then recur on left child> >printPreorder(root.left)> ># Finally recur on right child> >printPreorder(root.right)> # Driver code> root>=> Node(>1>)> root.left>=> Node(>2>)> root.right>=> Node(>3>)> root.left.left>=> Node(>4>)> root.left.right>=> Node(>5>)> print>(>'Preorder traversal of binary tree is'>)> printPreorder(root)> print>(>' Inorder traversal of binary tree is'>)> printInorder(root)> print>(>' Postorder traversal of binary tree is'>)> printPostorder(root)>

>

>

Lähtö

Preorder traversal of binary tree is 1 2 4 5 3 Inorder traversal of binary tree is 4 2 5 1 3 Postorder traversal of binary tree is 4 5 2 3 1>

Aika monimutkaisuus – O(n)

Leveys-First tai Level Order Traversal

Tasotilauksen läpikulku puu on leveys-ensimmäinen läpikulku puulle. Yllä olevan puun tasojärjestyksen läpikulku on 1 2 3 4 5.

Jokaisen solmun kohdalla käydään ensin solmussa ja sitten sen lapsisolmut asetetaan FIFO-jonoon. Alla on algoritmi samalle -

  • Luo tyhjä jono q
  • temp_node = juuri /*aloita juuresta*/
  • Silmukka kun temp_node ei ole NULL
    • tulosta temp_node-> data.
    • Jonota temp_node:n lapset (ensin vasen ja sitten oikea lapsi) kohtaan q
    • Pura solmu q:sta

Python 3




# Python program to print level> # order traversal using Queue> # A node structure> class> Node:> > ># A utility function to create a new node> >def> __init__(>self> ,key):> >self>.data>=> key> >self>.left>=> None> >self>.right>=> None> # Iterative Method to print the> # height of a binary tree> def> printLevelOrder(root):> > ># Base Case> >if> root>is> None>:> >return> > ># Create an empty queue> ># for level order traversal> >queue>=> []> ># Enqueue Root and initialize height> >queue.append(root)> >while>(>len>(queue)>>>):> > ># Print front of queue and> ># remove it from queue> >print> (queue[>0>].data)> >node>=> queue.pop(>0>)> ># Enqueue left child> >if> node.left>is> not> None>:> >queue.append(node.left)> ># Enqueue right child> >if> node.right>is> not> None>:> >queue.append(node.right)> # Driver Program to test above function> root>=> Node(>1>)> root.left>=> Node(>2>)> root.right>=> Node(>3>)> root.left.left>=> Node(>4>)> root.left.right>=> Node(>5>)> print> (>'Level Order Traversal of binary tree is -'>)> printLevelOrder(root)>

>

>

Lähtö

Level Order Traversal of binary tree is - 1 2 3 4 5>

Aika monimutkaisuus: O(n)

Kaavio

A kaavio on epälineaarinen tietorakenne, joka koostuu solmuista ja reunoista. Solmuja kutsutaan joskus myös kärkipisteiksi ja reunat ovat viivoja tai kaaria, jotka yhdistävät mitä tahansa kahta graafin solmua. Muodollisemmin Graafi voidaan määritellä kuvaajaksi, joka koostuu äärellisestä joukosta pisteitä (tai solmuja) ja joukosta reunoja, jotka yhdistävät solmuparin.

Yllä olevassa kaaviossa kärkijoukko V = {0,1,2,3,4} ja reunojen joukko E = {01, 12, 23, 34, 04, 14, 13}.

Seuraavat kaksi ovat graafin yleisimmin käytettyjä esityksiä.

  • Vierekkäisyysmatriisi
  • Vierekkäisten kohteiden luettelo

Vierekkäisyysmatriisi

Vierekkäisyysmatriisi on 2D-taulukko, jonka koko on V x V, jossa V on graafin kärkien lukumäärä. Olkoon 2D-taulukko adj[][], väli adj[i][j] = 1 osoittaa, että kärjestä i kärkeen j on reuna. Suuntaamattoman graafin viereisyysmatriisi on aina symmetrinen. Vierekkäisyysmatriisia käytetään myös painotettujen kuvaajien esittämiseen. Jos adj[i][j] = w, niin kärjestä i kärkeen j on reuna, jonka paino on w.

Python 3




# A simple representation of graph using Adjacency Matrix> class> Graph:> >def> __init__(>self>,numvertex):> >self>.adjMatrix>=> [[>->1>]>*>numvertex>for> x>in> range>(numvertex)]> >self>.numvertex>=> numvertex> >self>.vertices>=> {}> >self>.verticeslist>=>[>0>]>*>numvertex> >def> set_vertex(>self>,vtx,>id>):> >if> 0><>=>vtx<>=>self>.numvertex:> >self>.vertices[>id>]>=> vtx> >self>.verticeslist[vtx]>=> id> >def> set_edge(>self>,frm,to,cost>=>0>):> >frm>=> self>.vertices[frm]> >to>=> self>.vertices[to]> >self>.adjMatrix[frm][to]>=> cost> > ># for directed graph do not add this> >self>.adjMatrix[to][frm]>=> cost> >def> get_vertex(>self>):> >return> self>.verticeslist> >def> get_edges(>self>):> >edges>=>[]> >for> i>in> range> (>self>.numvertex):> >for> j>in> range> (>self>.numvertex):> >if> (>self>.adjMatrix[i][j]!>=>->1>):> >edges.append((>self>.verticeslist[i],>self>.verticeslist[j],>self>.adjMatrix[i][j]))> >return> edges> > >def> get_matrix(>self>):> >return> self>.adjMatrix> G>=>Graph(>6>)> G.set_vertex(>0>,>'a'>)> G.set_vertex(>1>,>'b'>)> G.set_vertex(>2>,>'c'>)> G.set_vertex(>3>,>'d'>)> G.set_vertex(>4>,>'e'>)> G.set_vertex(>5>,>'f'>)> G.set_edge(>'a'>,>'e'>,>10>)> G.set_edge(>'a'>,>'c'>,>20>)> G.set_edge(>'c'>,>'b'>,>30>)> G.set_edge(>'b'>,>'e'>,>40>)> G.set_edge(>'e'>,>'d'>,>50>)> G.set_edge(>'f'>,>'e'>,>60>)> print>(>'Vertices of Graph'>)> print>(G.get_vertex())> print>(>'Edges of Graph'>)> print>(G.get_edges())> print>(>'Adjacency Matrix of Graph'>)> print>(G.get_matrix())>

>

>

Lähtö

Graafin pisteet

['A B C D E F']

Graafin reunat

[('a', 'c', 20), ('a', 'e', ​​10), ('b', 'c', 30), ('b', 'e', ​​40), ( 'c', 'a', 20), ('c', 'b', 30), ('d', 'e', ​​50), ('e', 'a', 10), ('e' ', 'b', 40), ('e', 'd', 50), ('e', 'f', 60), ('f', 'e', ​​60)]

Graafin vierekkäisyysmatriisi

[[-1, -1, 20, -1, 10, -1], [-1, -1, 30, -1, 40, -1], [20, 30, -1, -1, -1 , -1], [-1, -1, -1, -1, 50, -1], [10, 40, -1, 50, -1, 60], [-1, -1, -1, -1, 60, -1]]

Vierekkäisten kohteiden luettelo

Käytössä on joukko luetteloita. Taulukon koko on yhtä suuri kuin pisteiden lukumäärä. Olkoon taulukko taulukko[]. Syöttötaulukko[i] edustaa listaa i:nnen kärjen viereisistä pisteistä. Tätä esitystä voidaan käyttää myös painotetun graafin esittämiseen. Reunojen painot voidaan esittää pariluetteloina. Seuraavassa on vierekkäisyysluetteloesitys yllä olevasta kaaviosta.

Graafin esitys vierekkäisistä luetteloista

Python 3




# A class to represent the adjacency list of the node> class> AdjNode:> >def> __init__(>self>, data):> >self>.vertex>=> data> >self>.>next> => None> # A class to represent a graph. A graph> # is the list of the adjacency lists.> # Size of the array will be the no. of the> # vertices 'V'> class> Graph:> >def> __init__(>self>, vertices):> >self>.V>=> vertices> >self>.graph>=> [>None>]>*> self>.V> ># Function to add an edge in an undirected graph> >def> add_edge(>self>, src, dest):> > ># Adding the node to the source node> >node>=> AdjNode(dest)> >node.>next> => self>.graph[src]> >self>.graph[src]>=> node> ># Adding the source node to the destination as> ># it is the undirected graph> >node>=> AdjNode(src)> >node.>next> => self>.graph[dest]> >self>.graph[dest]>=> node> ># Function to print the graph> >def> print_graph(>self>):> >for> i>in> range>(>self>.V):> >print>(>'Adjacency list of vertex {} head'>.>format>(i), end>=>'')> >temp>=> self>.graph[i]> >while> temp:> >print>(>' ->{}'>.>format>(temp.vertex), end>=>'')> >temp>=> temp.>next> >print>(>' '>)> # Driver program to the above graph class> if> __name__>=>=> '__main__'>:> >V>=> 5> >graph>=> Graph(V)> >graph.add_edge(>0>,>1>)> >graph.add_edge(>0>,>4>)> >graph.add_edge(>1>,>2>)> >graph.add_edge(>1>,>3>)> >graph.add_edge(>1>,>4>)> >graph.add_edge(>2>,>3>)> >graph.add_edge(>3>,>4>)> >graph.print_graph()>

>

>

Lähtö

Adjacency list of vertex 0 head ->4 -> 1 vierekkäisyyslista kärjestä 1 pää -> 4 -> 3 -> 2 -> 0 vierekkäisyyslista kärjestä 2 pää -> 3 -> 1 vierekkäinen luettelo kärjestä 3 pää -> 4 -> 2 -> 1 vierekkäisyys lista kärjestä 4 head -> 3 -> 1 -> 0>> 

Kaavion läpikulku

Breadth-First Search tai BFS

Breadth-First Traversal kaavio on samanlainen kuin puun leveys-ensimmäinen läpikulku. Ainoa saalis tässä on, toisin kuin puut, graafit voivat sisältää syklejä, joten voimme päästä samaan solmuun uudelleen. Jotta vältytään käsittelemästä solmua useammin kuin kerran, käytämme boolen vierailtua taulukkoa. Yksinkertaisuuden vuoksi oletetaan, että kaikki kärjet ovat saavutettavissa aloituspisteestä.

Esimerkiksi seuraavassa graafissa aloitamme kulkemisen kärjestä 2. Kun saavumme kärkeen 0, etsimme sen kaikki vierekkäiset kärjet. 2 on myös 0:n viereinen kärkipiste. Jos emme merkitse vierailtuja pisteitä, 2 käsitellään uudelleen ja siitä tulee ei-päättyvä prosessi. Seuraavan kaavion Leveys-First Traversal on 2, 0, 3, 1.

Python 3




# Python3 Program to print BFS traversal> # from a given source vertex. BFS(int s)> # traverses vertices reachable from s.> from> collections>import> defaultdict> # This class represents a directed graph> # using adjacency list representation> class> Graph:> ># Constructor> >def> __init__(>self>):> ># default dictionary to store graph> >self>.graph>=> defaultdict(>list>)> ># function to add an edge to graph> >def> addEdge(>self>,u,v):> >self>.graph[u].append(v)> ># Function to print a BFS of graph> >def> BFS(>self>, s):> ># Mark all the vertices as not visited> >visited>=> [>False>]>*> (>max>(>self>.graph)>+> 1>)> ># Create a queue for BFS> >queue>=> []> ># Mark the source node as> ># visited and enqueue it> >queue.append(s)> >visited[s]>=> True> >while> queue:> ># Dequeue a vertex from> ># queue and print it> >s>=> queue.pop(>0>)> >print> (s, end>=> ' '>)> ># Get all adjacent vertices of the> ># dequeued vertex s. If a adjacent> ># has not been visited, then mark it> ># visited and enqueue it> >for> i>in> self>.graph[s]:> >if> visited[i]>=>=> False>:> >queue.append(i)> >visited[i]>=> True> # Driver code> # Create a graph given in> # the above diagram> g>=> Graph()> g.addEdge(>0>,>1>)> g.addEdge(>0>,>2>)> g.addEdge(>1>,>2>)> g.addEdge(>2>,>0>)> g.addEdge(>2>,>3>)> g.addEdge(>3>,>3>)> print> (>'Following is Breadth First Traversal'> >' (starting from vertex 2)'>)> g.BFS(>2>)> # This code is contributed by Neelam Yadav>

>

Lähtö

Following is Breadth First Traversal (starting from vertex 2) 2 0 3 1>

Aika monimutkaisuus: O(V+E) missä V on graafin kärkien lukumäärä ja E on graafin reunojen lukumäärä.

Syvyys ensimmäinen haku tai DFS

Syvyys ensimmäinen läpikulku kaavio on samanlainen kuin puun syvyys ensimmäinen läpikulku. Ainoa saalis tässä on, toisin kuin puut, kaaviot voivat sisältää jaksoja, solmussa voidaan käydä kahdesti. Voit välttää solmun käsittelyn useammin kuin kerran käyttämällä loogista vierailtua taulukkoa.

Algoritmi:

  • Luo rekursiivinen funktio, joka ottaa solmun indeksin ja vieraillun taulukon.
  • Merkitse nykyinen solmu vierailluksi ja tulosta solmu.
  • Käy läpi kaikki viereiset ja merkitsemättömät solmut ja kutsu rekursiivista funktiota viereisen solmun indeksillä.

Python 3




# Python3 program to print DFS traversal> # from a given graph> from> collections>import> defaultdict> # This class represents a directed graph using> # adjacency list representation> class> Graph:> ># Constructor> >def> __init__(>self>):> ># default dictionary to store graph> >self>.graph>=> defaultdict(>list>)> ># function to add an edge to graph> >def> addEdge(>self>, u, v):> >self>.graph[u].append(v)> ># A function used by DFS> >def> DFSUtil(>self>, v, visited):> ># Mark the current node as visited> ># and print it> >visited.add(v)> >print>(v, end>=>' '>)> ># Recur for all the vertices> ># adjacent to this vertex> >for> neighbour>in> self>.graph[v]:> >if> neighbour>not> in> visited:> >self>.DFSUtil(neighbour, visited)> ># The function to do DFS traversal. It uses> ># recursive DFSUtil()> >def> DFS(>self>, v):> ># Create a set to store visited vertices> >visited>=> set>()> ># Call the recursive helper function> ># to print DFS traversal> >self>.DFSUtil(v, visited)> # Driver code> # Create a graph given> # in the above diagram> g>=> Graph()> g.addEdge(>0>,>1>)> g.addEdge(>0>,>2>)> g.addEdge(>1>,>2>)> g.addEdge(>2>,>0>)> g.addEdge(>2>,>3>)> g.addEdge(>3>,>3>)> print>(>'Following is DFS from (starting from vertex 2)'>)> g.DFS(>2>)>

>

>

Lähtö

Following is DFS from (starting from vertex 2) 2 0 1 3>

Aikamonimutkaisuus: O(V + E), jossa V on graafin kärkien lukumäärä ja E on graafin reunojen lukumäärä.