Heim  >  Artikel  >  Backend-Entwicklung  >  Berechnen Sie alle Permutationen ganzer Zahlen, die gemäß gegebenen Bedingungen einen azyklischen Graphen bilden

Berechnen Sie alle Permutationen ganzer Zahlen, die gemäß gegebenen Bedingungen einen azyklischen Graphen bilden

WBOY
WBOYnach vorne
2023-09-07 11:37:02869Durchsuche

Berechnen Sie alle Permutationen ganzer Zahlen, die gemäß gegebenen Bedingungen einen azyklischen Graphen bilden

Um Stufen innerhalb einer ganzen Zahl N zu zählen, erfordert die Bildung eines azyklischen Graphen die Untersuchung jeder möglichen Änderung und die Prüfung, ob sie gemäß den gegebenen Bedingungen einen azyklischen Graphen bilden. Diese Bedingungen können mit der Struktur von Koordinationsgraphen zusammenhängen, die durch Änderungen gebildet werden, wobei das Fehlen von Zyklen auf Azyklizität hinweist. Dieses Problem beinhaltet Konzepte aus der Graphentheorie und kann durch Tiefensuche oder dynamische Programmierung gelöst werden. Die Tiefensuche funktioniert durch die rekursive Untersuchung jeder Phase, und die dynamische Programmierung optimiert Schleifen durch die Speicherung von Zwischenergebnissen. Die am Ende gezählte Anzahl gültiger Stufen zeigt die Anzahl der Wege innerhalb einer ganzen Zahl N an, die in einem azyklischen Graphen organisiert werden können, der vorgegebene Bedingungen erfüllt.

Anwendungsmethode

  • Tiefensuche (DFS)

  • Dynamische Programmierung

Tiefensuche (DFS)

Bei der DFS-Methode zum Generieren von Gruppierungen mit einer bestimmten Operation beginnen wir mit der angegebenen Zahl und berechnen neu, bis der Wert 1 erreicht ist. Wir gehen wie folgt vor: Wenn die Zahl tatsächlich 2 ist, teilen wir sie durch 2; wenn es eine ungerade Zahl ist, multiplizieren wir sie mit 3 und addieren 1. Wir aktualisieren die Zahlen, um die nicht verwendeten Ergebnisse widerzuspiegeln, und fügen sie der Reihe hinzu. Dieser Vorgang wird fortgesetzt, bis die Zahl 1 erreicht. Die resultierende Folge stellt eine sich wiederholende Collatz-Folge für eine gegebene Startnummer dar. Dieser Ansatz ermöglicht es uns, den Verlauf von Zahlen zu verfolgen, während sie sich durch wiederholte Berechnungen ändern, Muster aufzudecken und das Verhalten von Collatz-Sequenzen zu berücksichtigen. Es bietet eine einfache und reproduzierbare Methode zur Generierung von Sequenzen und zur Analyse der faszinierenden Merkmale dieses mathematischen Wunderwerks.

Algorithmus

  • Wählen Sie einen Startpunkt, um Ihre Reise zu beginnen

  • Markieren Sie Zentren als besucht, um zu überwachen, welche Zentren proaktiv Nachforschungen angestellt haben.

  • Besuchen Sie die nicht besuchten Nachbarn des laufenden zentralen Knotens (falls vorhanden). Um die Nachbarn eines laufenden zentralen Knotens zu bestimmen, müssen Sie eine infektiöse Beschreibung des Graphen kennen (z. B. eine Näherungsliste oder ein Näherungsrahmen).

  • Angenommen, es gibt nicht besuchte Nachbarn, wählen Sie einen von ihnen aus und wiederholen Sie die Stufen 2 bis 4 von diesem Nachbarn (rekursiv).

  • Vorausgesetzt, es gibt keine unbesuchten Nachbarn, gehen Sie zum früheren Zentrum zurück und setzen Sie die Untersuchung von dort aus fort (wenn möglich). Dieser Schritt ist entscheidend, um alle potenziellen Pfade im Diagramm zu untersuchen

  • Re-Hashing der Stufen 2 bis 5, bis alle zentralen Knoten im Diagramm besucht wurden. Wenn das Diagramm nicht verbunden ist (mehrere Teile enthält), müssen Sie möglicherweise eine Tiefensuche (DFS) beginnend mit einem nicht besuchten zentralen Knoten durchführen.

Die chinesische Übersetzung von

Beispiel

lautet:

Beispiel

#include <iostream>
#include <vector>

using namespace std;

void dfs(int node, vector<vector<int>>& graph, vector<bool>& visited) {
   visited[node] = true;
   cout << "Visited hub: " << node << endl;
   for (int neighbor : graph[node]) {
      if (!visited[neighbor]) {
         cout << "Moving to neighbor: " << neighbor << endl;
         dfs(neighbor, graph, visited);
      }
   }
}

int main() {
   vector<vector<int>> graph = {
      {1, 2},
      {0, 2, 3},
      {0, 1, 3},
      {1, 2, 4},
      {3}
   };
   int hubs = graph.size();
   vector<bool> visited(hubs, false);
   int startingHub = 0;
   cout << "DFS Traversal starting from hub " << startingHub << ":" << endl;
   dfs(startingHub, graph, visited);
   return 0;
}

Ausgabe

DFS Traversal starting from hub 0:
Visited hub: 0
Moving to neighbor: 1
Visited hub: 1
Moving to neighbor: 2
Visited hub: 2
Moving to neighbor: 3
Visited hub: 3
Moving to neighbor: 4
Visited hub: 4

Dynamische Programmierung

Bei diesem Ansatz können wir dynamische Programmierung nutzen, um die Anzahl der azyklischen Stufen zum Erreichen von N effizient zu berechnen. Wir werden eine DP-Tabelle definieren, wobei dp[i] die Anzahl der nichtzyklischen Übergänge darstellt, die mit der Nummer I enden.

Algorithmus

  • Untersuchen Sie das Problem und entscheiden Sie, ob es in kleinere Teilprobleme zerlegt werden kann. Wenn das mehrfache Lösen desselben Teilproblems ineffizient ist, kann die dynamische Programmierung die Lösung verbessern, indem sie sich die Lösungen für die Teilprobleme merkt.

  • Drücken Sie die Anordnung eines größeren Problems als die Anordnung seiner Unterprobleme aus. Diese doppelte Verbindung ist der Schlüssel zur Lösung des Problems mithilfe von DP.

  • Angesichts der wiederholten Zusammenhänge erstellen Sie eine Tabelle oder Anzeige, um die Antworten auf die Unterfragen zu speichern. Dadurch werden Doppelzählungen vermieden.

  • Füllen Sie das Formular aus, beginnend mit dem kleinsten Teilproblem, normalerweise in einem Bottom-up-Ansatz, oder verwenden Sie Memoisierung, um die Lösung in einem rekursiven Prozess zu speichern und abzurufen

  • Wenn alle Teilprobleme gelöst sind, trennen Sie die endgültige Anordnung von der DP-Tabelle oder der gespeicherten Anzeige.

Die chinesische Übersetzung von

Beispiel

lautet:

Beispiel

#include <iostream>
#include <vector>
using namespace std;

int knapsackHelper(vector<vector<int>>& dp, vector<int>& weights, vector<int>& values, int n, int capacity) {
   if (n == 0 || capacity == 0) {
      return 0;
   }

   if (dp[n][capacity] != -1) {
      return dp[n][capacity];
   }

   if (weights[n - 1] <= capacity) {
      dp[n][capacity] = max(values[n - 1] + knapsackHelper(dp, weights, values, n - 1, capacity - weights[n - 1]),
                      knapsackHelper(dp, weights, values, n - 1, capacity));
   } else {
      dp[n][capacity] = knapsackHelper(dp, weights, values, n - 1, capacity);
   }

   return dp[n][capacity];
}

int knapsack(vector<int>& weights, vector<int>& values, int capacity) {
   int n = weights.size();
   vector<vector<int>> dp(n + 1, vector<int>(capacity + 1, -1));
   return knapsackHelper(dp, weights, values, n, capacity);
}

int main() {
   vector<int> weights = {10, 20, 30};
   vector<int> values = {60, 100, 120};
   int capacity = 50;
   cout << "Maximum value in Knapsack: " << knapsack(weights, values, capacity) << endl;
   return 0;
}

Ausgabe

Maximum value in Knapsack: 220

Fazit

Die Phasen der Berechnung der Art und Weise, wie azyklische Graphen gebildet werden können, umfassen die Untersuchung verschiedener Anordnungen von ganzen Zahlen, um sicherzustellen, dass sie eine bestimmte Bedingung erfüllen. DFS untersucht Phasen rekursiv, während DP die Schleife durch Memoisierung verbessert. Diese beiden Methoden bieten wichtige Möglichkeiten zur Lösung dieses Problems. Die Wahl der Methode hängt von den Randbedingungen und der Größe von N ab. Mithilfe dieser Methoden können wir die Anzahl der zulässigen Stufen effizient ermitteln und so besser verstehen, wie Zahlen gemäß vorgegebenen Bedingungen azyklische Diagramme bilden können.

Das obige ist der detaillierte Inhalt vonBerechnen Sie alle Permutationen ganzer Zahlen, die gemäß gegebenen Bedingungen einen azyklischen Graphen bilden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:tutorialspoint.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen