Ein Artikel über den Greedy-Algorithmus

Schaffen Sie weiter, beschleunigen Sie das Wachstum! Dies ist der zweite Tag meiner Teilnahme an der „Nuggets Daily New Plan · June Update Challenge“, klicken Sie hier, um die Details der Veranstaltung anzuzeigen

Einleitung

Menschen sind am Anfang von Natur aus gut, aber unter dem Einfluss ihrer eigenen Erfahrung, ihres Lebensumfelds und anderer Faktoren werden die Menschen nach und nach Gier, Hass und Verblendung entwickeln. Tatsächlich haben nicht nur Menschen Gier, sondern auch unsere Algorithmen werden Gier haben.Heute werde ich das nächste Algorithmusmodell mit Gier vorstellen, den Greedy-Algorithmus, um zu sehen, wie ein Algorithmus Gier erzeugt.

was ist gieriger algorithmus

Beim Analysieren und Lösen eines Problems sind die Berechnungsoptionen für jeden Schritt optimal oder die besten, und auf diese Weise wird erwartet, dass das endgültige Berechnungsergebnis optimal ist. Das heißt, der Algorithmus sucht die optimale Gesamtlösung, indem er zuerst die lokale optimale Lösung sucht.

Die grundlegenden Schritte des Greedy-Algorithmus:

1. Definieren Sie zuerst das Problem und bestimmen Sie, ob das Problemmodell geeignet ist, den Greedy-Algorithmus zu verwenden, dh das Maximalwertproblem zu lösen;

2. das Problem des Findens des Extremwerts zerlegen und dann jedes Unterproblem nach dem Zerlegen lösen, wobei versucht wird, die lokal optimale Lösung des aktuellen Unterproblems zu erhalten;

3. Nachdem die lokalen optimalen Lösungen aller Teilprobleme gelöst sind, werden diese lokalen optimalen Lösungen aggregiert und zusammengeführt, um die endgültige globale optimale Lösung zu erhalten, dann ist diese optimale Lösung die optimale Lösung des gesamten Problems.

Bild.png

durch Szenenverständnisalgorithmen

Die Beschreibung des konzeptionellen Algorithmus wird möglicherweise nicht von allen gut verstanden, daher muss sie in Kombination mit einigen tatsächlichen Szenarien erklärt werden. Hier nehmen wir das Beispiel, wie wir Veränderungen in unserer Kindheit finden, um uns einzumischen. Obwohl jetzt jeder mit Mobiltelefonen scannt und bezahlt, ist es lange her, dass sie Geld berührt haben, aber es behindert nicht das Problem der Veränderung, was uns helfen kann, den Implementierungsprozess des gierigen Algorithmus zu verstehen.

Angenommen, Sie sind der Besitzer eines kleinen Einzelhandelsgeschäfts und haben Wechselgeld in verschiedenen Stückelungen, z. B. 1 Yuan, 3 Yuan und 5 Yuan. Zu dieser Zeit kam ein Kind, um etwas zu kaufen, und er bat Sie, das kleinste Kleingeld zu finden, damit es in seine Tasche passt. Angenommen, wir erfassen die Änderung als c[0], c[1], c[2]... , und das Geld, das Kinder zum Kauf von Snacks verwenden, wird als Gesamtbetrag erfasst. Dann haben wir gerade erwähnt, dass das Kind das geringste Wechselgeld bekommen möchte, wir können es in ein Programmierproblem umwandeln, um die optimale Lösung zu finden, das heißt, bei gegebener Gesamtzahl erfordert die Lösung die Summe der Mindestzahl von c gleich der angegebenen Gesamtsumme sein.

Beispiel 1:

Angenommen, die zu findende Änderung ist 11 und die aktuelle Änderung ist 1, 3 und 5.

Eingabe: gesamt=11, c[0]=1, c[1]=3, c[2]=5

Ausgang: 3

Problemanalyse

通过提取问题中的关键词“最少”,我们可以明确此问题的实际上就是一个求解最值的问题,只要找到满足条件的最小零钱张数就可以解决找回最少零钱的问题了。想要找到最小的零钱张数,我们最先想到的方法就是进行穷举,列举出来所有可能的满足总数为11的零钱组合。如下图所示,再在这些组合中找到使用零钱张数最少的组合再计算具体的张数,我们就可以获得最终的答案了。但是这显然不是一个好的解决思路。因为如果对应的total很大,我们穷举的结果将会爆发性增长。

Bild.png

那有没有更好的解决办法呢?这时候我们就可以考虑下贪心算法的实现了,找到满足要求的最小张数零钱。既然是找零钱,那么我们可以将问题转换为找到满足总数total的零钱最少需要几个步骤,实际上就是将问题拆分到每次找零钱的小步骤中,而贪心算法的核心就是需要在每个小步骤中贪心寻求局部最优解。因此在找零钱的每个步骤中,都需要找到该步骤中对应的最优解零钱大小,接下来我们来一起看下贪心算法执行过程。这里假设各个面值的零钱比较充足。

在寻找零钱的步骤中,首先获取最大面值为5的零钱(贪心,上来就找最大的),接着发现剩余待找零钱6=11-5,于是继续寻找最大的面值为5的零钱(继续贪心),待找零钱1=6-5。此时只要获取面值为1的零钱就可以完成任务了,再将之前步骤中的结果整合到一起,最终我们得出想要获取total为11的最少张数零钱的大小为3。通过这样的分析,贪心算法是不是也没有那么的复杂。

Bild.png

对应的代码实现如下所示:

 
/**
 * @Author: mufeng
 * @Date: 2022/5/15 15:33
 * @Version: V 1.0.0
 * @Description: 计算最小满足条件的零钱张数
 */
public class MinChangeCountSolution {
 
    public static void main(String[] args) {
        int values[] = {5,5,3,3,1};
        System.out.println(getMinChangeCount(11, values));
 
    }
 
    //假设values数组从大到小排列
    static int getMinChangeCount(int total, int[] values) {
        int rest = total;
        int result = 0;
        int count = values.length;
 
        // 从大到小遍历所有面值
        for (int i = 0; i < count; ++ i) {
            //计算需要几张这种面值的零钱
            int needCount = rest / values[i];
            //计算使用后的余额
            rest -= needCount * values[i];
            //计数增加
            result += needCount;
 
            if (rest == 0) {
                return result;
            }
        }
        //没有找到合适的面值
        return -1;
    }
 
}
复制代码

以上我们分析了贪心算法的大致实现过程,但是实际上还是有问题的。不知道大家有没有发现,由于贪心算法过于贪心,每一个步骤都想要找到局部最优解。那么假如在上面的例子中,我们没有1块钱的零钱,上述代码的返回结果是-1,即没有符合条件的答案。但是实际并非如此,也就是说5,3,3也是满足条件的,但是上述代码却没有找到。

Es gibt also immer noch ein Problem mit dem obigen Code.Der entscheidende Punkt ist, dass Sie, wenn Sie feststellen, dass es kein 1-Yuan-Wechselgeld gibt, zurückgehen und sehen müssen, ob Sie das 5-Yuan-Wechselgeld im zweiten Schritt in 3-Yuan-Wechselgeld ändern können und dann nachfolgende Iterationen durchführen Solche Schritte, dann können Sie Kombinationen wie 5,3,3 finden.

Bild.png

Zusammenfassung Dieser Artikel analysiert hauptsächlich den spezifischen Implementierungsprozess des Greedy-Algorithmus durch die Beschreibung des Greedy-Algorithmus, kombiniert mit dem konkreten Beispiel des Geldwechsels. Gleichzeitig werden die Mängel des Greedy-Algorithmus analysiert, das heißt, dass er leicht in die Falle der lokalen Optimalität tappt und sich nicht selbst befreien kann, was dazu führt, dass das Endergebnis, das die Bedingungen erfüllt, nicht angegeben werden kann.


Es ist nicht einfach zu erstellen. Wenn Sie den Artikel nicht schlecht finden, liken Sie ihn bitte + Favorit + Kommentar, um ihn auszutauschen. Wie üblich werde ich am Ende des Artikels ein Gedicht mit Ihnen teilen.

Ding Fengbo · Die Rückkehr des Südchinesischen Meeres an Wang Dingguos Diener Yu Niang

Chang beneide die Welt Zhuo Yulang, die Götter sollten betteln und Kuchen bestellen. Obwohl der Qingge die weißen Zähne weitergab, frischte der Wind auf, und der fliegende Schnee und das Flammenmeer wurden kühl.

Wenn man von Tausenden von Kilometern zurückkehrt, wird das Gesicht immer weniger und das Lächeln ist immer noch mit dem Duft von Lingmei. Er fragte, ob Lingnan gut sein solle, aber er sagte: Dieser Ort des Seelenfriedens ist meine Heimatstadt.

Ich denke du magst

Origin juejin.im/post/7102976328516763679
Empfohlen
Rangfolge