Realizarea copacilor de date in Python

Aflati despre copaci si cum sa le implementati.

Radacini

Un copac ca structura de date poate deveni rapid un subiect matematic complex (verificati wiki ????), suntem inconjurati de lucruri reale si virtuale ( date intr-adevar ) care pot fi modelate si reprezentate de un copac, deci este un subiect la indemana pentru a intelege chiar si la un nivel de baza.

Personal, am esuat recent la o intrebare de interviu de cod din cauza lipsei mele de experienta cu copacii in python, nu este faptul ca un copac este greu de inteles, dar punerea in aplicare pe de alta parte, in mod specific in Python de la zero, m-am impiedicat, sper ca pana la sfarsitul acestei postari, atat voi, cat si eu vom intelege subiectul la un nivel confortabil si, desigur, vom putea implementa unul pentru interviuri cu cod si alte nevoi.

⏭ ⏭ In graba? Daca cunoasteti teoria si / sau doriti doar o implementare in arbore de lucru in Python, puteti sa accesati sectiunile ulterioare si sariti teoria.

Un copac pe care-l spui?

Cel mai probabil folositi deja un copac sau ati folosit unul, macar un copac simplu ca acesta:

Vom intra in terminologie intr-un minut, dar cel mai important aici este relatia parinte-copil, care ar putea avea mai mult sens cu cateva exemple:

Tata -> Son



Boss ->



Mancarea preferata a angajatilor -> Mancare chinezeasca



3 -> Medalie de argint

Implementarea acestui arbore simplu este destul de comuna in Python cu dictionare si liste:

⚠️ NOTA: Urmatoarele exemple sunt de fapt mai multi copaci (din punct de vedere tehnic o padure), in realitate este mai probabil sa gasiti aceasta structura decat un singur copac (cel putin la acest nivel de complexitate a copacilor), daca eliminati spune Jim si Carlos in urmatorul exemplu ati avea un singur copac. # Dictionary: Families = { ‘Peter’ : ‘Paul’, ‘Jim’ : ‘Tommy’, ‘Carlos’ : ‘Diego’} pentru Parent , Son in Families. porno reel items ():



print (f ” {Parent} is { Son} ‘s Tad „)



IESIRE: Peter este tata lui Paul



Jim este tatal lui Tommy



Carlos este tata lui Diego

——————— //// ——————

#List: Premii = [‘Aur’, ‘Argint’, ‘Bronz’, ‘Nimic’, ‘Zilch’] pentru loc , premiu enumerat (Premii):



print (f „Numarul locului { loc + 1 } primeste {premiu } „) IESIRE: Locul numarul 1 devine aur



Locul numarul 2 devine argint



Locul numarul 3 devine bronz



Locul numarul 4 devine nimic



Locul numarul 5 devine Zilch

Dar asta nu seamana nimic cu un copac si s-ar putea spune ca sunt relatii liniare simple. Ei bine, da, dar un copac incepe sa prinda forma si are sens odata ce adaugam mai multi copii la nodul radacina:

Principalul lucru aici este ca acesti copii au un singur parinte, daca ar avea mai multi, acest lucru nu ar fi strict un copac ( ar fi un fel de grafic ), cateva exemple:

Tata -> Fiul,



sefa fiicei -> Manager_1, Manager_2, Manager_3



Mancaruri preferate -> Chineza, Pizza, Tacos



1 -> Medalie de aur, 10000 USD, Masina noua, sponsorizare

Implementarea acestora pe Python ar trebui sa fie simpla, deoarece acestea sunt doar extinderi ale exemplelor anterioare:

# Dictionar # (Aceeasi nota ca inainte, acestia sunt mai multi copaci, arbori genealogici in acest exemplu) : Familii = {‘Peter’: [‘Paul’, ‘Patty’] , ‘Jim’: [‘Tommy’, ‘Timmy’ , ‘Tammy’], ‘Carlos’: [‘Diego’]} pentru Parent, Children in Families.items () :



print (f „{ Parent } are { len (Children) } kid (s):”)



print ( f „{‘si’ .join ([str (Copil) pentru Copil in [* Copii]]) }”) IESIRE: Peter are 2 copii:



Paul, iar Patty



Jim are 3 copii:



Tommy , si Timmy, si Tammy



Carlos are 1 copil (i):



Diego# Mod redus / alternativ de a spune acelasi lucru fara formatarea lucrurilor: pentru Parent, Children in Families.items ():



print (str (Parent) + ‘has’ + str (len (Children)) + ‘kid (s):’ )



print (* Copii) Retineti utilizarea * Operatorului pentru despachetarea listei.



——————— \\ | // —————— # Lista: Premii = [ [„Medalia de aur”, „10000 USD”, „Masina sport”, „Sponsorizarea marcii”],



[„Argint Medalie ”,„ 5000 USD ”,„ Masina bugetara ”],



[„ Medalie de bronz ”,„ 2500 USD ”,„ Motocicleta ”],



[„ Trofeu de participare ”,„ Swag ”],



[„ Swag ”] ] pentru loc,



locul + 1 } primeste urmatorul premiu (e) „)



print (f” {‘, si’ . harry potter porno join ( [ str ( premiu ) pentru premiu in [ * lista de premii ] ] )} „) IESIRE:



Locul nr. 1 primeste urmatoarele premiu (e)



Medalie de aur si 10000 USD si Masina sportiva si Sponsorizare de marca Place # 2 primeste urmatorul premiu



Medalie de argint si 5000 USD, iar Budget CarPlace # 3 primeste urmatoarele premii



Medalie de bronz si 2500 USD si MotorcyclePlace # 4 primeste urmatorul premiu (e)



Trofeu de participare, iar SwagPlace # 5 primeste urmatorul premiu (e)



Swag

Un copac mai obisnuit are apoi un element radacina si mai multe noduri care au copii insisi:

Cateva terminologii arborescente ( Treeminologie? ):

O parte din ceea ce face dificila implementarea unui copac (in general) este complexitatea ascunsa pe care o poarta un copac, iata cativa termeni comuni pe care i-ati putea intalni impreuna cu descrierea lor grafica:

Da, este o multime de terminologie de luat in considerare, consultati wiki pentru definitii detaliate si folositi-o ca reimprospatare rapida. In timp ce suntem aici, un copac binar este un copac in care fiecare nod are cel mult 2 noduri copil ( denumite de obicei stanga, dreapta ), ramura dreapta din ilustratia de mai sus ar putea fi un arbore binar, in timp ce partea stanga nu ar fi ‘ t.



Apropo, s-ar putea sa va intrebati de ce aceste structuri se numesc copaci, ei bine, daca ar fi sa inversati sau sa rasturnati vertical structura ar arata ca una ????

Arborele vs graficul (Lupta!)

Un grafic este o structura de date conexa, care este, de asemenea, destul de populara (ganditi-va la retele complexe de orice fel), spre deosebire de un copac, diferenta principala este ca exista conexiuni bidirectionale si nu exista radacina:

Copacii din viata reala (cateva exemple): – Unii neuroni si conexiunile lor ( dar, din multe puncte de vedere, creierul poate fi considerat un grafic dinamic complex ).



– AI / CS: Retele neuronale.



– AI / Neurostiinte: copaci semantici. porno forced



– AI / CS: Pathfinding.



– ML / Statistici / AI / CS: Cautare.



– Utilizare web / generala: Orice relatie imbricata, (de exemplu, anunt / site / urmarire)



– Utilizare generala: clasificare (de exemplu, arbori familiali, evolutivi / biologici). Si multe altele, ideea este ca intre un copac si un grafic (structuri de date neliniare) puteti acoperi o multime de relatii de date complexe care nu sunt acoperite de relatii liniare mai simple.



Pauza.

Deci, speram ca ar trebui sa aiba grija de teoria si unele baze de cod pentru implementarea copacilor, inainte de a continua, as dori sa subliniez ca principala dificultate in implementarea unui copac este dubla, natura recursiva si numarul de caracteristici optionale de care ati putea avea nevoie , ( vezi ilustratia treeminologica ). porno francais gay

Asadar, planul nostru de atac este dupa cum urmeaza, vom realiza o implementare de baza a arborelui de la zero, pe care ulterior o puteti extinde pentru a se potrivi nevoilor dvs. si a interviurilor de codificare, in plus, vom analiza si bibliotecile complet caracteristice care ar trebui sa aiba deja toate caracteristicile necesare, acesta este, de asemenea, un punct bun pentru a lua o pauza daca aveti nevoie de una.

⏭ Daca inca va grabiti sau nu va intereseaza implementarea propriului dvs. arbore de date Python de la zero, puteti sari peste urmatoarea sectiune.

Implementarea modului greu: de la zero

Sa ne ocupam mai intai de problema recursivitatii, prin asta vreau sa spun ca un copac poate creste adaugand noduri la orice nivel sub radacina, sa crestem mai intai unul dintre copacii nostri anteriori pentru a avea o idee despre ceea ce este necesar:

# Dictionar (inca o data aceasta este o padure de 3 copaci 🙂 Familii = {



‘Peter’:



{‘Paul’: {‘Dog’, ‘Toucan’},



‘Patty’: {‘Turtle’}},



‘Jim’ :



{‘Tommy’: {‘Hamster’},



‘Timmy’: {‘Hamster’},



‘Tammy’: {‘Hamster’}},



‘Carlos’:



{‘Diego’: ‘Cat’, ‘Ferret’, ‘Fox’}}



} pentru Parent, Children in Families.items ():



print (f „{Parent} are {len (Children)} kid (s):”)



print (f „{‘, and’ . porno ados join ( [str (Child) for Child in [* Children]])} „)



for Child, pets in Children.items ():



print (f” {Child} has {len (pets)} pet (s): „)



print (f „{‘, si’ .join ([str (animal de companie) pentru animal de companie in [* animale de companie]])}”) IESIRE: Peter are 2 copii:



Paul si Patty



Paul are 2 animale de companie:



caine, iar Toucan



Patty are 1 animal de companie:



Turtle



Jim are 3 copii:



Tommy si Timmy, iar Tammy



Tommy are 1 animal de companie:



Hamster



Timmy are 1 animal de companie ( s):



Hamster



Tammy are 1 animal de companie:



Hamster



Carlos are 1 copil (i):



Diego



Diego are 3 animale de companie:



Pisica, Fox si Ferret

O solutie la problema nivelului este cuibarirea mai multor dictionare sau liste si adaugarea aceleiasi cantitati de bucle pentru a citi dictionarele mentionate, vom automatiza procesul in curand, dar s-ar putea sa va intrebati cum functionam pe un copac, asa facem adaugam sau eliminam lucruri la orice nivel:




– Eliminarea ( Sa presupunem ca o pandemie a lovit casa Hamster lui Jim si Fox Diego a scapat): # Intr – o bucla: pentru mama, copii in Families.items ():



pentru copii, animale de companie in Children.items ():



pentru animale de companie in casa:



daca pet == ‘Hamster’:



Families [Parent] [Child] = {} # Actualizare directa: Families [‘Carlos’] [‘Diego’] = {‘Cat’, ‘Ferret’} – Adaugarea poate functiona in acelasi mod : Families [Parent] [Child] = {‘Snake’}



Families [‘Carlos’] [‘Diego’] = {‘Cat’, ‘Ferret’, ‘Fox’} De asemenea, puteti utiliza orice alt dictionar sau metoda iterabila pentru corespunde nevoilor dvs., daca de exemplu ati dorit sa stergeti intreaga ramura sau arborele genealogic: del Families [‘Peter ‘] [‘ Paul ‘]



#or



del Families [‘ Peter ‘]

Sa incepem acum sa mutam totul in clase pentru reutilizare:

„” „Barebones Minimal general Tree & Node, utilizand liste, dar poate folosi si dictionare daca aveti nevoie de perechi de valori cheie” „” clasa Tree ():



def __init __ (self, root):



self. plage porno root = root



self.children = [ ]



def addNode (self, obj):



self.children.append (obj) class Node ():



def __init __ (self, data):



self.data = data



self.children = []



def addNode (self, obj):



self . laly porno children.append (obj) USAGE: FunCorp = Tree (‘Head Honcho’) # Creati un copac si adaugati date radacina.



print (FunCorp.root) # cere Arborelui radacina sa. >> Head Honcho # Adaugati copii la radacina: FunCorp.addNode (Node (‘VP of Stuff’))



FunCorp. porno dingue addNode (Node (‘VP of Shenanigans’))



FunCorp.addNode (Node (‘VP of Hootenanny’)) # Get children of root: print (f’C suite: {„,” .join (str (child. date) pentru copil in FunCorp.children)} ‘) >> C suite: VP of Stuff, VP of Shenanigans, VP of Hootenanny # Add Node to the first child of the Tree: FunCorp.children [0] . porno pussy addNode (Node ( „Director general al distractiei”)) # Obtineti primul copil al primului copil al copacului: print (f’Pozitia din {FunCorp.children [0] .data} este: {FunCorp.children [0] .children [ 0] .data} ‘) >> Pozitia din VP of Stuff este: director general al Fun

Aceasta este o implementare minima, ar trebui sa adaugati metode fie la clasele de copaci, fie la noduri, pentru a le face mai usor de utilizat sau pentru a implementa o caracteristica specifica, o astfel de caracteristica care poate servi ca sablon pentru alte solicita arborelui toate sunt noduri:

„” „Barebones general Tree & Node” „”



class Tree ():



def __init __ (self, root):



self. porno taxi root = root



self.children = []



self.Nodes = []



def addNode (self, obj):



self .children.



  • porno lesbien français
  • astrid nelsia porno
  • porno etranger
  • film porno ado
  • porno tcheque
  • film porno trio
  • porno jeune gay
  • film porno japonais
  • reportage porno
  • porno cuisine
  • ladyboy porno
  • film porno homo
  • shakira porno
  • porno string
  • porno italien vintage
  • africa porno
  • porno entre hommes
  • actrice porno asiatique
  • porno gay amateur
  • video porno perfect





append (obj) def getAllNodes (self):



self.Nodes. ancien film porno append (self.root)



pentru copil in self.children:



self.Nodes.append (child.data)



for child in self. xxxl porno children:



if child. getChildNodes (self.Nodes)! = Nici unul:



child.getChildNodes (self.Nodes)



print (* self.Nodes, sep = „\ n”)



print (‘Tree Size:’ + str (len (self. illic porno Nodes)))
class Node ():



def __init __ (self, data):



self.data = data



self.children = []



def addNode (self,obj):



self.children.append (obj)



def getChildNodes (self, Tree):



pentru copil in self.children:



if child. porno us children:



child.getChildNodes (Tree)



Tree.append (child.data)



else:



Tree.append (child. date)
# Adaugati o gramada de noduri FunCorp = Tree (‘Head Honcho’)



FunCorp. vieille francaise porno addNode (Node (‘VP of Stuff’))



FunCorp.addNode (Node (‘VP of Shenanigans’))



FunCorp.addNode (Node (‘VP of Hootenanny ‘))



FunCorp.children [0] .addNode (Node (‘ General manager of Fun ‘))



FunCorp.children [1] . maeva ghennam porno addNode (Node (‘ General manager Shindings ‘))



FunCorp.children [0] .children [0] .addNode (Node („Sub manager de distractie”))



FunCorp.children [0] .children [0] . pizza porno children [0] .addNode (Node (‘Angajatul lunii ‘)) # Obtineti toate nodurile (neordonate):



FunCorp.getAllNodes () >>



Seful Honcho



VP of Stuff



VP of Shenanigans



VP of Hootenanny



Angajat al lunii



Sub manager al Fun



General Manager al Fun



Director general Shindings



Dimensiunea arborelui: 8

Exista, desigur, mai multe metode pe care le-ati putea adauga sau regla fin ( comandand si adaugand perechi de valori cheie, de exemplu ) si modalitati de a implementa un arbore de la zero ( verificati acest lucru pentru mai multe idei ):

Implementarea modului Easy: cu biblioteci.

ℹ️ Vom incerca cateva biblioteci populare: Treelib : https://treelib.readthedocs.io/en/latest/



AnyTree : https://github. luxure porno com/c0fec0de/anytree S-ar putea sa doriti sa verificati si: Binarytree : https: //github.com/joowani/binarytree Grafice : https://wiki.python.org/moin/PythonGraphApi

Utilizarea Treelib:

din treelib import Node, Treetree = Tree ()



tree.create_node („CEO”, „CEO”) #root



tree.create_node („VP_1”, „VP_1”, parent = „CEO”)



tree. porno hard francais create_node („VP_2”, „VP_2”, parent = „CEO”)



tree.create_node („GM_1”, „GM_1”, parent = „VP_1”)



tree.create_node („GM_2”, „GM_2”, parent = „VP_2”) tree.show ( ) >> CEO



├── VP_1



│ └──



GM_1



└── VP_2 └── GM_2

Utilizarea Anytree:

din nodul de import anytree, RenderTreeceo = Nod („CEO”) #root



vp_1 = Nod („VP_1”, parinte = CEO)



vp_2 = Nod („VP_2”, parinte = CEO)



gm_1 = Nod („GM_1”, parinte = vp_1 )



gm_2 = Nod („GM_2”, parinte = vp_2) pentru pre, fill, nod in RenderTree (ceo):



print („% s% s”% (pre, node.name)) >>> CEO



├── VP_1



│ └──



GM_1



└── VP_2 └── GM_2

Crearea copacilor cu oricare dintre ele pare destul de usoara, au o sintaxa usor diferita si simt totusi: AnyTree a simtit mai multe caracteristici si TreeLib mai simplificat in scurta mea experienta, asa ca va sugerez sa le explorati pe amandoua si sa vedeti care dintre ele functioneaza pentru dvs.

Credit suplimentar: vizualizarea arborelui

Folosind Graphviz si Anytree : https://github. porno japonais non censure com/xflr6/graphvizde la anytree import Node, RenderTree



din anytree.exporter import DotExporterceo = Node („CEO”) #root



vp_1 = Node („VP_1”, parent = ceo)



vp_2 = Node („VP_2”, parent = ceo)



gm_1 = Node („GM_1”, parent = vp_1)



gm_2 = Node („GM_2”, parent = vp_2)



m_1 = Node („M_1”, parent = gm_2) DotExporter (ceo) .to_picture („ceo.png”) Iesire: >>

Pentru grafica vizuala complexa ( si mai frumoasa ), verificati plotly + igraph care foloseste o notatie diferita de arbore / grafic.

Concluzii:

Scopul meu principal aici a fost sa merg de la zero cunoastere a copacilor in python la o intelegere buna / de baza a acestora (sper ca am facut bine acolo), unul secundar a fost sa va arat cum sa implementati unul de la zero, din pacate din cauza modul in care pot obtine copacii bogati de caracteristici am creat doar un sablon simplu pe care ati putea sau nu doriti sa-l urmariti si sa il dezvoltati in continuare (dar sper sa va inspirati din el) si, in cele din urma, am prezentat cateva biblioteci de copaci care ofera o experienta mult mai usoara si mai prietenoasa .

Adevarata putere a copacilor vine din punerea lor in aplicare in probleme specifice (sau prin prinderea acelui interviu tehnic), daca pe de alta parte ati fost aici (poate partial) pentru cunostintele CS, va recomand sa verificati alte structuri de date, cum ar fi grafice, stive si cozi in python.

Multumesc pentru lectura!

Keno