<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Priority Queue updaten nach Verringern von Schlüssel]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich versuche mich grade daran Prim's Algorithmus mit einer Priority Queue zu implementieren;</p>
<p>Dazu habe ich mir ein Struct angelegt, das die Knoten repräsentiert, so dass ich diese in der PQ ablegen kann und habe die passende comparison class angelegt:</p>
<pre><code>struct Node
{
	int index; //Index des Knotens
	int weight; //Länge der kürzesten Kante die mit Spannbaum verbindet
};

class CompareNodes
{
     public:
     bool operator()(Node&amp; n1, Node&amp; n2)
     {
        if (n1.weight &gt; n2.weight) return true;
        return false;
     }
};
</code></pre>
<p>Im laufe des Algorithmus werden die Werte die im &quot;weight&quot; Feld der Knoten stehen ja immer kleiner, wenn eine neue kürzere Anbindung gefunden wird. Wie kann ich die PQ jetzt dazu anstoßen sich entsprechend neu zu sortieren?</p>
<p>Laut Dokumentation benutzt die PQ von C++ einen Heap, ich könnte also auch direkt selber einen Heap verwenden. Für Heaps gibt es die Funktion make_heap, allerdings will ich nicht jedes mal den Heap komplett neu aufbauen, sondern nur das eine veränderte Element soweit im Heap aufwärts wandern lassen wie nötig.<br />
Oder ist die Funktion so intelligent implementiert, dass sie merkt, dass die Heap-Bedingung nur an einer Stelle verletzt ist?</p>
<p>Danke im Voraus<br />
tela</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/315638/priority-queue-updaten-nach-verringern-von-schlüssel</link><generator>RSS for Node</generator><lastBuildDate>Thu, 30 Jul 2026 15:19:46 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/315638.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 07 Apr 2013 22:57:12 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Priority Queue updaten nach Verringern von Schlüssel on Sun, 07 Apr 2013 22:57:12 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich versuche mich grade daran Prim's Algorithmus mit einer Priority Queue zu implementieren;</p>
<p>Dazu habe ich mir ein Struct angelegt, das die Knoten repräsentiert, so dass ich diese in der PQ ablegen kann und habe die passende comparison class angelegt:</p>
<pre><code>struct Node
{
	int index; //Index des Knotens
	int weight; //Länge der kürzesten Kante die mit Spannbaum verbindet
};

class CompareNodes
{
     public:
     bool operator()(Node&amp; n1, Node&amp; n2)
     {
        if (n1.weight &gt; n2.weight) return true;
        return false;
     }
};
</code></pre>
<p>Im laufe des Algorithmus werden die Werte die im &quot;weight&quot; Feld der Knoten stehen ja immer kleiner, wenn eine neue kürzere Anbindung gefunden wird. Wie kann ich die PQ jetzt dazu anstoßen sich entsprechend neu zu sortieren?</p>
<p>Laut Dokumentation benutzt die PQ von C++ einen Heap, ich könnte also auch direkt selber einen Heap verwenden. Für Heaps gibt es die Funktion make_heap, allerdings will ich nicht jedes mal den Heap komplett neu aufbauen, sondern nur das eine veränderte Element soweit im Heap aufwärts wandern lassen wie nötig.<br />
Oder ist die Funktion so intelligent implementiert, dass sie merkt, dass die Heap-Bedingung nur an einer Stelle verletzt ist?</p>
<p>Danke im Voraus<br />
tela</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2313609</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2313609</guid><dc:creator><![CDATA[tela]]></dc:creator><pubDate>Sun, 07 Apr 2013 22:57:12 GMT</pubDate></item><item><title><![CDATA[Reply to Priority Queue updaten nach Verringern von Schlüssel on Mon, 08 Apr 2013 09:39:07 GMT]]></title><description><![CDATA[<blockquote>
<p>Wie kann ich die PQ jetzt dazu anstoßen sich entsprechend neu zu sortieren?</p>
</blockquote>
<p>Welche PQ? Die aus der Standardbibliothek? Die kann das nicht.</p>
<blockquote>
<p>Oder ist die Funktion so intelligent implementiert, dass sie merkt, dass die Heap-Bedingung nur an einer Stelle verletzt ist?</p>
</blockquote>
<p>Bestimmt nicht.</p>
<p>Aber eventuell kannst du mit den Funktionen trotzdem arbeiten. Ich bin, was Heaps angeht, nicht fit. Aber <a href="http://stackoverflow.com/questions/927631/" rel="nofollow">hier</a> behauptet jemand, dass man aus Heaps in logarithmischer Zeit ein beliebiges Element entfernen kann. Du könntest also versuchen, das Element, deren Priorität du ändern willst, zu entfernen und mit einer neuen Priorität wieder einzufügen.</p>
<p>Als ich mal just4fun den Dijkstra implementierte, hatte ich einfach std::set&lt;pair&lt;double,int&gt;&gt; verwendet, wobei der double-Wert dann die Priorität und der int-Wert der Knotenindex war. Diese Reihenfolge ist übrigens Absicht wegen der lexikographischen Sortierung von Paaren. Ich brauchte dann noch einen Vektor, der mir zu jedem Knotenindex auch diese Kosten speicherte, glaub'ich.</p>
<p>Andere Leute haben für sowas auch schonmal <a href="http://stackoverflow.com/questions/2288241/priority-queue-with-dynamic-item-priorities" rel="nofollow">multimaps</a> verwendet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2313670</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2313670</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 08 Apr 2013 09:39:07 GMT</pubDate></item><item><title><![CDATA[Reply to Priority Queue updaten nach Verringern von Schlüssel on Mon, 08 Apr 2013 09:57:09 GMT]]></title><description><![CDATA[<p>Neben <code>std::make_heap()</code> gibts auch <code>std::push_heap()</code> , um ein neues Element einzufügen. Allerdings wird dabei erwartet, dass das neue Element am Ende des Arrays steht, und zuvor alle Elemente bereits in einer Heap-Struktur stehen.</p>
<p>Wenn du deren Implementierung anschaust und etwas mehr über Heaps liest, sollte es nicht allzu schwer sein, eine Funktion für bestehende Elemente zu schreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2313683</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2313683</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 08 Apr 2013 09:57:09 GMT</pubDate></item><item><title><![CDATA[Reply to Priority Queue updaten nach Verringern von Schlüssel on Mon, 08 Apr 2013 13:14:14 GMT]]></title><description><![CDATA[<p>@Tela,<br />
das Buch ist zwar uralt, aber ich glaube, Kap. 11.2 enthält etwa das, was du suchst.<br />
<a href="http://www.ubreymann.de/stlb.pdf" rel="nofollow">http://www.ubreymann.de/stlb.pdf</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2313743</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2313743</guid><dc:creator><![CDATA[rummelonthebeach]]></dc:creator><pubDate>Mon, 08 Apr 2013 13:14:14 GMT</pubDate></item></channel></rss>