PHP Master | Datenstrukturen für PHP -Entwickler: Diagramme
Key Takeaways
- Diagramme sind mathematische Konstrukte, die zum Modellieren von Beziehungen zwischen Schlüssel-/Wertpaaren verwendet werden, und haben zahlreiche reale Anwendungen wie Netzwerkoptimierung, Verkehrsrouting und soziale Netzwerkanalyse. Sie bestehen aus Scheitelpunkten (Knoten) und Kanten (Zeilen), die sie verbinden, die gerichtet oder ungerichtet und gewichtet oder ungewichtet sind.
- Diagramme können auf zwei Arten dargestellt werden: als Adjazenzmatrix oder Adjazenzliste. Die Adjazenzlisten sind platz effizienter, insbesondere für spärliche Graphen, bei denen die meisten Eckpaare nicht verbunden sind, während Adjazenzmatrizen schnellere Lookups ermöglichen.
- Eine gemeinsame Anwendung der Graphentheorie findet die geringste Anzahl von Hopfen (d. H. Der kürzeste Weg) zwischen zwei beliebigen Knoten. Dies kann mithilfe der Breite-First-Suche erreicht werden, bei der die Grafikpegel durch einen festgelegten Stammknoten durch die Grafikniveau durchquert wird. Dieser Prozess erfordert die Aufrechterhaltung einer Warteschlange von nicht besuchten Knoten. Der Algorithmus von
- Dijkstra wird häufig verwendet, um den kürzesten oder optimalen Pfad zwischen zwei beliebigen Knoten in einem Diagramm zu finden. Dies beinhaltet die Untersuchung jeder Kante zwischen allen möglichen Scheitelpunktpaaren, die vom Quellknoten beginnen, und die Aufrechterhaltung eines aktualisierten Satzes von Scheitelpunkten mit dem kürzesten Gesamtabstand, bis der Zielknoten erreicht ist.
die geringste Anzahl von Hops
Eine gemeinsame Anwendung der Graphentheorie besteht darin, die geringste Anzahl von Hopfen zwischen zwei beliebigen Knoten zu finden. Wie bei Bäumen können Diagramme auf zwei Arten durchquert werden: Tiefen- oder Breite. Wir haben im vorherigen Artikel die Suche in der Tiefe zuerst behandelt. Schauen wir uns also die Breite der ersten Suche an. Betrachten Sie die folgende Grafik:
1. Create a queue 2. Enqueue the root node and mark it as visited 3. While the queue is not empty do: 3a. dequeue the current node 3b. if the current node is the one we're looking for then stop 3c. else enqueue each unvisited adjacent node and mark as visited
Darstellung des Diagramms
Es gibt im Allgemeinen zwei Möglichkeiten, ein Diagramm darzustellen: entweder als Adjazenzmatrix oder als Adjazenzliste. Die obige Grafik, die als Adjazenzliste dargestellt wird, sieht Folgendes aus:
1. Create a queue 2. Enqueue the root node and mark it as visited 3. While the queue is not empty do: 3a. dequeue the current node 3b. if the current node is the one we're looking for then stop 3c. else enqueue each unvisited adjacent node and mark as visited
<span><span><?php </span></span><span><span>$graph = array( </span></span><span> <span>'A' => array('B', 'F'), </span></span><span> <span>'B' => array('A', 'D', 'E'), </span></span><span> <span>'C' => array('F'), </span></span><span> <span>'D' => array('B', 'E'), </span></span><span> <span>'E' => array('B', 'D', 'F'), </span></span><span> <span>'F' => array('A', 'E', 'C'), </span></span><span><span>);</span></span>
<span><span><?php </span></span><span><span>class Graph </span></span><span><span>{ </span></span><span> <span>protected $graph; </span></span><span> <span>protected $visited = array(); </span></span><span> </span><span> <span>public function __construct($graph) { </span></span><span> <span>$this->graph = $graph; </span></span><span> <span>} </span></span><span> </span><span> <span>// find least number of hops (edges) between 2 nodes </span></span><span> <span>// (vertices) </span></span><span> <span>public function breadthFirstSearch($origin, $destination) { </span></span><span> <span>// mark all nodes as unvisited </span></span><span> <span>foreach ($this->graph as $vertex => $adj) { </span></span><span> <span>$this->visited[$vertex] = false; </span></span><span> <span>} </span></span><span> </span><span> <span>// create an empty queue </span></span><span> <span>$q = new SplQueue(); </span></span><span> </span><span> <span>// enqueue the origin vertex and mark as visited </span></span><span> <span>$q->enqueue($origin); </span></span><span> <span>$this->visited[$origin] = true; </span></span><span> </span><span> <span>// this is used to track the path back from each node </span></span><span> <span>$path = array(); </span></span><span> <span>$path[$origin] = new SplDoublyLinkedList(); </span></span><span> <span>$path[$origin]->setIteratorMode( </span></span><span> <span>SplDoublyLinkedList<span>::</span>IT_MODE_FIFO|SplDoublyLinkedList<span>::</span>IT_MODE_KEEP </span></span><span> <span>); </span></span><span> </span><span> <span>$path[$origin]->push($origin); </span></span><span> </span><span> <span>$found = false; </span></span><span> <span>// while queue is not empty and destination not found </span></span><span> <span>while (!$q->isEmpty() && $q->bottom() != $destination) { </span></span><span> <span>$t = $q->dequeue(); </span></span><span> </span><span> <span>if (!empty($this->graph[$t])) { </span></span><span> <span>// for each adjacent neighbor </span></span><span> <span>foreach ($this->graph[$t] as $vertex) { </span></span><span> <span>if (!$this->visited[$vertex]) { </span></span><span> <span>// if not yet visited, enqueue vertex and mark </span></span><span> <span>// as visited </span></span><span> <span>$q->enqueue($vertex); </span></span><span> <span>$this->visited[$vertex] = true; </span></span><span> <span>// add vertex to current path </span></span><span> <span>$path[$vertex] = clone $path[$t]; </span></span><span> <span>$path[$vertex]->push($vertex); </span></span><span> <span>} </span></span><span> <span>} </span></span><span> <span>} </span></span><span> <span>} </span></span><span> </span><span> <span>if (isset($path[$destination])) { </span></span><span> <span>echo "<span><span>$origin</span> to <span>$destination</span> in "</span>, </span></span><span> <span>count($path[$destination]) - 1, </span></span><span> <span>" hopsn"; </span></span><span> <span>$sep = ''; </span></span><span> <span>foreach ($path[$destination] as $vertex) { </span></span><span> <span>echo $sep, $vertex; </span></span><span> <span>$sep = '->'; </span></span><span> <span>} </span></span><span> <span>echo "n"; </span></span><span> <span>} </span></span><span> <span>else { </span></span><span> <span>echo "No route from <span><span>$origin</span> to <span>$destinationn</span>"</span>; </span></span><span> <span>} </span></span><span> <span>} </span></span><span><span>}</span></span>
Finden Sie den kürzesten Pfad
Ein weiteres häufiges Problem ist es, den optimalsten Weg zwischen zwei beliebigen Knoten zu finden. Früher erwähnte ich die Fahranleitung von Googlemap als Beispiel dafür. Weitere Anwendungen sind Planungsreisen, Straßenverkehrsmanagement und Zug-/Busplanung. Einer der berühmtesten Algorithmen, die dieses Problem angehen, wurde 1959 von einem 29-jährigen Informatiker namens Edsger W. Dijkstra erfunden. Im Allgemeinen umfasst die Lösung von Dijkstra die Untersuchung jeder Kante zwischen allen möglichen Scheitelpunktpaaren, die vom Quellknoten beginnen, und die Aufrechterhaltung eines aktualisierten Satzes von Scheitelpunkten mit kürzester Gesamtentfernung, bis der Zielknoten erreicht ist oder nicht erreicht ist, je nachdem, welcher Fall auch nicht sein kann. Es gibt verschiedene Möglichkeiten, die Lösung zu implementieren, und in der Tat wurden über Jahre nach 1959 viele Verbesserungen - unter Verwendung von Minheaps, Prioritätsquellen und Fibonacci -Haufen - an Dijkstras ursprünglicher Algorithmus gemacht. Einige verbesserte Leistung, während andere so konzipiert waren, dass sie Mängel in der Dijkstra -Lösung behandeln, da sie nur mit positiv gewichteten Graphen arbeitete (bei denen die Gewichte positive Werte sind). Hier ist ein Beispiel für eine (positive) gewichtete Grafik:
1. Create a queue 2. Enqueue the root node and mark it as visited 3. While the queue is not empty do: 3a. dequeue the current node 3b. if the current node is the one we're looking for then stop 3c. else enqueue each unvisited adjacent node and mark as visited
<span><span><?php </span></span><span><span>$graph = array( </span></span><span> <span>'A' => array('B', 'F'), </span></span><span> <span>'B' => array('A', 'D', 'E'), </span></span><span> <span>'C' => array('F'), </span></span><span> <span>'D' => array('B', 'E'), </span></span><span> <span>'E' => array('B', 'D', 'F'), </span></span><span> <span>'F' => array('A', 'E', 'C'), </span></span><span><span>);</span></span>
<span><span><?php </span></span><span><span>class Graph </span></span><span><span>{ </span></span><span> <span>protected $graph; </span></span><span> <span>protected $visited = array(); </span></span><span> </span><span> <span>public function __construct($graph) { </span></span><span> <span>$this->graph = $graph; </span></span><span> <span>} </span></span><span> </span><span> <span>// find least number of hops (edges) between 2 nodes </span></span><span> <span>// (vertices) </span></span><span> <span>public function breadthFirstSearch($origin, $destination) { </span></span><span> <span>// mark all nodes as unvisited </span></span><span> <span>foreach ($this->graph as $vertex => $adj) { </span></span><span> <span>$this->visited[$vertex] = false; </span></span><span> <span>} </span></span><span> </span><span> <span>// create an empty queue </span></span><span> <span>$q = new SplQueue(); </span></span><span> </span><span> <span>// enqueue the origin vertex and mark as visited </span></span><span> <span>$q->enqueue($origin); </span></span><span> <span>$this->visited[$origin] = true; </span></span><span> </span><span> <span>// this is used to track the path back from each node </span></span><span> <span>$path = array(); </span></span><span> <span>$path[$origin] = new SplDoublyLinkedList(); </span></span><span> <span>$path[$origin]->setIteratorMode( </span></span><span> <span>SplDoublyLinkedList<span>::</span>IT_MODE_FIFO|SplDoublyLinkedList<span>::</span>IT_MODE_KEEP </span></span><span> <span>); </span></span><span> </span><span> <span>$path[$origin]->push($origin); </span></span><span> </span><span> <span>$found = false; </span></span><span> <span>// while queue is not empty and destination not found </span></span><span> <span>while (!$q->isEmpty() && $q->bottom() != $destination) { </span></span><span> <span>$t = $q->dequeue(); </span></span><span> </span><span> <span>if (!empty($this->graph[$t])) { </span></span><span> <span>// for each adjacent neighbor </span></span><span> <span>foreach ($this->graph[$t] as $vertex) { </span></span><span> <span>if (!$this->visited[$vertex]) { </span></span><span> <span>// if not yet visited, enqueue vertex and mark </span></span><span> <span>// as visited </span></span><span> <span>$q->enqueue($vertex); </span></span><span> <span>$this->visited[$vertex] = true; </span></span><span> <span>// add vertex to current path </span></span><span> <span>$path[$vertex] = clone $path[$t]; </span></span><span> <span>$path[$vertex]->push($vertex); </span></span><span> <span>} </span></span><span> <span>} </span></span><span> <span>} </span></span><span> <span>} </span></span><span> </span><span> <span>if (isset($path[$destination])) { </span></span><span> <span>echo "<span><span>$origin</span> to <span>$destination</span> in "</span>, </span></span><span> <span>count($path[$destination]) - 1, </span></span><span> <span>" hopsn"; </span></span><span> <span>$sep = ''; </span></span><span> <span>foreach ($path[$destination] as $vertex) { </span></span><span> <span>echo $sep, $vertex; </span></span><span> <span>$sep = '->'; </span></span><span> <span>} </span></span><span> <span>echo "n"; </span></span><span> <span>} </span></span><span> <span>else { </span></span><span> <span>echo "No route from <span><span>$origin</span> to <span>$destinationn</span>"</span>; </span></span><span> <span>} </span></span><span> <span>} </span></span><span><span>}</span></span>
Zusammenfassung
In diesem Artikel habe ich die Grundlagen der Graphentheorie, zwei Möglichkeiten zur Darstellung von Grafiken und zwei grundlegende Probleme in der Anwendung der Graphentheorie eingeführt. Ich habe Ihnen gezeigt, wie eine Breite-First-Suche verwendet wird, um die geringste Anzahl von Hopfen zwischen zwei beliebigen Knoten zu finden und wie Dijkstra-Lösung verwendet wird, um den kürzesten Weg zwischen zwei beliebigen Knoten zu finden. Bild über Fotolienhäufig gestellte Fragen (FAQs) zu Grafiken in Datenstrukturen
Was ist der Unterschied zwischen einem Diagramm und einem Baum in Datenstrukturen? Ein Baum ist eine Art Grafik, aber nicht alle Grafiken sind Bäume. Ein Baum ist ein verbundenes Diagramm ohne Zyklen. Es hat eine hierarchische Struktur mit einem Wurzelknoten und einem untergeordneten Knoten. Jeder Knoten in einem Baum hat einen einzigartigen Weg von der Wurzel. Andererseits kann ein Diagramm Zyklen haben und seine Struktur ist komplexer. Es kann verbunden oder getrennt werden und Knoten können mehrere Pfade zwischen sich haben.
Wie werden Grafiken in Datenstrukturen dargestellt? Liste. Eine Adjazenzmatrix ist ein 2D -Array der Größe V x V, wobei V die Anzahl der Scheitelpunkte im Diagramm ist. Wenn zwischen den Scheitelpunkten I und J eine Kante gibt, ist die Zelle an der Kreuzung von Zeile I und Spalte J 1, ansonsten 0. Eine Adjazenzliste ist ein Array von verknüpften Listen. Der Index des Arrays repräsentiert einen Scheitelpunkt und jedes Element in seiner verknüpften Liste der anderen Scheitelpunkte, die mit dem Scheitelpunkt eine Kante bilden. sind verschiedene Arten von Grafiken in Datenstrukturen. Ein einfaches Diagramm ist ein Diagramm ohne Schleifen und nicht mehr als eine Kante zwischen zwei Eckpunkten. Ein Multigraph kann mehrere Kanten zwischen Scheitelpunkten haben. Ein komplettes Diagramm ist ein einfaches Diagramm, in dem jedes Eckpaar durch eine Kante verbunden ist. Ein gewichteter Diagramm weist jeder Kante ein Gewicht zu. Ein gerichteter Diagramm (oder Digraph) hat Kanten mit einer Richtung. Die Kanten zeigen von einem Scheitelpunkt zum anderen.
Welche Anwendungen von Grafiken in der Informatik werden in zahlreichen Anwendungen in der Informatik
Diagramme verwendet. Sie werden in sozialen Netzwerken verwendet, um Verbindungen zwischen Menschen darzustellen. Sie werden im Web -Crawling verwendet, um Webseiten zu besuchen und einen Suchindex zu erstellen. Sie werden in Netzwerk -Routing -Algorithmen verwendet, um den besten Weg zwischen zwei Knoten zu finden. Sie werden in Biologie verwendet, um biologische Netzwerke zu modellieren und zu analysieren. Sie werden auch in Computergrafik- und Physik-Simulationen verwendet. (BFS). DFS erforscht vor dem Backtracking so weit wie möglich an jedem Zweig. Es verwendet eine Stapeldatenstruktur. BFS untersucht alle Scheitelpunkte in der gegenwärtigen Tiefe, bevor er zur nächsten Ebene geht. Es verwendet eine Warteschlangendatenstruktur. Jeder Schlüssel im HashMap ist ein Scheitelpunkt und sein Wert ist eine verknüpfte Liste, die die Scheitelpunkte enthält, an die er angeschlossen ist. in zwei disjunkte Sätze unterteilt werden, so dass jede Kante einen Scheitelpunkt in einem Set an einen Scheitelpunkt im anderen Satz verbindet. Kein Kanten verbindet Scheitelpunkte innerhalb desselben Satzes.
Was ist ein Untergraphen? Es hat einige (oder alle) Eckpunkte des Originalgrafiks und einige (oder alle) Kanten des Originalgraps.
Was ist ein Zyklus in einem Diagramm? Ein Pfad, der am selben Scheitelpunkt beginnt und endet und mindestens eine Kante hat.
Was ist ein Pfad in einem Diagramm? von Konsekutive Eckpunkte sind durch eine Kante verbunden.
Das obige ist der detaillierte Inhalt vonPHP Master | Datenstrukturen für PHP -Entwickler: Diagramme. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

JWT ist ein offener Standard, der auf JSON basiert und zur sicheren Übertragung von Informationen zwischen Parteien verwendet wird, hauptsächlich für die Identitätsauthentifizierung und den Informationsaustausch. 1. JWT besteht aus drei Teilen: Header, Nutzlast und Signatur. 2. Das Arbeitsprinzip von JWT enthält drei Schritte: Generierung von JWT, Überprüfung von JWT und Parsingnayload. 3. Bei Verwendung von JWT zur Authentifizierung in PHP kann JWT generiert und überprüft werden, und die Funktionen und Berechtigungsinformationen der Benutzer können in die erweiterte Verwendung aufgenommen werden. 4. Häufige Fehler sind Signaturüberprüfungsfehler, Token -Ablauf und übergroße Nutzlast. Zu Debugging -Fähigkeiten gehört die Verwendung von Debugging -Tools und Protokollierung. 5. Leistungsoptimierung und Best Practices umfassen die Verwendung geeigneter Signaturalgorithmen, das Einstellen von Gültigkeitsperioden angemessen.

Die Aufzählungsfunktion in Php8.1 verbessert die Klarheit und Type des Codes, indem benannte Konstanten definiert werden. 1) Aufzählungen können Ganzzahlen, Zeichenfolgen oder Objekte sein, die die Lesbarkeit der Code und die Type der Type verbessern. 2) Die Aufzählung basiert auf der Klasse und unterstützt objektorientierte Merkmale wie Traversal und Reflexion. 3) Die Aufzählung kann zum Vergleich und zur Zuordnung verwendet werden, um die Sicherheit der Typ zu gewährleisten. 4) Aufzählung unterstützt das Hinzufügen von Methoden zur Implementierung einer komplexen Logik. 5) Strenge Typ Überprüfung und Fehlerbehandlung können häufig auftretende Fehler vermeiden. 6) Die Aufzählung verringert den magischen Wert und verbessert die Wartbarkeit, achten Sie jedoch auf die Leistungsoptimierung.

Die Hijacking der Sitzung kann in den folgenden Schritten erreicht werden: 1. Erhalten Sie die Sitzungs -ID, 2. Verwenden Sie die Sitzungs -ID, 3. Halten Sie die Sitzung aktiv. Zu den Methoden zur Verhinderung der Sitzung der Sitzung in PHP gehören: 1. Verwenden Sie die Funktion Session_regenerate_id (), um die Sitzungs -ID zu regenerieren. 2. Store -Sitzungsdaten über die Datenbank, 3. Stellen Sie sicher, dass alle Sitzungsdaten über HTTPS übertragen werden.

Die Anwendung des soliden Prinzips in der PHP -Entwicklung umfasst: 1. Prinzip der Einzelverantwortung (SRP): Jede Klasse ist nur für eine Funktion verantwortlich. 2. Open and Close Principle (OCP): Änderungen werden eher durch Erweiterung als durch Modifikation erreicht. 3.. Lischs Substitutionsprinzip (LSP): Unterklassen können Basisklassen ersetzen, ohne die Programmgenauigkeit zu beeinträchtigen. 4. Schnittstellen-Isolationsprinzip (ISP): Verwenden Sie feinkörnige Schnittstellen, um Abhängigkeiten und nicht verwendete Methoden zu vermeiden. 5. Abhängigkeitsinversionsprinzip (DIP): Hoch- und niedrige Module beruhen auf der Abstraktion und werden durch Abhängigkeitsinjektion implementiert.

Statische Bindung (statisch: :) implementiert die späte statische Bindung (LSB) in PHP, sodass das Aufrufen von Klassen in statischen Kontexten anstatt Klassen zu definieren. 1) Der Analyseprozess wird zur Laufzeit durchgeführt.

Die RESTAPI -Designprinzipien umfassen Ressourcendefinition, URI -Design, HTTP -Methodenverbrauch, Statuscode -Nutzung, Versionskontrolle und Hassoas. 1. Ressourcen sollten durch Substantive dargestellt und in einer Hierarchie aufrechterhalten werden. 2. HTTP -Methoden sollten ihrer Semantik entsprechen, z. B. Get wird verwendet, um Ressourcen zu erhalten. 3. Der Statuscode sollte korrekt verwendet werden, z. B. 404 bedeutet, dass die Ressource nicht vorhanden ist. 4. Die Versionskontrolle kann über URI oder Header implementiert werden. 5. Hateoas startet Client -Operationen durch Links als Antwort.

In PHP wird das Ausnahmebehandlung durch den Versuch, Fang, schließlich und werfen Keywords erreicht. 1) Der Try -Block umgibt den Code, der Ausnahmen auslösen kann. 2) Der Catch -Block behandelt Ausnahmen; 3) Block stellt schließlich sicher, dass der Code immer ausgeführt wird. 4) Wurf wird verwendet, um Ausnahmen manuell zu werfen. Diese Mechanismen verbessern die Robustheit und Wartbarkeit Ihres Codes.

Die Hauptfunktion anonymer Klassen in PHP besteht darin, einmalige Objekte zu erstellen. 1. Anonyme Klassen ermöglichen es, Klassen ohne Namen direkt im Code zu definieren, was für vorübergehende Anforderungen geeignet ist. 2. Sie können Klassen erben oder Schnittstellen implementieren, um die Flexibilität zu erhöhen. 3. Achten Sie bei der Verwendung auf Leistung und Code -Lesbarkeit und vermeiden Sie es, dieselben anonymen Klassen wiederholt zu definieren.
