<?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[Stress für B-Baum]]></title><description><![CDATA[<p>Hallo,<br />
ich habe für einen B-Baum Suchen und Einfügen implementiert. Jetzt wollte ich den mal in eine Stress-Situation bringen, indem er 10000 Elemente speichern und durchsuchen soll. Dabei legt das Programm ein merkwürdiges Verhalten zu Tage. Wenn ich manche Elemente suchen will, z.B. 5892, scheitert er. Ich weiß, das ist echt viel RAM, der damit belegt wird, aber er müsste doch eine bad_alloc werfen, wenn er keinen Heap-Speicherplatz bekommt?!<br />
Jetzt habe ich in der Schleife, in der ich im Baum jedes Element suche, Ausgaben hingestellt. Abgesehen davon, dass er mittendrin irgendwann abstürzt (sprich: Prozess reagiert nicht mehr), gibt er mir beim Durchlauf mit double-Werten immer nur jeden 4. Wert aus. z.B.:</p>
<pre><code class="language-cpp">std::cout &lt;&lt; &quot;Finden...&quot;;
for(double i = 0; i &lt; 10000; i++) {
	if(!db.find(i))
		std::cerr &lt;&lt; '\a';
	else
		std::cout &lt;&lt; i &lt;&lt; &quot; da\n&quot;;
}
</code></pre>
<p>Ausgabe:</p>
<pre><code>...
4096
4100
4104
4108
...
</code></pre>
<p>Ich hoffe, dass das nichts mit meinem Algorithmus zu tun hat, sondern nur mit der Hardware. Was konkret könnte da passieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/260051/stress-für-b-baum</link><generator>RSS for Node</generator><lastBuildDate>Tue, 08 Sep 2026 05:28:33 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/260051.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 31 Jan 2010 12:09:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Stress für B-Baum on Sun, 31 Jan 2010 12:09:39 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich habe für einen B-Baum Suchen und Einfügen implementiert. Jetzt wollte ich den mal in eine Stress-Situation bringen, indem er 10000 Elemente speichern und durchsuchen soll. Dabei legt das Programm ein merkwürdiges Verhalten zu Tage. Wenn ich manche Elemente suchen will, z.B. 5892, scheitert er. Ich weiß, das ist echt viel RAM, der damit belegt wird, aber er müsste doch eine bad_alloc werfen, wenn er keinen Heap-Speicherplatz bekommt?!<br />
Jetzt habe ich in der Schleife, in der ich im Baum jedes Element suche, Ausgaben hingestellt. Abgesehen davon, dass er mittendrin irgendwann abstürzt (sprich: Prozess reagiert nicht mehr), gibt er mir beim Durchlauf mit double-Werten immer nur jeden 4. Wert aus. z.B.:</p>
<pre><code class="language-cpp">std::cout &lt;&lt; &quot;Finden...&quot;;
for(double i = 0; i &lt; 10000; i++) {
	if(!db.find(i))
		std::cerr &lt;&lt; '\a';
	else
		std::cout &lt;&lt; i &lt;&lt; &quot; da\n&quot;;
}
</code></pre>
<p>Ausgabe:</p>
<pre><code>...
4096
4100
4104
4108
...
</code></pre>
<p>Ich hoffe, dass das nichts mit meinem Algorithmus zu tun hat, sondern nur mit der Hardware. Was konkret könnte da passieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1847973</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1847973</guid><dc:creator><![CDATA[Ad aCTa]]></dc:creator><pubDate>Sun, 31 Jan 2010 12:09:39 GMT</pubDate></item><item><title><![CDATA[Reply to Stress für B-Baum on Sun, 31 Jan 2010 12:41:18 GMT]]></title><description><![CDATA[<p>10000 Elemente sind jetzt nicht so wahnsinnig viel, hättest du 100000000 gesagt, aber so? Da wird wohl in deinem Algorithmus was nicht stimmen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1847989</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1847989</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Sun, 31 Jan 2010 12:41:18 GMT</pubDate></item><item><title><![CDATA[Reply to Stress für B-Baum on Sun, 31 Jan 2010 13:02:26 GMT]]></title><description><![CDATA[<p>Ich habe es jetzt ein klitzekleines bisschen plattformabhängig gemacht:</p>
<pre><code class="language-cpp">tree&lt;3, double, std::string&gt; db;
std::cout &lt;&lt; &quot;Elemente werden eingefuegt...&quot; &lt;&lt; std::endl;
for(double i = 0; i &lt; 40000; i++) {
	std::cout &lt;&lt; i &lt;&lt; std::endl;
	Sleep(1);
	db.insert(std::make_pair(i, &quot;Database&quot;));
}

std::cout &lt;&lt; &quot;Finden...&quot;;
for(double i = 0; i &lt; 40000; i++) {
	Sleep(1);
	if(!db.find(i))
		std::cerr &lt;&lt; '\a';
	else
		std::cout &lt;&lt; i &lt;&lt; &quot; da\n&quot;;
}
</code></pre>
<p>In der Hoffnung, dass die CPU nur eine kleine Pause durch Sleep() braucht. Ich würde 10000 nicht unterschätzen: dazu gehören ja ein double-Wert, ein String, der intern den 9-Byte-große C-String hat; eine std::list, ein std::vector mal 10.000 plus einen Wert an 4-Byte-Zeigern, auch irgendwo in den hundertern/tausendern.<br />
Die erste Schleife gibt hintereinanderweg die Zahlen von 0 - 39999 aus. In der cmd.exe kann ich die Ausgabe durch &quot;Auswahl&quot; auch kurz stoppen. In der zweiten Schleife kann ich das nicht, und die Double-Werte sehen so aus:</p>
<pre><code>1645
1648
1651
1654
1657
1661
</code></pre>
<p>3er oder 4er-Schritte?! Dann bricht er irgendwann in der Schleife ab. (Diesmal bei 1718). Es kommt auch vor, dass er ganz durchkommt, am Ende dann aber einfach einfriert, wenn die letzte Zeile der main() erreicht wurde. Wahrscheinlich ist das deleten in den Destruktoren sehr aufwändig. Alles etwas mysteriös...</p>
<p>Edit: nehme ich beim Suchen das Sleep() raus, kommt ich sogar in höhere Gefile, ca. um 3000. Was ist da los? Kann das überhaupt mit meinem Algo zusammen hängen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1848002</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1848002</guid><dc:creator><![CDATA[Ad aCTa]]></dc:creator><pubDate>Sun, 31 Jan 2010 13:02:26 GMT</pubDate></item><item><title><![CDATA[Reply to Stress für B-Baum on Sun, 31 Jan 2010 13:28:32 GMT]]></title><description><![CDATA[<p>Das mit dem '\a' seh ich jetzt erst. Piepst es denn jedesmal, wenn ein Element nicht gefunden wird? Das muss ja der Fall sein, wenn bei der Ausgabe in Dreierschritten vorgegangen wird. Wenn nein, würde ich tippen, dass dein Rechner mit dem Abspielen unhörbarer Piepstöne beschäftigt ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1848029</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1848029</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Sun, 31 Jan 2010 13:28:32 GMT</pubDate></item><item><title><![CDATA[Reply to Stress für B-Baum on Sun, 31 Jan 2010 13:40:43 GMT]]></title><description><![CDATA[<p>Allerdings, die Piepse sind unhörbar. Ich dachte, mit Sleep() hat er evtl. dafür Zeit. Naja, jetzt weiß ich, dass der Algorithmus irgendwo spinnen muss. Ab 28 Elementen fängt er an zu spinnen. Ich mach mich dann mal auf die Suche. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1848038</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1848038</guid><dc:creator><![CDATA[Ad aCTa]]></dc:creator><pubDate>Sun, 31 Jan 2010 13:40:43 GMT</pubDate></item><item><title><![CDATA[Reply to Stress für B-Baum on Sun, 31 Jan 2010 15:01:18 GMT]]></title><description><![CDATA[<p>Hast du die Klasse tree selber geschrieben? Wie sieht die denn aus?<br />
Ein double als Schleifenvariable sieht komisch aus, mach lieber ein int draus wenn es sowieso ganzzahlig ist. Es wird umgecastet falls nötig.</p>
<p>1. Die viererschritte sehen verdächtig nach Addresssrpüngen aus, könnte sein das du mit Pointer statt den tatsächlichen Werten arbeitest und der crash wegen unerlauben RAM zugriff auftaucht.</p>
<p>2. Taucht kein Crash auf sondern friert es einfach ein tippe ich auf eine Endlosschleife, die durch verändern von i in db.find(i) stattfinden(Was natürlich auf keinen fall passieren sollte!) -&gt; Das kannst du überprüfen indem du das mal probierst:</p>
<pre><code class="language-cpp">std::cout &lt;&lt; &quot;Finden...&quot;;
for(unsigned int i = 0; i &lt; 10000; i++) {
    //Kopieren der Schleifenvariable, um manipulation auszuschließen
    unsigned int tmp = i;
    if(!db.find(tmp))
        std::cerr &lt;&lt; '\a';
    else
        std::cout &lt;&lt; tmp &lt;&lt; &quot; da\n&quot;;
}
</code></pre>
<p>Insgesamt fehlt aber noch Quellcode von der tree Klasse um genaueres zu sagen.<br />
Ob der wirklich auf dem Heap erstellt oder new zum reservieren von RAM verwendet kann man auch nicht erkennen.</p>
<p>EDIT: Hab den C/C++ Code tag gefunden. Ist jetzt alles bunt bunt....</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1848042</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1848042</guid><dc:creator><![CDATA[JaykopX]]></dc:creator><pubDate>Sun, 31 Jan 2010 15:01:18 GMT</pubDate></item><item><title><![CDATA[Reply to Stress für B-Baum on Sun, 31 Jan 2010 14:59:55 GMT]]></title><description><![CDATA[<p>Ich glaube das nicht. Ich bin meinen Algorithmus genauestens durchgegangen und habe den Übeltäter vmtl. gefunden. Die Klasse habe ich selber geschrieben.</p>
<p>Für die, die es interessieren sollte, was Ursache war: Beim Spalten eines vollen Nodes, der noch Childnodes besitzt, ist das Problem, dass die Childs nicht verteilt wurden. Demnach hatte der Node keine Children, die eigentlichen Children gehen verloren (Memory Leak), der Node ist offiziell Blattknoten (obwohl er ein innerer Node ist) und neue Elemente werden falsch inserted. Der Suchalgorithmus findet den Schlüssel dann nicht mehr. Ich muss jetzt also noch prüfen, ob der zu teilende Node Children hat, denn falls ja, muss ich diese auf die resultierenden beiden neuen Nodes verteilen. (Gratulation an die, die das jetzt verstanden haben. <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>PS: Das ist mit Abstand das komplizierteste, was ich mit C++ je gemacht habe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1848090</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1848090</guid><dc:creator><![CDATA[Ad aCTa]]></dc:creator><pubDate>Sun, 31 Jan 2010 14:59:55 GMT</pubDate></item><item><title><![CDATA[Reply to Stress für B-Baum on Mon, 01 Feb 2010 21:50:28 GMT]]></title><description><![CDATA[<p>So, ich habe den B-Baum nun fertiggestellt und ausgiebig getestet (mit 5.000.000 Elementen erfolgreich). Jetzt habe ich ein anderes Problem: die Geschwindigkeit. Der Suchalgorithmus ist wirklich sehr schnell, aber das Inserten von 100.000 Elementen dauert 10-12 Sekunden. Ich habe bzgl. der Optimierung noch kaum Ahnung, bin jetzt aber so vorgegangen:</p>
<p>Ich schaute, was so jeder einzelne Insert an Zeit frisst.</p>
<p>Ergebnis:<br />
Die meisten Inserts dauerten 0ms. Es sind insgesamt jedoch immer ca. 11 Sekunden. Um die 750 Einzelfälle dauert ein Insert von 14 - 16ms. Die Summe dieser Einzelfälle ist tatsächlich die gesamte Insert-Laufzeit. Ich lasse mir anschließend aus der Schleife die Werte ausgeben, wo die Laufzeit nicht 0ms betrug.<br />
Die ausgegebenen Werte finde ich interessant. Sie sind jedesmal andere, aber meistens durch 3 teilbar, und wenn nicht, sind sie nur +/- 1 entfernt. 3 war auch die Ordnung des Baumes. Zufall? Ich bild mir da bestimmt nur was ein...</p>
<pre><code class="language-cpp">DWORD total = 0;
std::vector&lt;DWORD&gt; notnull;
std::vector&lt;double&gt; pos;
for(double i = 0; i &lt; 100000; i++) {
	DWORD begin = GetTickCount();
	db.insert(std::make_pair(i, &quot;Database&quot;));
	DWORD end = GetTickCount();
	total += end - begin;
	if(end - begin != 0) {
		notnull.push_back(end - begin);
		pos.push_back(i);
	}
}

std::cout &lt;&lt; &quot;Total: &quot; &lt;&lt; total &lt;&lt; std::endl;
std::cout &lt;&lt; notnull.size() &lt;&lt; &quot; von 100000 Insertions dauerten laenger als 0ms.&quot; &lt;&lt; std::endl;
std::cout &lt;&lt; &quot;Durchschnittlich brauchten diese Insertions je &quot;
		  &lt;&lt; std::accumulate(notnull.begin(), notnull.end(), 0) / notnull.size()
		  &lt;&lt; &quot;ms, zusammen: &quot; &lt;&lt; std::accumulate(notnull.begin(), notnull.end(), 0)
		  &lt;&lt; &quot;ms.&quot; &lt;&lt; std::endl;
	std::cout &lt;&lt; &quot;Auswahl an Positionen der langsamen Insertions:&quot; &lt;&lt; std::endl;
for(std::size_t n = 0; n &lt; notnull.size() / 3; n++)
	std::cout &lt;&lt; pos[n] &lt;&lt; std::endl;
</code></pre>
<p>Ich weiß nur nicht, wo ich am Algorithmus nun optimieren könnte. Anhand der Zahlen erkenne ich (noch) kein konsistentes Muster, worauf ich schließen könnte. Das ist bestimmt nur hardwareabhängiges Zeug, worauf ich mir hier einen Reim machen will. Wie kann ich Engpässe in meinem Algorithmus finden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1848888</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1848888</guid><dc:creator><![CDATA[Ad aCTa]]></dc:creator><pubDate>Mon, 01 Feb 2010 21:50:28 GMT</pubDate></item><item><title><![CDATA[Reply to Stress für B-Baum on Mon, 01 Feb 2010 22:31:16 GMT]]></title><description><![CDATA[<p>sag mal du baust da einen ganz normalen b-tree, kann der nicht iwie ausarten also ich meine das du am ende eine linked list hast, und dir im schlimmsten fall 100.000 knoten anschauen mußt bis du deine einfüge stelle gefunden hast? auch wenn da das einfügen nicht schneller ist, so ist bei einem avl-tree die höhe auf 1,44*log2(n) limitiert, wär doch mal ein versuch wert, oder einen red-black tree der hat auch eine maximale höhe von 2*log2(n) und ist beim einfügen etwas schneller</p>
<p>lg lolo</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1848905</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1848905</guid><dc:creator><![CDATA[noobLolo]]></dc:creator><pubDate>Mon, 01 Feb 2010 22:31:16 GMT</pubDate></item><item><title><![CDATA[Reply to Stress für B-Baum on Mon, 01 Feb 2010 22:36:29 GMT]]></title><description><![CDATA[<p>Der B-Baum ist immer balanciert und kann nicht (wirklich nie) zur Liste werden. Das Balancieren erfolgt schon beim Inserten. Der allgemeine Algorithmus des B-Trees ist ja vollkommen in Ordnung, nur habe ich bestimmt bei der Umsetzung irgendwas verbasselt oder schlecht umgesetzt. Ich meine, der binäre Baum der std::map ist um Längen schneller beim Inserten, ich würde gerne den Flaschenhals in meinem Code finden, weiß aber nicht, wie ich beim Suchen von sowas anfangen soll. Diese 80-20-Regel würde ich da gerne mal anwenden, nur, wie finde ich diese 20% Code, die 80% der Laufzeit fressen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1848909</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1848909</guid><dc:creator><![CDATA[Ad aCTa]]></dc:creator><pubDate>Mon, 01 Feb 2010 22:36:29 GMT</pubDate></item><item><title><![CDATA[Reply to Stress für B-Baum on Mon, 01 Feb 2010 22:38:01 GMT]]></title><description><![CDATA[<p>du hast mal von nem Vektor geredet. schau mal, ob dir der nicht voll läuft und er dann auf einmal deine ganze schöne Struktur umkopiert...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1848910</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1848910</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Mon, 01 Feb 2010 22:38:01 GMT</pubDate></item><item><title><![CDATA[Reply to Stress für B-Baum on Mon, 01 Feb 2010 22:49:32 GMT]]></title><description><![CDATA[<p>Ad aCTa schrieb:</p>
<blockquote>
<p>Der B-Baum ist immer balanciert und kann nicht (wirklich nie) zur Liste werden.</p>
</blockquote>
<p>ein normaler b-tree ist nicht balanciert...</p>
<p>Ad aCTa schrieb:</p>
<blockquote>
<p>der binäre Baum der std::map ist um Längen schneller beim Inserten</p>
</blockquote>
<p>das ist auch kein std. binary tree</p>
<p>stl map schrieb:</p>
<blockquote>
<p>Implemented using a self-balancing binary search tree.</p>
</blockquote>
<p>also eher rb oder avl tree</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1848914</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1848914</guid><dc:creator><![CDATA[noobLolo]]></dc:creator><pubDate>Mon, 01 Feb 2010 22:49:32 GMT</pubDate></item><item><title><![CDATA[Reply to Stress für B-Baum on Mon, 01 Feb 2010 22:50:59 GMT]]></title><description><![CDATA[<p><a href="http://en.wikipedia.org/wiki/Self-balancing_binary_search_tree" rel="nofollow">http://en.wikipedia.org/wiki/Self-balancing_binary_search_tree</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1848915</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1848915</guid><dc:creator><![CDATA[wikipedianer]]></dc:creator><pubDate>Mon, 01 Feb 2010 22:50:59 GMT</pubDate></item><item><title><![CDATA[Reply to Stress für B-Baum on Mon, 01 Feb 2010 23:02:18 GMT]]></title><description><![CDATA[<blockquote>
<p>&gt; du hast mal von nem Vektor geredet.</p>
</blockquote>
<p>Jap, der genannte Vektor beinhaltet die Zeiger zu den Childnodes.</p>
<blockquote>
<p>&gt; schau mal, ob dir der nicht voll läuft und er dann auf einmal deine ganze schöne Struktur umkopiert...</p>
</blockquote>
<p>Wie kann ich das verstehen? Bisher habe ich die Elemente, die ich anfüge, immer mit <code>push_back</code> neu alloziiert. An sich habe ich nur 2 Stellen im Code, an denen ich den Vektor beeinflusse:</p>
<pre><code class="language-cpp">// Diese Stelle entscheidet, ob beim Teilen eines Knotens der zu teilende Knoten selber Children hat. Die müssen dann auf die neuen beiden Teilnodes verteilt werden.
/*
Simuliertes Beispiel:
Baum der Ordnung 2, Node voll bei 2*2-1 = 3 Schlüsseln:

                 2 5 &lt;---------- Ich befinde mich in diesem Knoten und sehe:
                / | \                                   |
               /  |  \                                  |
                      \                                \|/
                    7 9 11  &lt;---------- voll, muss geteilt werden und Children
                   /  |  | \            müssen verteilt werden, denn Knoten hat
                  /   |  |  \           auch noch Childnodes
                 6    8  10  12 14

              2 5 9
             / | |  \ 
                 |   \
                 7    11
                 /\   / \
                6 8  10   12 14

*/

//children ist der Vektor mit Zeigern auf Kindknoten
// left und right sind die neuen Teilnodes, auf die die Zeiger nun verteilt werden
if(children[position]-&gt;children.size() &gt; 0)
	for(unsigned i = 0; i &lt; children[position]-&gt;children.size(); i++) {
		if(i &lt; order)
			left-&gt;children.push_back(children[position]-&gt;children[i]);
		else
			right-&gt;children.push_back(children[position]-&gt;children[i]);
}
</code></pre>
<p>Voller als 2 * Ordnung wird der Vektor nicht. Die Reihenfolge behalte ich ja eigentlich auch immer bei.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1848919</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1848919</guid><dc:creator><![CDATA[Ad aCTa]]></dc:creator><pubDate>Mon, 01 Feb 2010 23:02:18 GMT</pubDate></item><item><title><![CDATA[Reply to Stress für B-Baum on Mon, 01 Feb 2010 23:11:37 GMT]]></title><description><![CDATA[<p>noobLolo schrieb:</p>
<blockquote>
<p>Ad aCTa schrieb:</p>
<blockquote>
<p>Der B-Baum ist immer balanciert und kann nicht (wirklich nie) zur Liste werden.</p>
</blockquote>
<p>ein normaler b-tree ist nicht balanciert...</p>
</blockquote>
<p>Dann wartet <a href="http://de.wikipedia.org/wiki/B-Baum" rel="nofollow">http://de.wikipedia.org/wiki/B-Baum</a> auf deine Korrektur: <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1848927</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1848927</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Mon, 01 Feb 2010 23:11:37 GMT</pubDate></item><item><title><![CDATA[Reply to Stress für B-Baum on Mon, 01 Feb 2010 23:25:35 GMT]]></title><description><![CDATA[<p>Bashar schrieb:</p>
<blockquote>
<p>noobLolo schrieb:</p>
<blockquote>
<p>Ad aCTa schrieb:</p>
<blockquote>
<p>Der B-Baum ist immer balanciert und kann nicht (wirklich nie) zur Liste werden.</p>
</blockquote>
<p>ein normaler b-tree ist nicht balanciert...</p>
</blockquote>
<p>Dann wartet <a href="http://de.wikipedia.org/wiki/B-Baum" rel="nofollow">http://de.wikipedia.org/wiki/B-Baum</a> auf deine Korrektur: <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
</blockquote>
<p>sry dachte das b-tree steht als abkürzung für einen binary-tree <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1848935</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1848935</guid><dc:creator><![CDATA[noobLolo]]></dc:creator><pubDate>Mon, 01 Feb 2010 23:25:35 GMT</pubDate></item><item><title><![CDATA[Reply to Stress für B-Baum on Mon, 01 Feb 2010 23:26:54 GMT]]></title><description><![CDATA[<p>wikipedia schrieb:</p>
<blockquote>
<p>Die häufigste Interpretation ist, dass B für balanciert steht. Weitere Interpretationen sind B für Bayer, Barbara (nach seiner Frau), Broad, Bushy, oder Boeing, da Rudolf Bayer für Boeing Scientific Research Labs gearbeitet hat.</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1848936</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1848936</guid><dc:creator><![CDATA[Ad aCTa]]></dc:creator><pubDate>Mon, 01 Feb 2010 23:26:54 GMT</pubDate></item><item><title><![CDATA[Reply to Stress für B-Baum on Tue, 02 Feb 2010 16:21:00 GMT]]></title><description><![CDATA[<p>So, ich habe mir das noch mal mit 1000 Elementen bei einer std::map angeschaut. Die Map brauchte 1mal 15ms. Diese Zahl kommt mir verdächtig vor, könnte das nicht die Zeit sein, die der Scheduler vom OS mein Programm warten lässt? Wenn dem so ist, dann brauchen meine Insertions einfach ingesamt länger, und umso mehr Takte ich benötige, desto mehr Wartezeiten bekommt mein Programm.<br />
Toll, das war jetzt ein Schuss für den Ofen, jetzt weiß ich das, was ich vorher wusste: mein Insert ist langsam. <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="🙂"
    /> Weiß jemand, wie ich den Flaschenhals in einem Code finden kann? Es sind ca. 100 Zeilen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1849249</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1849249</guid><dc:creator><![CDATA[Ad aCTa]]></dc:creator><pubDate>Tue, 02 Feb 2010 16:21:00 GMT</pubDate></item><item><title><![CDATA[Reply to Stress für B-Baum on Tue, 02 Feb 2010 16:33:54 GMT]]></title><description><![CDATA[<p>Hast du's mal mit einem Profiler versucht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1849255</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1849255</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Tue, 02 Feb 2010 16:33:54 GMT</pubDate></item><item><title><![CDATA[Reply to Stress für B-Baum on Tue, 02 Feb 2010 16:46:37 GMT]]></title><description><![CDATA[<p>Hm... mit denen habe ich keine Erfahrnung. Kannst du mir einen empfehlen? <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1849263</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1849263</guid><dc:creator><![CDATA[Ad aCTa]]></dc:creator><pubDate>Tue, 02 Feb 2010 16:46:37 GMT</pubDate></item><item><title><![CDATA[Reply to Stress für B-Baum on Tue, 02 Feb 2010 16:53:08 GMT]]></title><description><![CDATA[<p>Nö, aber für den Anfang reicht ja irgendeiner. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1849268</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1849268</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Tue, 02 Feb 2010 16:53:08 GMT</pubDate></item><item><title><![CDATA[Reply to Stress für B-Baum on Tue, 02 Feb 2010 18:09:31 GMT]]></title><description><![CDATA[<p>Ich habe mir jetzt mal einen gesucht, der sehr schön mit meiner IDE arbeiten kann. Ganz nette Sache, er zeigt mir also an, wie oft welche Funktionen aufgerufen wurden. Er sagt mir, dass insert() oft aufgerufen wurde. Schön, das weiß ich schon. Aber richtig Auskunft kann er mir nicht geben. Ohne jetzt genau den Algorithmus verstehen zu müssen, sieht jemand in diesem Code irgendeine Art &quot;no-go&quot;?</p>
<pre><code class="language-cpp">template &lt;unsigned order, typename key_t, typename payload_t, typename compare_t, typename allocator_t&gt;
std::pair&lt;typename node&lt;order, key_t, payload_t, compare_t, allocator_t&gt;::iterator, bool&gt; node&lt;order, key_t, payload_t, compare_t, allocator_t&gt;::insert(const std::pair&lt;key_t, payload_t&gt;&amp; dp) {
	// greater_equal, smaller_equal search:
	typename std::list&lt;pointer&gt;::iterator key = std::find_if(payload.begin(), payload.end(), bind2nd(compare_t(), dp.first));
	if(!children.empty()) { // it's an inner node
		if(key != payload.end()) { // there is a key with those condition
			if((*key)-&gt;first != dp.first) { // key is not equal to the needle
				typename std::list&lt;pointer&gt;::difference_type position = std::distance(payload.begin(), key);

				// is the child candidate full?
				if(children[position]-&gt;payload.size() == 2 * order - 1) {
					position = split(dp, position); // then split it and get new position to search
				}
				return children[position]-&gt;insert(dp); // map position on childnodes and search in subtree
			}	
			else
				return std::make_pair(iterator(this, key), false); // found in inner node
		}
		else {// there is not such a position
			if(children.back()-&gt;payload.size() == 2 * order - 1) { // is the node full?
				typename std::list&lt;pointer&gt;::difference_type position = payload.size();
				position = split(dp, position); // split it and return new position to continue searching
				return children[position]-&gt;insert(dp);
			}
			return children.back()-&gt;insert(dp); // the very right subtree may contain the key
		}
	}
	else {
		if(key == payload.end() || (*key)-&gt;first != dp.first) { // key does not exist or is too big --&gt; we can insert
			pointer n = allocate(1);
			construct(n, dp);
			std::list&lt;pointer&gt;::iterator pos = payload.insert(payload.end(), n); // insert at the end
			payload.sort(cmp()); // sort the payload list
			return std::make_pair(iterator(this, pos), true);
		}
		else
			return std::make_pair(iterator(this, key), false); // found in leave node
	}
}
</code></pre>
<p>Nur von Seiten der Performance. Ich habe den Algorithmus einfach mal umgesetzt, und wüsste nicht, wie ich das ummodeln sollte, damit es schneller wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1849317</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1849317</guid><dc:creator><![CDATA[Ad aCTa]]></dc:creator><pubDate>Tue, 02 Feb 2010 18:09:31 GMT</pubDate></item><item><title><![CDATA[Reply to Stress für B-Baum on Tue, 02 Feb 2010 18:59:48 GMT]]></title><description><![CDATA[<p>Ad aCTa schrieb:</p>
<blockquote>
<p>Ich habe mir jetzt mal einen gesucht, der sehr schön mit meiner IDE arbeiten kann. Ganz nette Sache, er zeigt mir also an, wie oft welche Funktionen aufgerufen wurden. Er sagt mir, dass insert() oft aufgerufen wurde.</p>
</blockquote>
<p>Eigentlich sollte er auch anzeigen, welche Anweisung wie oft durchlaufen wurde und wieviel Zeit darin verbracht wurde.</p>
<blockquote>
<p>Schön, das weiß ich schon. Aber richtig Auskunft kann er mir nicht geben. Ohne jetzt genau den Algorithmus verstehen zu müssen, sieht jemand in diesem Code irgendeine Art &quot;no-go&quot;?</p>
</blockquote>
<p>Naja no-go vielleicht nicht, aber ein paar Sachen fallen mir schon auf.<br />
- Warum eine Liste und kein Vektor?<br />
- Wenn schon Liste, warum enthält sie dann Pointer und nicht Objekte?<br />
- Du fügst unten einfach mal ein und sortierst die Liste dann. Zum Einfügen in eine sortierte Liste gibt's aber effizientere Verfahren.</p>
<p>Ich muss aber zugeben, dass ich den Code nur kurz überflogen habe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1849348</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1849348</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Tue, 02 Feb 2010 18:59:48 GMT</pubDate></item><item><title><![CDATA[Reply to Stress für B-Baum on Tue, 02 Feb 2010 19:39:27 GMT]]></title><description><![CDATA[<blockquote>
<p>&gt; - Wenn schon Liste, warum enthält sie dann Pointer und nicht Objekte?</p>
</blockquote>
<p>Weil diese Objekte von einem Allokator kommen. Der gibt mir nur Pointer.</p>
<blockquote>
<p>&gt; Warum eine Liste und kein Vektor?<br />
&gt; Du fügst unten einfach mal ein und sortierst die Liste dann. Zum Einfügen in eine sortierte Liste gibt's aber effizientere Verfahren.</p>
</blockquote>
<p>Ich hab da lange rumüberlegt. Ich wollte gerne einen Container haben, bei dem Einfügen in der Mitte günstig ist, am besten gleich sortierend einfügt. Ich verstehe nicht, warum es in der Standardbibliothek nicht eine automatisch sortierende Liste gibt, der einzige Container, der das kann ist std::set. Außerdem fand ich die splice()-Methode recht nett auf mein Problem zugeschnitten, die Liste zu teilen und automatisch zu löschen. Zuletzt hielt ich list::sort() dem std::sort für überlegen, in der Hoffnung, dort am meisten Performance raus zu holen. Dem ist scheinbar nicht so.<br />
Zugegeben, was gescheites, wie man auf n Elemente n + 1 andere draufmappen kann, ist mir noch nicht eingefallen. Bis jetzt taten es vector und list.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1849385</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1849385</guid><dc:creator><![CDATA[Ad aCTa]]></dc:creator><pubDate>Tue, 02 Feb 2010 19:39:27 GMT</pubDate></item><item><title><![CDATA[Reply to Stress für B-Baum on Tue, 02 Feb 2010 20:27:50 GMT]]></title><description><![CDATA[<p>Ad aCTa schrieb:</p>
<blockquote>
<blockquote>
<p>&gt; - Wenn schon Liste, warum enthält sie dann Pointer und nicht Objekte?</p>
</blockquote>
<p>Weil diese Objekte von einem Allokator kommen. Der gibt mir nur Pointer.</p>
</blockquote>
<p>Ich kenn mich mit Allokatoren nicht aus, aber warum ist das so? Die STL-Container arbeiten mit dem Standard-Allokator-Interface und enthalten Objekte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1849428</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1849428</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Tue, 02 Feb 2010 20:27:50 GMT</pubDate></item><item><title><![CDATA[Reply to Stress für B-Baum on Tue, 02 Feb 2010 20:40:54 GMT]]></title><description><![CDATA[<blockquote>
<p>&gt; Die STL-Container arbeiten mit dem Standard-Allokator-Interface und enthalten Objekte.</p>
</blockquote>
<p>Ne, das glaub ich nicht. Schließlich werden ja die Elemente, die du in einen Container packst, kopiert. Der Allokator ist eigentlich nur das:</p>
<pre><code class="language-cpp">T* memory = allocator.allocate(1);
allocator.construct(memory, T());
// ...
allocator.destroy(memory);
allocator.deallocate(memory);
</code></pre>
<p>z.B. ein malloc() mit einem placement-new.</p>
<p>Bzgl. dieser Vektor-Liste-Angelegenheit: Vielleicht regele ich es einfach so, dass es einen Payload-Typen gibt, der immer einen Zeiger auf den Nächsten Node hat. Dieser Payload-Typ kommt in einen Vektor. Das allererste Element hat zwar einen Next-Zeiger, ist aber sonst leer. Dann muss ich vielleicht nicht mehr so mit diesen 2 Vektoren/Listen rumhantieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1849436</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1849436</guid><dc:creator><![CDATA[Ad aCTa]]></dc:creator><pubDate>Tue, 02 Feb 2010 20:40:54 GMT</pubDate></item></channel></rss>