<?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[Red&#x2F;Black-Tree]]></title><description><![CDATA[<p>&quot;RB trees have faster inserts than AVL trees but at the expense of slower searches.&quot;</p>
<p>Inwiefern ist dieser Faktor &quot;slower&quot; zu bewerten? Wenn ich nun eine Datenstruktur suche, die mir auf einer statischen Datenbasis möglichst schnelles Suchen ermöglicht, ist dann ein AVL-Baum der Baum meiner Wahl? Ist das &quot;slower&quot; so gering, dass ich eventuell nur einen RB-Tree implementiere und selbst für stark suchlastige Anwendungen einen RB-Tree verwende?</p>
<p>Warum verwendet sowohl Java als auch meine C++-STL-Implementation einen RB-Tree als Map-Implementation? Sind sie generell als schneller zu bewerten im Vergleich zu AVL-Bäumen?</p>
<p>MfG SideWinder</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/153979/red-black-tree</link><generator>RSS for Node</generator><lastBuildDate>Sat, 11 Jul 2026 12:45:00 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/153979.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 23 Jul 2006 00:13:19 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Red&#x2F;Black-Tree on Sun, 23 Jul 2006 00:13:19 GMT]]></title><description><![CDATA[<p>&quot;RB trees have faster inserts than AVL trees but at the expense of slower searches.&quot;</p>
<p>Inwiefern ist dieser Faktor &quot;slower&quot; zu bewerten? Wenn ich nun eine Datenstruktur suche, die mir auf einer statischen Datenbasis möglichst schnelles Suchen ermöglicht, ist dann ein AVL-Baum der Baum meiner Wahl? Ist das &quot;slower&quot; so gering, dass ich eventuell nur einen RB-Tree implementiere und selbst für stark suchlastige Anwendungen einen RB-Tree verwende?</p>
<p>Warum verwendet sowohl Java als auch meine C++-STL-Implementation einen RB-Tree als Map-Implementation? Sind sie generell als schneller zu bewerten im Vergleich zu AVL-Bäumen?</p>
<p>MfG SideWinder</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1102420</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1102420</guid><dc:creator><![CDATA[SideWinder]]></dc:creator><pubDate>Sun, 23 Jul 2006 00:13:19 GMT</pubDate></item><item><title><![CDATA[Reply to Red&#x2F;Black-Tree on Sun, 23 Jul 2006 00:24:53 GMT]]></title><description><![CDATA[<p>Wenn ich scon dabei bin: Sind bei R/B-Bäumen rekursive oder iterative Implementierungen schneller?</p>
<p>MfG SideWinder</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1102422</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1102422</guid><dc:creator><![CDATA[SideWinder]]></dc:creator><pubDate>Sun, 23 Jul 2006 00:24:53 GMT</pubDate></item><item><title><![CDATA[Reply to Red&#x2F;Black-Tree on Sun, 23 Jul 2006 00:38:12 GMT]]></title><description><![CDATA[<p><a href="http://groups.google.li/group/comp.lang.c++.moderated/browse_thread/thread/13feb73ec4135cf8/14698a6506daafdb%2314698a6506daafdb" rel="nofollow">http://groups.google.li/group/comp.lang.c++.moderated/browse_thread/thread/13feb73ec4135cf8/14698a6506daafdb%2314698a6506daafdb</a></p>
<blockquote>
<p>... but it turns<br />
out that in the real world, RB-trees have some advantages. Of course,<br />
the primary benefit of an AVL tree is that it is always optimally<br />
balanced. That is, you cannot create a binary tree that is more<br />
balanced than an equivalent AVL tree, which means that you always get<br />
the fastest search time, in terms of number of nodes visited.</p>
<p>Unfortunately, AVL trees typically do not contain a parent pointer,<br />
which means that traversal is slower than with an RB-tree that has<br />
parent pointers. That's because traversing to a sibling node requires<br />
starting over at the root, rather than only moving up the tree as far<br />
as you need to.</p>
<p>The other factor is that AVL trees are actually a bit *too* balanced.<br />
Because they maintain the optimal balance for any given tree, they<br />
perform rotations more often than is necessary to get good balanced<br />
tree operation. So even though one side of an RB tree may be twice<br />
as high as the other side, this imbalance is paid for in the reduced<br />
number of rotations on insert and removal operations. Of course, in<br />
specific applications, one design might be always better than the<br />
other, but in general, these are the major reasons why RB-trees are<br />
favored over AVL trees. If I recall, the rotations in an RB-tree are<br />
slightly simpler because there are fewer cases to consider, but I<br />
think it is a very minor advantage.</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1102423</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1102423</guid><dc:creator><![CDATA[borg]]></dc:creator><pubDate>Sun, 23 Jul 2006 00:38:12 GMT</pubDate></item><item><title><![CDATA[Reply to Red&#x2F;Black-Tree on Sun, 23 Jul 2006 09:10:17 GMT]]></title><description><![CDATA[<p>borg schrieb:</p>
<blockquote>
<p>Unfortunately, AVL trees typically do not contain a parent pointer,<br />
which means that traversal is slower than with an RB-tree that has<br />
parent pointers. That's because traversing to a sibling node requires<br />
starting over at the root, rather than only moving up the tree as far<br />
as you need to.</p>
</blockquote>
<p>Zumindest das einfache Durchlaufen der Elemente kann man aber trotzdem hinkriegen, indem man den Blätter noch nen next und previous pointer verpaßt und so die Blätter in ne Liste aufnimmt. Praktischerweise muß man beim rotieren diese Liste nicht umordnen. Auch die Suche nach dem größten bzw. kleinsten Element wird so in konstanter Zeit möglich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1102462</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1102462</guid><dc:creator><![CDATA[Jester]]></dc:creator><pubDate>Sun, 23 Jul 2006 09:10:17 GMT</pubDate></item><item><title><![CDATA[Reply to Red&#x2F;Black-Tree on Sun, 23 Jul 2006 09:16:59 GMT]]></title><description><![CDATA[<p>Ein RB-Tree hat höchstens Höhe 2 log(n+1) und ein AVL-Baum afaik log(n+1). Somit ist die Suche beim AVL-Tree im Durchschnitt günstiger als beim RB-Tree..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1102463</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1102463</guid><dc:creator><![CDATA[life]]></dc:creator><pubDate>Sun, 23 Jul 2006 09:16:59 GMT</pubDate></item><item><title><![CDATA[Reply to Red&#x2F;Black-Tree on Sun, 23 Jul 2006 10:06:54 GMT]]></title><description><![CDATA[<p>Dann verstehe ich aber nicht wieso sie bei einer Map (die ja vorzugsweise dem Auflösen von Key-&gt;Value dient und daher meistens sehr suchlastig benützt wird) einen RB-Tree und keinen AVL-Tree verwenden.</p>
<p>RB-Trees scheinen mir ja auf Grund ihres geringeren Aufwands bei Insert/Delete für stark dynamische Datenstrukturen eine Option zu sein.</p>
<p>MfG SideWinder</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1102474</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1102474</guid><dc:creator><![CDATA[SideWinder]]></dc:creator><pubDate>Sun, 23 Jul 2006 10:06:54 GMT</pubDate></item><item><title><![CDATA[Reply to Red&#x2F;Black-Tree on Sun, 23 Jul 2006 10:25:46 GMT]]></title><description><![CDATA[<p>Vermutlich wirst du sehr viel mehr suchen als ändern müssen, damit sich der AVL-Tree lohnt. Die Implementierer der Map wissen nicht, wie ihre Map einmal verwendet werden wird, deshalb müssen sie Annehmen, dass man so und so viel sucht und so und so viel verändert. Der Unterschied bei der Suchzeit zwischen den beiden Bäumen scheint ausreichend gering zu sein, dass die verringerten Kosten zum Verändern das locker wettmachen. Letztlich ist das aber alles nur statistisches Rumgetue, oder es hat sich aus der Praxis ergeben. Es ist O(log n) zum Suchen, mehr finde ich in den meisten Fällen nicht besonders wichtig.</p>
<p>Wenn du total statische Daten hast, kannst du sowieso erstmal noch viel mehr Aufwand betreiben, um die Datenstrukturen aufzubauen. Für das reine Suchen eine Hashtable, für größer/kleiner suchen einen AVL-Baum oder bei riesigen Datenmengen einen B-Baum, der die Cache-Größen berücksichtigt.</p>
<p>Du kannst aber auch einfach die std::map benutzen und das wird dann schon passen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1102481</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1102481</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 23 Jul 2006 10:25:46 GMT</pubDate></item><item><title><![CDATA[Reply to Red&#x2F;Black-Tree on Sun, 23 Jul 2006 10:42:40 GMT]]></title><description><![CDATA[<p>Hmm wenn ich das hier so lese wäre es gut wenn man die Implementation des Maps einfach per Policy bestimmen könnte. Dann kann man selbst aussuchen was für den eigenbedarf besser wäre <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>BR<br />
Vinzenz</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1102488</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1102488</guid><dc:creator><![CDATA[evilissimo]]></dc:creator><pubDate>Sun, 23 Jul 2006 10:42:40 GMT</pubDate></item><item><title><![CDATA[Reply to Red&#x2F;Black-Tree on Sun, 23 Jul 2006 13:02:33 GMT]]></title><description><![CDATA[<blockquote>
<p>Unfortunately, AVL trees typically do not contain a parent pointer,<br />
which means that traversal is slower than with an RB-tree that has<br />
parent pointers. That's because traversing to a sibling node requires<br />
starting over at the root, rather than only moving up the tree as far<br />
as you need to.</p>
</blockquote>
<p>das ist doch ein implementierungsdetail, meine avl-tree node schaut so aus von den membern her:</p>
<pre><code class="language-cpp">T*				m_pLeft;
	T*				m_pRight;
	T*				m_pParent;
	DSINT			m_Height;
</code></pre>
<p>dadurch ist sie bei 32bit systemen auf 32byte alligned und bei 64bit systemen auf 64byte.</p>
<p>Bei einem test, bei dem ich bei hunderttausenden dreiecken die eckpunkte mergen möchte, indem ich, falls ein eckpunkt noch nicht in der map vorhanden ist, den neu in die map stecke, ist mein AVL ca 30% fixer als die map der STL-port und ca 20% fixer als die map von der microsoft stl.</p>
<p>meiner persönlichen überlegung nach ist ein AVL-tree schneller, weil:<br />
- ist schneller beim durchsuchen<br />
- langsammer beim einfügen<br />
da aber zum einfügen erstmal die richtige position &quot;gesucht&quot; wird, hebt sich das paar mal mehr rotieren gegen die suchdauer auf.<br />
- löschen? da eine node weiß wo sie steckt, dürfte die zeit dabei konstant sein (natürlich kommt rotieren hinzu)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1102521</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1102521</guid><dc:creator><![CDATA[rapso]]></dc:creator><pubDate>Sun, 23 Jul 2006 13:02:33 GMT</pubDate></item><item><title><![CDATA[Reply to Red&#x2F;Black-Tree on Sun, 23 Jul 2006 15:55:59 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/1029">@rapso</a>: Schau dir ganz einfach mal die STL-Implementierung an. Die bringen meistens haufenweise Überprüfungen, Verkomplizierungen, etc. mit sich. Wenn es um Performance geht würde ich jetzt nicht unbedingt auf die MSVC-STL setzen.</p>
<p>Ich habe jetzt erstmal einen RB-Tree implementiert, da ich den sowieso noch nicht gekannt habe und mich so gut einarbeiten kann und zweitens sich die Entwickler der JavaVM und der einzelnen STL-Ports sicher auch Gedanken gemacht haben.</p>
<p>Rapsos Überlegungen stimmen dann ja wohl eher für große Bäume wo ein Höhenunterschied von Faktor 2 sich ordentlich auf die Performance auswirken kann. Bei Bäumen bis zu 50 Elementen würde ich aber doch dem RB-Tree den Vorrang geben. Die 3 Such-Schleifen-Durchläufe mehr machen imho den Rotationsaufwand nicht wett.</p>
<p>MfG SideWinder</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1102639</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1102639</guid><dc:creator><![CDATA[SideWinder]]></dc:creator><pubDate>Sun, 23 Jul 2006 15:55:59 GMT</pubDate></item><item><title><![CDATA[Reply to Red&#x2F;Black-Tree on Sun, 23 Jul 2006 15:59:34 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/1029">@rapso</a>: Zum 32bit-Alignment deines Nodes: Wo ist da der Data-Ptr? Du als Low-Level-Fuchs kannst mir dann doch sicher auch hier noch helfen:</p>
<p>Bei mir sieht das noch so aus:</p>
<pre><code class="language-cpp">Element data; // sizeof(Element)
Node* up; // 32 Bit
Node* left; // 32 Bit
Node* right; // 32 Bit
Bool color; // 8 Bit
</code></pre>
<p>Wäre folgendes besser?</p>
<pre><code class="language-cpp">Element* data; // 32 Bit
Node* up; // 32 Bit
Node* left; // 32 Bit
Node* right; // 32 Bit
Int color; // 32 Bit;
</code></pre>
<p>MfG SideWinder</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1102642</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1102642</guid><dc:creator><![CDATA[SideWinder]]></dc:creator><pubDate>Sun, 23 Jul 2006 15:59:34 GMT</pubDate></item><item><title><![CDATA[Reply to Red&#x2F;Black-Tree on Sun, 23 Jul 2006 16:06:13 GMT]]></title><description><![CDATA[<p>Wenn rapso zum Einfügen auch noch vorher suchen muss, kann ich mir gut vorstellen, dass die Rotationsdauer vernachlässigbar wird, was dann ein Pluspunkt für den AVL ist. Das ist aber nicht etwas, nach dem ich die STL implementieren könnte, weil ich nicht in jedem Fall davon ausgehen kann, dass ich vorher suchen muss (EDIT: Zum Beispiel beim Einfügen von mehreren benachbarten Werten muss ich beim RB Baum weniger oft die Einfügeposition suchen). So ne Policy wäre wirklich nicht schlecht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1102643</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1102643</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 23 Jul 2006 16:06:13 GMT</pubDate></item><item><title><![CDATA[Reply to Red&#x2F;Black-Tree on Sun, 23 Jul 2006 18:20:26 GMT]]></title><description><![CDATA[<p>Und nochmal BTW@rapso: Würdest du mir eventuell deine AVL-Baum-Implementierung schicken damit ich sie mit meinem R/B-Baum vergleichen kann?</p>
<p>MfG SideWinder</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1102735</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1102735</guid><dc:creator><![CDATA[SideWinder]]></dc:creator><pubDate>Sun, 23 Jul 2006 18:20:26 GMT</pubDate></item><item><title><![CDATA[Reply to Red&#x2F;Black-Tree on Mon, 24 Jul 2006 10:25:31 GMT]]></title><description><![CDATA[<p>einen dataptr hab ich nicht, da die node ein template ist, dass sich um die objekte legt (die sind bei mir auch 32byte alligned, zumeist). dadurch kann man ein wenig performance gewinnen, weil beim durchgang durch den tree immer auf die data-objekte (wegen dem vergleich) durchgeführt wird, das resultiert in random data-reads (mehr als schon sowieso wegen dem baum vorhanden ist).</p>
<p>du solltest immer versuchen zumindestens 32bit zu allignen, 32byte is schon optimal für die meisten cpus.<br />
wenn du immer auf 32bit allignst, dann könntest du die untersten bits der pointer als deinen bool für Red/Black nehmen und würdest auch ein wenig speicher sparen, was am ende fixer sein kann.</p>
<p>und ja, für 50 elemente könnte ein R/B vielleicht schneller sein, vielleicht ist das rotieren aber auch nicht so teuer dass ein AVL fixer ist. aber so kleine dinge (50 elemente) sind meistens nicht performancerelavant und wenn doch, dann kann man sich speicherintensivere systeme ausdenken die besser als O(log n) sind ;).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1103027</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1103027</guid><dc:creator><![CDATA[rapso]]></dc:creator><pubDate>Mon, 24 Jul 2006 10:25:31 GMT</pubDate></item></channel></rss>