<?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[Schnelles set&amp;lt;foo*&amp;gt;]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich suche eine Datenstruktur, wo ich Pointer reinlegen und schnell anfragen kann, ob ein Pointer enthalten ist. Standard für sowas ist ein STL-Set, aber der Teil ist zeitkritisch und ich möchte fragen, ob Ihr eine schnellere Methode kennt. Vielleicht was mit Hashes oder eine sehr effiziente Set-Implementierung?</p>
<p>Benötigt wird nur Einfügen und Abfragen. Es gibt kein Größenlimit bei dem Problem, aber typischerweise erwarte ich 20 bis 50 Pointer im Set.</p>
<p>Danke / lg</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/279095/schnelles-set-lt-foo-gt</link><generator>RSS for Node</generator><lastBuildDate>Mon, 24 Aug 2026 19:02:00 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/279095.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 19 Dec 2010 09:47:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Schnelles set&amp;lt;foo*&amp;gt; on Sun, 19 Dec 2010 09:47:09 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich suche eine Datenstruktur, wo ich Pointer reinlegen und schnell anfragen kann, ob ein Pointer enthalten ist. Standard für sowas ist ein STL-Set, aber der Teil ist zeitkritisch und ich möchte fragen, ob Ihr eine schnellere Methode kennt. Vielleicht was mit Hashes oder eine sehr effiziente Set-Implementierung?</p>
<p>Benötigt wird nur Einfügen und Abfragen. Es gibt kein Größenlimit bei dem Problem, aber typischerweise erwarte ich 20 bis 50 Pointer im Set.</p>
<p>Danke / lg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1996501</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996501</guid><dc:creator><![CDATA[assert]]></dc:creator><pubDate>Sun, 19 Dec 2010 09:47:09 GMT</pubDate></item><item><title><![CDATA[Reply to Schnelles set&amp;lt;foo*&amp;gt; on Sun, 19 Dec 2010 10:06:18 GMT]]></title><description><![CDATA[<p>Muss denn das reinlegen auch schnell sein? Wenn nicht, dann würde ich einen<a href="http://www.cplusplus.com/reference/stl/vector/" rel="nofollow"> <code>std::vector&lt;foo*&gt;</code> </a>nehmen und diesen sortieren. Beim Abfragen einen<a href="http://www.cplusplus.com/reference/algorithm/binary_search/" rel="nofollow"> <code>std::binary_search</code> </a>darauf anwenden.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1996505</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996505</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sun, 19 Dec 2010 10:06:18 GMT</pubDate></item><item><title><![CDATA[Reply to Schnelles set&amp;lt;foo*&amp;gt; on Sun, 19 Dec 2010 10:08:19 GMT]]></title><description><![CDATA[<p>Und du hast jetzt gemessen, dass deine set-Implementierung bei lächerlichen 20 bis 50 Werten langsam ist? Dann würde ich mal eine Releaseversion bauen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1996506</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996506</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Sun, 19 Dec 2010 10:08:19 GMT</pubDate></item><item><title><![CDATA[Reply to Schnelles set&amp;lt;foo*&amp;gt; on Sun, 19 Dec 2010 10:18:47 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Muss denn das reinlegen auch schnell sein? Wenn nicht, dann würde ich einen<a href="http://www.cplusplus.com/reference/stl/vector/" rel="nofollow"> <code>std::vector&lt;foo*&gt;</code> </a>nehmen und diesen sortieren. Beim Abfragen einen<a href="http://www.cplusplus.com/reference/algorithm/binary_search/" rel="nofollow"> <code>std::binary_search</code> </a>darauf anwenden.</p>
<p>Grüssli</p>
</blockquote>
<p>Vector - sort - Binärsuche ist eine gute Idee. Leider muß ich die Abfragen schon machen, während das Set noch aufgebaut wird. Es handelt sich um einen Breitensuche-Algorithmus, der wissen muß, wo er bereits war. In den besuchten Elementen (auf die die Pointer zeigen) soll das aus Platzgründen nicht hinterlegt werden.</p>
<p>lg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1996509</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996509</guid><dc:creator><![CDATA[assert]]></dc:creator><pubDate>Sun, 19 Dec 2010 10:18:47 GMT</pubDate></item><item><title><![CDATA[Reply to Schnelles set&amp;lt;foo*&amp;gt; on Sun, 19 Dec 2010 10:30:39 GMT]]></title><description><![CDATA[<p>Wenn der Speicherverbrauch ein Problem ist, wieso verwendest du dann nicht eine iterative Tiefensuche?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1996515</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996515</guid><dc:creator><![CDATA[tressa]]></dc:creator><pubDate>Sun, 19 Dec 2010 10:30:39 GMT</pubDate></item><item><title><![CDATA[Reply to Schnelles set&amp;lt;foo*&amp;gt; on Sun, 19 Dec 2010 10:40:29 GMT]]></title><description><![CDATA[<p>manni66 schrieb:</p>
<blockquote>
<p>Und du hast jetzt gemessen, dass deine set-Implementierung bei lächerlichen 20 bis 50 Werten langsam ist? Dann würde ich mal eine Releaseversion bauen.</p>
</blockquote>
<p>Das Argument mit den 'lächerlichen 20 bis 50 Werten' ist falsch, denn durch die logarithmische Tiefe des Suchbaums ist es unerheblich, ob nun 50 Werte drinliegen oder 1000. ld(50)~6, ld(1000)~10, und daher hast Du bei 50 Werten noch immer 60 Prozent der Laufzeit, die Du mit 1000 Werten hättest. STL-Sets sind einfach und allgemein, das ist ein großer Vorteil. Aber Datenstrukturen 'von der Stange' sind nicht für jedes Problem optimal. Ich baue bis zu 10 Mio. solcher Sets auf.</p>
<p>lg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1996522</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996522</guid><dc:creator><![CDATA[assert]]></dc:creator><pubDate>Sun, 19 Dec 2010 10:40:29 GMT</pubDate></item><item><title><![CDATA[Reply to Schnelles set&amp;lt;foo*&amp;gt; on Sun, 19 Dec 2010 10:42:54 GMT]]></title><description><![CDATA[<p>tressa schrieb:</p>
<blockquote>
<p>Wenn der Speicherverbrauch ein Problem ist, wieso verwendest du dann nicht eine iterative Tiefensuche?</p>
</blockquote>
<p>Das Problem ist nicht kreisfrei. Gesucht wird in einem Tetraedernetz, wobei von Nachbar zu Nachbar gesprungen wird.</p>
<p>lg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1996525</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996525</guid><dc:creator><![CDATA[assert]]></dc:creator><pubDate>Sun, 19 Dec 2010 10:42:54 GMT</pubDate></item><item><title><![CDATA[Reply to Schnelles set&amp;lt;foo*&amp;gt; on Sun, 19 Dec 2010 11:20:50 GMT]]></title><description><![CDATA[<p>assert schrieb:</p>
<blockquote>
<p>manni66 schrieb:</p>
<blockquote>
<p>Und du hast jetzt gemessen, dass deine set-Implementierung bei lächerlichen 20 bis 50 Werten langsam ist? Dann würde ich mal eine Releaseversion bauen.</p>
</blockquote>
<p>Das Argument mit den 'lächerlichen 20 bis 50 Werten' ist falsch, denn durch die logarithmische Tiefe des Suchbaums ist es unerheblich, ob nun 50 Werte drinliegen oder 1000. ld(50)~6, ld(1000)~10, und daher hast Du bei 50 Werten noch immer 60 Prozent der Laufzeit, die Du mit 1000 Werten hättest. STL-Sets sind einfach und allgemein, das ist ein großer Vorteil. Aber Datenstrukturen 'von der Stange' sind nicht für jedes Problem optimal. Ich baue bis zu 10 Mio. solcher Sets auf.</p>
<p>lg</p>
</blockquote>
<p>Der Kern der Frage war: was erwartest du für eine Verbesserung mit einer anderen Datenstruktur? Auch eine binäres Suche in einem Vector verhält sich logarithmisch. Der wesentliche Vorteil dürfte sein, dass alle Werte im Prozessorcache liegen. Eine Hashtabelle muss aus dem Wert die Position in der Tabelle errechnen. Auch hier ist die Frage: ist der theoretische Laufzeitvorteil O(1) bei deinen kleinen Sets praktisch relevant?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1996538</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996538</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Sun, 19 Dec 2010 11:20:50 GMT</pubDate></item><item><title><![CDATA[Reply to Schnelles set&amp;lt;foo*&amp;gt; on Sun, 19 Dec 2010 11:40:54 GMT]]></title><description><![CDATA[<p>manni66 schrieb:</p>
<blockquote>
<p>Der Kern der Frage war: was erwartest du für eine Verbesserung mit einer anderen Datenstruktur? Auch eine binäres Suche in einem Vector verhält sich logarithmisch. Der wesentliche Vorteil dürfte sein, dass alle Werte im Prozessorcache liegen. Eine Hashtabelle muss aus dem Wert die Position in der Tabelle errechnen. Auch hier ist die Frage: ist der theoretische Laufzeitvorteil O(1) bei deinen kleinen Sets praktisch relevant?</p>
</blockquote>
<p>Ein Vektor mit Binärsuche (wäre er für das Problem einsetzbar) hätte Vorteile beim Aufbau: Du kannst z.B. vector.reserve(n) sagen, um den Speicherplatz auf einmal zu reservieren. Beim STL-Set muß der Speicher Element für Element reserviert werden, und wenn das mit dem einfachen 'new' passiert, ist es langsam.</p>
<p>Mit einer Lösung ohne STL könnte man sich z.B. auch die Iteratoren ersparen, was nochmal einen kleinen Vorteil brächte.</p>
<p>lg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1996551</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996551</guid><dc:creator><![CDATA[assert]]></dc:creator><pubDate>Sun, 19 Dec 2010 11:40:54 GMT</pubDate></item><item><title><![CDATA[Reply to Schnelles set&amp;lt;foo*&amp;gt; on Sun, 19 Dec 2010 15:45:42 GMT]]></title><description><![CDATA[<p>Vielleicht können wir mit Tricks arbeiten.<br />
Deine Strukturen enthalten mit Sicherheit irgendwelche Zeiger und diese Zeiger sind hoffentlich immer gerade (muss eigentlich so sein).<br />
Dann kann man das letzte Bit abtreten und als <code>already_visited</code> -Bit ansehen.<br />
Wenn du auf den Zeiger zugreifen willst, führst du ein <code>&amp;</code> mit <code>111..1110</code> durch.<br />
Sollte das funktionieren, hast du einen 0(1)-Zugriff und weniger Speicherbedarf (du ersparst dir Millionen von <code>std::vectors</code> ).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1996722</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996722</guid><dc:creator><![CDATA[tressa]]></dc:creator><pubDate>Sun, 19 Dec 2010 15:45:42 GMT</pubDate></item><item><title><![CDATA[Reply to Schnelles set&amp;lt;foo*&amp;gt; on Sun, 19 Dec 2010 15:56:11 GMT]]></title><description><![CDATA[<p>Wieviel Prozent der Laufzeit des Algorithmus nimmt denn die Suche in einem std::set ein? Hast du das überhaupt schon gemessen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1996728</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996728</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Sun, 19 Dec 2010 15:56:11 GMT</pubDate></item><item><title><![CDATA[Reply to Schnelles set&amp;lt;foo*&amp;gt; on Sun, 19 Dec 2010 17:11:49 GMT]]></title><description><![CDATA[<p>brotbernd schrieb:</p>
<blockquote>
<p>Wieviel Prozent der Laufzeit des Algorithmus nimmt denn die Suche in einem std::set ein? Hast du das überhaupt schon gemessen?</p>
</blockquote>
<p>Ich optimiere sicher nach der 80:20-Regel, denn das Set kommt in jenem Teil vor, der die meiste Zeit benötigt. Wie groß der Anteil des Sets innerhalb dieses Teils ist, kann man meines Erachtens nur schätzen, da die Einzelschritte zu kurz für eine Messung sind. Solltest Du aber was in der Art</p>
<p>time(0)<br />
while(something)<br />
{<br />
someCalc..</p>
<p>time.start()<br />
set.find(x)<br />
time.end()</p>
<p>someCalc..<br />
}<br />
cout&lt;&lt;&quot;acc. time for just the set&quot;&lt;&lt;time&lt;&lt;endl;</p>
<p>...kennen, das die Zeit so winziger Schritte messen kann, so bin ich sehr interessiert daran.</p>
<p>lg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1996774</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996774</guid><dc:creator><![CDATA[assert]]></dc:creator><pubDate>Sun, 19 Dec 2010 17:11:49 GMT</pubDate></item><item><title><![CDATA[Reply to Schnelles set&amp;lt;foo*&amp;gt; on Sun, 19 Dec 2010 17:16:44 GMT]]></title><description><![CDATA[<p>tressa schrieb:</p>
<blockquote>
<p>Vielleicht können wir mit Tricks arbeiten.<br />
Deine Strukturen enthalten mit Sicherheit irgendwelche Zeiger und diese Zeiger sind hoffentlich immer gerade (muss eigentlich so sein).<br />
Dann kann man das letzte Bit abtreten und als <code>already_visited</code> -Bit ansehen.<br />
Wenn du auf den Zeiger zugreifen willst, führst du ein <code>&amp;</code> mit <code>111..1110</code> durch.<br />
Sollte das funktionieren, hast du einen 0(1)-Zugriff und weniger Speicherbedarf (du ersparst dir Millionen von <code>std::vectors</code> ).</p>
</blockquote>
<p>Ein schmutziger Trick, aber genial! Das sollte eigentlich funktionieren. Danke!</p>
<p>lg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1996777</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996777</guid><dc:creator><![CDATA[assert]]></dc:creator><pubDate>Sun, 19 Dec 2010 17:16:44 GMT</pubDate></item><item><title><![CDATA[Reply to Schnelles set&amp;lt;foo*&amp;gt; on Sun, 19 Dec 2010 22:31:32 GMT]]></title><description><![CDATA[<p>Es gibt Optimierungen, die weit vor der Implementation ansetzen. Breitensuche, Tetraedernetz ... in <a href="http://video.google.com/videoplay?docid=-4991530385753299192#" rel="nofollow">http://video.google.com/videoplay?docid=-4991530385753299192#</a> wird kurz n-Shell vorgestellt. Anwendbar fuer planare Graphen, laesst sich aber auch auf dein Tetraedernetz erweitern. Wichtig ist, dass eine Kante kein Face* durchstoesst.</p>
<p>Knackpunkt: Du brauchst nicht alle besuchten Knoten speichern, sondern nur die (n-1)-shell und die n-shell hast du ja sowieso. Das ist deine &quot;border&quot; bei der Breitensuche.</p>
<p>Das hat mehrere Vorteile: Wenn man sich mit Breitensuche von dem Ausgangspunkt entfernt, dann wachst in deinem Fall die Anzahl der besuchten Knoten genauso wie das Volumen, also kubisch. Die n-shell waechst aber genau wie die Oberflaeche, also quadratisch. D.h. weniger Elemente zu durchsuchen. Im Video ist eine effiziente Implementierung fuer die Verwaltung von Mengen und dem Schnitt von Mengen vorausgesetzt.</p>
<p>Da ich aber nichts genaues zu deinem Problem weiss, kann ich auch nicht sagen, ob diese Idee viel bringt. Vielleicht kann man auch aehnlich wie beim Hypercude einefach eine geschickte Indizierung der Koten vornehmen oder andere hilfreiche Vorverarbeitungsschritte.</p>
<p>* keine Ahnung, wie das im deutschen heisst</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1996927</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996927</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Sun, 19 Dec 2010 22:31:32 GMT</pubDate></item><item><title><![CDATA[Reply to Schnelles set&amp;lt;foo*&amp;gt; on Mon, 20 Dec 2010 07:53:14 GMT]]></title><description><![CDATA[<p>assert schrieb:</p>
<blockquote>
<p>...kennen, das die Zeit so winziger Schritte messen kann, so bin ich sehr interessiert daran.</p>
</blockquote>
<p>Das sollte eigentlich jeder Profiler machen. Mit inline-Funktionen sollte man dabei aber aufpassen. Den Kontextwechsel erkennen nicht alle Profiler, so dass man den Übeltäter leicht an der falschen Stelle vermutet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1996991</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996991</guid><dc:creator><![CDATA[Paul Müller]]></dc:creator><pubDate>Mon, 20 Dec 2010 07:53:14 GMT</pubDate></item><item><title><![CDATA[Reply to Schnelles set&amp;lt;foo*&amp;gt; on Mon, 20 Dec 2010 09:09:48 GMT]]></title><description><![CDATA[<p>Paul Müller schrieb:</p>
<blockquote>
<p>assert schrieb:</p>
<blockquote>
<p>...kennen, das die Zeit so winziger Schritte messen kann, so bin ich sehr interessiert daran.</p>
</blockquote>
<p>Das sollte eigentlich jeder Profiler machen. Mit inline-Funktionen sollte man dabei aber aufpassen. Den Kontextwechsel erkennen nicht alle Profiler, so dass man den Übeltäter leicht an der falschen Stelle vermutet.</p>
</blockquote>
<p>Okay, man könnte das Set in eine kleine Funktion auslagern und das Inlining verbieten, um das zu messen. Da bin ich aber nie sicher, ob der Overhead für den Aufruf der Funktion nun dabei ist oder nicht. Jedenfalls scheint (mit gprof) die Summe der Laufzeiten nicht mit der realen Laufzeit überein zu stimmen.</p>
<p>Ich habe mittlerweile das STL-Set aus dem Algorithmus entfernt und testhalber etwas konstantes verwendet. Der Unterschied in der Laufzeit ist 15%.</p>
<p>lg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1997023</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1997023</guid><dc:creator><![CDATA[assert]]></dc:creator><pubDate>Mon, 20 Dec 2010 09:09:48 GMT</pubDate></item><item><title><![CDATA[Reply to Schnelles set&amp;lt;foo*&amp;gt; on Mon, 20 Dec 2010 09:26:40 GMT]]></title><description><![CDATA[<p>Das fällt doch bestimmt unter die 80-20-Grenze!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1997034</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1997034</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 20 Dec 2010 09:26:40 GMT</pubDate></item></channel></rss>