Greedy-Algorithmus und seine Implementierung in C++
Der Greedy-Algorithmus ist eine häufig verwendete Algorithmusidee und wird häufig bei vielen Problemen eingesetzt. Der Kerngedanke besteht darin, bei der Entscheidungsfindung in jedem Schritt nur die unmittelbar optimale Lösung zu berücksichtigen, ohne die langfristigen Auswirkungen zu berücksichtigen.
In C++ umfasst die Implementierung gieriger Algorithmen häufig grundlegende Operationen wie Sortieren und Datenverarbeitung. Im Folgenden stellen wir die Idee des Greedy-Algorithmus und seine Implementierung in C++ für mehrere typische Probleme vor.
1. Aktivitätsplanungsproblem
Bei einer Reihe von Aktivitäten hat jede Aktivität ihre Startzeit und Endzeit, und eine Person kann jeweils nur an einer Aktivität teilnehmen. Fragen Sie, wie Sie Aktivitäten organisieren, um sicherzustellen, dass diese Person an der größtmöglichen Anzahl an Aktivitäten teilnimmt.
Die Idee des Greedy-Algorithmus besteht darin, zunächst jede Aktivität in aufsteigender Reihenfolge nach der Endzeit zu sortieren und dann ausgehend von der ersten Aktivität die Aktivität mit der frühesten Endzeit als erste Aktivität auszuwählen, an der teilgenommen werden soll. Wählen Sie dann aus den verbleibenden Aktivitäten die Aktivität mit der frühesten Endzeit aus, die mit der aktuellen Aktivität kompatibel ist, und machen Sie sie zur nächsten Aktivität, an der Sie teilnehmen möchten. Wiederholen Sie diesen Vorgang, bis alle Aktivitäten geplant sind.
Das Folgende ist die C++-Code-Implementierung:
struct activity { int start; int end; } bool cmp(activity a, activity b) { return a.end < b.end; } int arrangeActivities(activity arr[], int n) { sort(arr, arr + n, cmp); int cnt = 1; int lastEnd = arr[0].end; for (int i = 1; i < n; i++) { if (arr[i].start >= lastEnd) { cnt++; lastEnd = arr[i].end; } } return cnt; }
2. Huffman-Codierungsproblem
Bei einem gegebenen Satz von Gewichtswerten ist es erforderlich, diese in binäre Zeichenfolgen ungleicher Länge zu codieren, sodass die Codierungslänge der Summe aller Werte entspricht wird minimiert.
Die Idee des Greedy-Algorithmus besteht darin, zunächst die Gewichte in aufsteigender Reihenfolge zu sortieren, in jedem Schritt die beiden Knoten mit den kleinsten Gewichten auszuwählen, um sie zu einem neuen Knoten zu kombinieren, und sein Gewicht als Summe der Gewichte zu definieren der beiden Knoten. Wiederholen Sie diesen Vorgang, bis alle Knoten zu einem Wurzelknoten zusammengefasst sind. Der diesem Wurzelknoten entsprechende Binärbaum ist der Huffman-Baum. Beim Durchlaufen des Huffman-Baums bedeutet das Gehen nach links das Hinzufügen von 0 und das Gehen nach rechts das Hinzufügen von 1, sodass die entsprechende Kodierung jedes Gewichts gelöst werden kann.
Das Folgende ist die C++-Code-Implementierung:
struct Node { int weight; int parent, leftChild, rightChild; } bool cmp(Node a, Node b) { return a.weight < b.weight; } void buildHuffmanTree(Node arr[], int n) { // 初始化所有节点 for (int i = 0; i < n; i++) { arr[i].parent = -1; arr[i].leftChild = -1; arr[i].rightChild = -1; } // 构建哈夫曼树 for (int i = n; i < 2 * n - 1; i++) { int minIndex1 = -1, minIndex2 = -1; for (int j = 0; j < i; j++) { if (arr[j].parent == -1) { if (minIndex1 == -1) { minIndex1 = j; } else if (minIndex2 == -1) { minIndex2 = j; } else { if (arr[j].weight < arr[minIndex1].weight) { minIndex2 = minIndex1; minIndex1 = j; } else if (arr[j].weight < arr[minIndex2].weight) { minIndex2 = j; } } } } arr[minIndex1].parent = i; arr[minIndex2].parent = i; arr[i].leftChild = minIndex1; arr[i].rightChild = minIndex2; arr[i].weight = arr[minIndex1].weight + arr[minIndex2].weight; } } void findHuffmanCode(Node arr[], int n) { // 从叶节点开始遍历哈夫曼树 for (int i = 0; i < n; i++) { string code = ""; int currentNode = i; while (arr[currentNode].parent != -1) { int parent = arr[currentNode].parent; if (arr[parent].leftChild == currentNode) { code = "0" + code; } else { code = "1" + code; } currentNode = parent; } cout << code << endl; } }
3. Lösen Sie das Münzwechselproblem
Angesichts des Nennwerts eines Münzsatzes und der Menge des Wechselgelds, die vorgenommen werden muss, fragen Sie, wie viele Münzen benötigt werden, um das Problem zu lösen Menge.
Die Idee des Greedy-Algorithmus besteht darin, die Münzen zunächst in absteigender Reihenfolge zu sortieren, dann mit der Münze mit dem größten Nennwert zu beginnen, die Münze so lange zu nehmen, bis keine Auswahl mehr getroffen werden kann, und dann die Münze zu verwenden Münze mit dem nächsthöheren Nennwert, bis der gesamte Betrag eingesammelt ist.
Das Folgende ist die C++-Code-Implementierung:
bool cmp(int a, int b) { return a > b; } int minCoinNum(int coins[], int n, int amount) { sort(coins, coins + n, cmp); int cnt = 0; for (int i = 0; i < n; i++) { if (amount >= coins[i]) { cnt += amount / coins[i]; amount -= coins[i] * (amount / coins[i]); } } return cnt; }
Im tatsächlichen Entwicklungsprozess ist der Greedy-Algorithmus oft nicht die optimale Lösung, aber aufgrund seiner Einfachheit und Effizienz ist er weit verbreitet. Durch die Einführung der oben genannten drei typischen Probleme glaube ich, dass die Leser die Idee des Greedy-Algorithmus und seine Implementierung in C++ besser verstehen und beherrschen können.
Das obige ist der detaillierte Inhalt vonGreedy-Algorithmus und seine Implementierung in C++. 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

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

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



Die Schritte zum Implementieren des Strategiemusters in C++ lauten wie folgt: Definieren Sie die Strategieschnittstelle und deklarieren Sie die Methoden, die ausgeführt werden müssen. Erstellen Sie spezifische Strategieklassen, implementieren Sie jeweils die Schnittstelle und stellen Sie verschiedene Algorithmen bereit. Verwenden Sie eine Kontextklasse, um einen Verweis auf eine konkrete Strategieklasse zu speichern und Operationen darüber auszuführen.

In C wird der Zeichenentyp in Saiten verwendet: 1. Speichern Sie ein einzelnes Zeichen; 2. Verwenden Sie ein Array, um eine Zeichenfolge darzustellen und mit einem Null -Terminator zu enden. 3. Durch eine Saitenbetriebsfunktion arbeiten; 4. Lesen oder geben Sie eine Zeichenfolge von der Tastatur aus.

Ursachen und Lösungen für Fehler Bei der Verwendung von PECL zur Installation von Erweiterungen in der Docker -Umgebung, wenn die Docker -Umgebung verwendet wird, begegnen wir häufig auf einige Kopfschmerzen ...

Die Berechnung von C35 ist im Wesentlichen kombinatorische Mathematik, die die Anzahl der aus 3 von 5 Elementen ausgewählten Kombinationen darstellt. Die Berechnungsformel lautet C53 = 5! / (3! * 2!), Was direkt durch Schleifen berechnet werden kann, um die Effizienz zu verbessern und Überlauf zu vermeiden. Darüber hinaus ist das Verständnis der Art von Kombinationen und Beherrschen effizienter Berechnungsmethoden von entscheidender Bedeutung, um viele Probleme in den Bereichen Wahrscheinlichkeitsstatistik, Kryptographie, Algorithmus -Design usw. zu lösen.

Multithreading in der Sprache kann die Programmeffizienz erheblich verbessern. Es gibt vier Hauptmethoden, um Multithreading in C -Sprache zu implementieren: Erstellen Sie unabhängige Prozesse: Erstellen Sie mehrere unabhängig laufende Prozesse. Jeder Prozess hat seinen eigenen Speicherplatz. Pseudo-MultitHhreading: Erstellen Sie mehrere Ausführungsströme in einem Prozess, der denselben Speicherplatz freigibt und abwechselnd ausführt. Multi-Thread-Bibliothek: Verwenden Sie Multi-Thread-Bibliotheken wie PThreads, um Threads zu erstellen und zu verwalten, wodurch reichhaltige Funktionen der Thread-Betriebsfunktionen bereitgestellt werden. Coroutine: Eine leichte Multi-Thread-Implementierung, die Aufgaben in kleine Unteraufgaben unterteilt und sie wiederum ausführt.

STD :: Einzigartige Entfernung benachbarte doppelte Elemente im Container und bewegt sie bis zum Ende, wodurch ein Iterator auf das erste doppelte Element zeigt. STD :: Distanz berechnet den Abstand zwischen zwei Iteratoren, dh die Anzahl der Elemente, auf die sie hinweisen. Diese beiden Funktionen sind nützlich, um den Code zu optimieren und die Effizienz zu verbessern, aber es gibt auch einige Fallstricke, auf die geachtet werden muss, wie z. STD :: Distanz ist im Umgang mit nicht randomischen Zugriffs-Iteratoren weniger effizient. Indem Sie diese Funktionen und Best Practices beherrschen, können Sie die Leistung dieser beiden Funktionen voll ausnutzen.

In der C -Sprache ist die Snake -Nomenklatur eine Konvention zum Codierungsstil, bei der Unterstriche zum Verbinden mehrerer Wörter mit Variablennamen oder Funktionsnamen angeschlossen werden, um die Lesbarkeit zu verbessern. Obwohl es die Zusammenstellung und den Betrieb nicht beeinträchtigen wird, müssen langwierige Benennung, IDE -Unterstützung und historisches Gepäck berücksichtigt werden.

Die Funktion Release_Semaphor in C wird verwendet, um das erhaltene Semaphor zu freigeben, damit andere Threads oder Prozesse auf gemeinsame Ressourcen zugreifen können. Es erhöht die Semaphorzahl um 1 und ermöglicht es dem Blockierfaden, die Ausführung fortzusetzen.
