Beispiele für die Tiefe und Breite der Python-Datenstrukturdiagramme

@Dieser Artikel stammt aus der öffentlichen Nummer: csdn2299, möchte der Programmierakademie für öffentliche Nummern Aufmerksamkeit schenken.
Dieser Artikel beschreibt die Verwendung des Diagramms der Python-Datenstruktur in der Tiefe und Breite. Teilen Sie mit Ihnen als Referenz. Die Details sind wie folgt:

Zunächst gibt es ein Konzept: Backtracking

Die Backtracking-Methode (Explorations- und Backtracking-Methode) ist eine optimale Suchmethode, die gemäß den optimalen Bedingungen vorwärts sucht, um das Ziel zu erreichen. Wenn Sie jedoch einen bestimmten Schritt untersuchen, wird festgestellt, dass die ursprüngliche Auswahl nicht gut ist oder das Ziel nicht erreicht, und dann wird ein Schritt zur erneuten Auswahl zurückgegeben. Diese Technik, bei der Sie nicht zurückkehren und dann gehen, ist die Rückverfolgungsmethode und der Punkt eines bestimmten Zustands, der die Rückverfolgungsbedingung erfüllt Dies wird als "Backtrack-Punkt" bezeichnet.

Tiefen-Erster-Algorithmus:

(1) Besuchen Sie den anfänglichen Scheitelpunkt v und markieren Sie den Scheitelpunkt v, der besucht wurde.
(2) Finden Sie den ersten benachbarten Scheitelpunkt w des Scheitelpunkts v.
(3) Wenn der angrenzende Scheitelpunkt w des Scheitelpunkts v existiert, setzen Sie die Ausführung fort, andernfalls gehen Sie zurück zu v und suchen Sie einen anderen nicht besuchten angrenzenden Punkt von v.
(4) Wenn der Scheitelpunkt w noch nicht besucht wurde, besuchen Sie den Scheitelpunkt w und markieren Sie den Scheitelpunkt w als besucht.
(5) Fahren Sie fort, um den nächsten benachbarten Scheitelpunkt wi des Scheitelpunkts w zu finden. Wenn v den Wert von wi annimmt, fahren Sie mit Schritt (3) fort. Bis alle Scheitelpunkte im verbundenen Diagramm besucht wurden.

Breite erster Algorithmus:

(1) Vertex v tritt in die Warteschlange ein.
(2) Wenn die Warteschlange nicht leer ist, fahren Sie mit der Ausführung fort, andernfalls endet der Algorithmus.
(3) Verlassen Sie die Warteschlange, um den Kopfscheitelpunkt v zu erhalten. Besuchen Sie den Scheitelpunkt v und markieren Sie den Scheitelpunkt v, der besucht wurde.
(4) Finden Sie die erste benachbarte Scheitelpunktspalte von Scheitelpunkt v.
(5) Wenn der benachbarte Scheitelpunkt col von v nicht besucht wurde, wird col in die Warteschlange gestellt.
(6) Suchen Sie weiter nach einem weiteren neuen benachbarten Scheitelpunkt col von Scheitelpunkt v und fahren Sie mit Schritt (5) fort. Bis alle benachbarten Punkte des Scheitelpunkts v, die nicht besucht wurden, verarbeitet wurden. Weiter mit Schritt (2).

Code:

#!/usr/bin/python
# -*- coding: utf-8 -*-
class Graph(object):
  def __init__(self,*args,**kwargs):
    self.node_neighbors = {}
    self.visited = {}
  def add_nodes(self,nodelist):
    for node in nodelist:
      self.add_node(node)
  def add_node(self,node):
    if not node in self.nodes():
      self.node_neighbors[node] = []
  def add_edge(self,edge):
    u,v = edge
    if(v not in self.node_neighbors[u]) and ( u not in self.node_neighbors[v]):
      self.node_neighbors[u].append(v)
      if(u!=v):
        self.node_neighbors[v].append(u)
  def nodes(self):
    return self.node_neighbors.keys()
  def depth_first_search(self,root=None):
    order = []
    def dfs(node):
      self.visited[node] = True
      order.append(node)
      for n in self.node_neighbors[node]:
        if not n in self.visited:
          dfs(n)
    if root:
      dfs(root)
    for node in self.nodes():
      if not node in self.visited:
        dfs(node)
    print order
    return order
  def breadth_first_search(self,root=None):
    queue = []
    order = []
    def bfs():
      while len(queue)> 0:
        node = queue.pop(0)
        self.visited[node] = True
        for n in self.node_neighbors[node]:
          if (not n in self.visited) and (not n in queue):
            queue.append(n)
            order.append(n)
    if root:
      queue.append(root)
      order.append(root)
      bfs()
    for node in self.nodes():
      if not node in self.visited:
        queue.append(node)
        order.append(node)
        bfs()
    print order
    return order
if __name__ == '__main__':
  g = Graph()
g.add_nodes([i+1 for i in range(8)])
g.add_edge((1, 2))
g.add_edge((1, 3))
g.add_edge((2, 4))
g.add_edge((2, 5))
g.add_edge((4, 8))
g.add_edge((5, 8))
g.add_edge((3, 6))
g.add_edge((3, 7))
g.add_edge((6, 7))
print "nodes:", g.nodes()
order = g.breadth_first_search(1)
order = g.depth_first_search(1)

Das Ergebnis:

Knoten: [1, 2, 3, 4, 5, 6, 7, 8]

Breite zuerst:
[1, 2, 3, 4, 5, 6, 7, 8]

Tiefe zuerst:

[1, 2, 4, 8, 5, 3, 6, 7]
Vielen Dank für das Lesen
. Ich habe mich während meines Studiums für Python zum Selbststudium entschieden. Nach meiner Arbeit stellte ich fest, dass ich dem Computer eine schlechte Grundlage schulde . Ich habe keine Ausbildung. Dies ist
unmöglich. , Kann das erst übermorgen wieder gut machen, also eröffnete er seine eigene Gegenangriffsstraße außerhalb der Codierung, lernte ständig das Kernwissen von Python, vertiefte die Computergrundlagen gründlich und sortierte es aus, wenn Sie nicht bereit sind, mittelmäßig zu sein, dann machen Sie mit Wachsen Sie über das Codieren hinaus weiter!
Tatsächlich gibt es hier nicht nur Technologie, sondern auch Dinge, die über diese Technologien hinausgehen. Zum Beispiel, wie man ein exquisiter Programmierer ist und nicht "Schwanzseide", der Programmierer selbst ist eine edle Existenz, nicht wahr? [Klicken, um mitzumachen] Willst du du selbst sein, willst du ein edler Mensch sein, komm schon!

34 Originalartikel veröffentlicht · Gefällt mir12 · Besucher 20.000+

Ich denke du magst

Origin blog.csdn.net/chengxun03/article/details/105476955
Empfohlen
Rangfolge