<?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[effizient suchen]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich möchte in C++ einen Algorithmus erstellen, der aus einer Liste, die n größten Elemente sucht. Eigentlich keine große Sache, doch frage ich mich, ob es vielleicht einen effizienteren Weg gibt.</p>
<p>Momentan würde ich einen Sortieralgorithmus (zum Beispiel MergeSort) implementieren und diesen einfach n mal anwenden. Das scheint mir aber irgendwie recht aufwendig.</p>
<p>Gibt es eine schönere Variante?</p>
<p>Vielen Dank<br />
LG, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/313012/effizient-suchen</link><generator>RSS for Node</generator><lastBuildDate>Sun, 02 Aug 2026 08:35:53 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/313012.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 19 Jan 2013 16:38:46 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to effizient suchen on Sat, 19 Jan 2013 16:38:46 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich möchte in C++ einen Algorithmus erstellen, der aus einer Liste, die n größten Elemente sucht. Eigentlich keine große Sache, doch frage ich mich, ob es vielleicht einen effizienteren Weg gibt.</p>
<p>Momentan würde ich einen Sortieralgorithmus (zum Beispiel MergeSort) implementieren und diesen einfach n mal anwenden. Das scheint mir aber irgendwie recht aufwendig.</p>
<p>Gibt es eine schönere Variante?</p>
<p>Vielen Dank<br />
LG, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2291374</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2291374</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Sat, 19 Jan 2013 16:38:46 GMT</pubDate></item><item><title><![CDATA[Reply to effizient suchen on Sat, 19 Jan 2013 16:43:01 GMT]]></title><description><![CDATA[<p>Schaue dir einfach mal die C++-Algorithmen an...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2291376</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2291376</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sat, 19 Jan 2013 16:43:01 GMT</pubDate></item><item><title><![CDATA[Reply to effizient suchen on Sat, 19 Jan 2013 16:44:02 GMT]]></title><description><![CDATA[<p>freakC++ schrieb:</p>
<blockquote>
<p>Gibt es eine schönere Variante?</p>
</blockquote>
<p><code>nth_element</code> ?<br />
Läuft durchschnittlich in O(n) ab, ist also schneller als Sortieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2291377</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2291377</guid><dc:creator><![CDATA[effi briest]]></dc:creator><pubDate>Sat, 19 Jan 2013 16:44:02 GMT</pubDate></item><item><title><![CDATA[Reply to effizient suchen on Sat, 19 Jan 2013 16:46:14 GMT]]></title><description><![CDATA[<p><a href="http://www.cplusplus.com/reference/algorithm/partial_sort/" rel="nofollow">http://www.cplusplus.com/reference/algorithm/partial_sort/</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2291379</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2291379</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 19 Jan 2013 16:46:14 GMT</pubDate></item><item><title><![CDATA[Reply to effizient suchen on Sat, 19 Jan 2013 16:47:08 GMT]]></title><description><![CDATA[<p>ui...ich hab Blödsinn geredet. Ich will die Liste ja nicht sortieren, sondern das Maximum suchen. Vergesst MergeSort.</p>
<p>Klar, ich kann n mal die Liste durchrattern und nach dem größten Element suchen. Das ist aber doof :). Da ich mit der STL nicht sehr vertraut bin, hoffe ich auf einen Tipp. max_element bringts nicht, da ich den Index nicht rauskriege.</p>
<p>Naja, sonst implementiere ich es schnell einfach selbst... <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>LG, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2291381</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2291381</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Sat, 19 Jan 2013 16:47:08 GMT</pubDate></item><item><title><![CDATA[Reply to effizient suchen on Sat, 19 Jan 2013 16:50:11 GMT]]></title><description><![CDATA[<p>was bringt mir eine partielle Sortierung, also ein Schritt des Quicksorts?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2291383</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2291383</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Sat, 19 Jan 2013 16:50:11 GMT</pubDate></item><item><title><![CDATA[Reply to effizient suchen on Sat, 19 Jan 2013 16:50:13 GMT]]></title><description><![CDATA[<p>freakC++ schrieb:</p>
<blockquote>
<p>max_element bringts nicht, da ich den Index nicht rauskriege.</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> Doch.</p>
<blockquote>
<p>Da ich mit der STL nicht sehr vertraut bin</p>
</blockquote>
<p>Dann wird es aber Zeit. Um die kommst du in C++ nicht herum.</p>
<p>Selbst wenn du die Indices willst ist nth_element am schnellsten (musst halt eine Kopie anlegen). Sind geschätzt etwa 5 Zeilen Code.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2291384</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2291384</guid><dc:creator><![CDATA[effi briest]]></dc:creator><pubDate>Sat, 19 Jan 2013 16:50:13 GMT</pubDate></item><item><title><![CDATA[Reply to effizient suchen on Sat, 19 Jan 2013 16:52:11 GMT]]></title><description><![CDATA[<p>freakC++ schrieb:</p>
<blockquote>
<p>was bringt mir eine partielle Sortierung, also ein Schritt des Quicksorts?</p>
</blockquote>
<p>Du willst die n größten Elemente und partial_sort und nth_element geben dir die n größten Elemente. Was ist daran unklar?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2291385</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2291385</guid><dc:creator><![CDATA[Athar]]></dc:creator><pubDate>Sat, 19 Jan 2013 16:52:11 GMT</pubDate></item><item><title><![CDATA[Reply to effizient suchen on Sat, 19 Jan 2013 20:15:30 GMT]]></title><description><![CDATA[<p>Athar schrieb:</p>
<blockquote>
<p>freakC++ schrieb:</p>
<blockquote>
<p>was bringt mir eine partielle Sortierung, also ein Schritt des Quicksorts?</p>
</blockquote>
<p>Du willst die n größten Elemente und partial_sort und nth_element geben dir die n größten Elemente. Was ist daran unklar?</p>
</blockquote>
<p>Ok, sorry! Da hab ich mich falsch ausgedrückt. Zwar kann ich die Elemente so sortieren, doch habe ich danach keinen Zugriff mehr auf die alten Indices. Die brauche ich aber.</p>
<p>Gibt es eine gute Möglichkeit? Spontan dachte ich, das zu sortierende Array in einer Struktur zu speicher, die zusätzlich noch die ursprünglichen Indices verwaltet und dann diese Struktur zu sortieren. Oder gibt es vielleicht einen besseren Weg?</p>
<p>Herzlichen Dank für eure Hilfe<br />
LG, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2291430</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2291430</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Sat, 19 Jan 2013 20:15:30 GMT</pubDate></item><item><title><![CDATA[Reply to effizient suchen on Sat, 19 Jan 2013 20:28:50 GMT]]></title><description><![CDATA[<p>freakC++ schrieb:</p>
<blockquote>
<p>Gibt es eine gute Möglichkeit? Spontan dachte ich, das zu sortierende Array in einer Struktur zu speicher, die zusätzlich noch die ursprünglichen Indices verwaltet und dann diese Struktur zu sortieren. Oder gibt es vielleicht einen besseren Weg?</p>
</blockquote>
<p>Jo, das ist naheliegend.<br />
Kannst aber auch ein Indexfeld anlegen und sortieren lassen. Einfacher als Zeigerfeld, dann kannste partial_sort nebst [](int* a,int* b){return *a&lt;*b;} nehmen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2291435</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2291435</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 19 Jan 2013 20:28:50 GMT</pubDate></item><item><title><![CDATA[Reply to effizient suchen on Sat, 19 Jan 2013 20:32:47 GMT]]></title><description><![CDATA[<p>freakC++ schrieb:</p>
<blockquote>
<p>Ok, sorry! Da hab ich mich falsch ausgedrückt. Zwar kann ich die Elemente so sortieren, doch habe ich danach keinen Zugriff mehr auf die alten Indices. Die brauche ich aber.</p>
</blockquote>
<p>Liest du eigentlich auch, was andere schreiben?</p>
<p>effi briest schrieb:</p>
<blockquote>
<p>Selbst wenn du die Indices willst ist nth_element am schnellsten (musst halt eine Kopie anlegen). Sind geschätzt etwa 5 Zeilen Code.</p>
</blockquote>
<pre><code class="language-cpp">std::vector&lt;int&gt; all = ... // Inhalt deines Arrays
std::size_t n_max = ... // Wie viele Elemente du willst - 1
</code></pre>
<pre><code class="language-cpp">auto copy = all;
std::nth_element(copy.begin(), copy.begin()+n_max, copy.end(), std::greater&lt;int&gt;());
for (size_t i = 0; i &lt; all.size(); ++i)
  if (all[i] &gt;= copy[n_max])
    std::cout &lt;&lt; all[i] &lt;&lt; '\n';
</code></pre>
<p>Dürfte im diesem speziellen Fall am besten sein (solange alle Werte des Arrays unterschiedlich sind), sonst halt den Trick von Volkard anwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2291437</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2291437</guid><dc:creator><![CDATA[effi briest]]></dc:creator><pubDate>Sat, 19 Jan 2013 20:32:47 GMT</pubDate></item><item><title><![CDATA[Reply to effizient suchen on Sat, 19 Jan 2013 21:48:56 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>danke :). Da nicht alle Arrayelemente gleich sind, möchte ich gerne volkards Variante ausprobieren. Verstehe ich dich richtig, dass ich die Indices sortieren soll? Ne, das konn doch nicht sein. Was meinst Du genau mit dem Indexfeld?</p>
<p>Dankee <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/2291451</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2291451</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Sat, 19 Jan 2013 21:48:56 GMT</pubDate></item><item><title><![CDATA[Reply to effizient suchen on Sat, 19 Jan 2013 22:13:03 GMT]]></title><description><![CDATA[<p>freakC++ schrieb:</p>
<blockquote>
<p>Hallo,</p>
<p>danke :). Da nicht alle Arrayelemente gleich sind, möchte ich gerne volkards Variante ausprobieren. Verstehe ich dich richtig, dass ich die Indices sortieren soll? Ne, das konn doch nicht sein. Was meinst Du genau mit dem Indexfeld?</p>
<p>Dankee <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>
</blockquote>
<pre><code>#include &lt;vector&gt;
#include &lt;iostream&gt;
#include &lt;iterator&gt;
#include &lt;algorithm&gt;

int main(){
    using namespace std;

    vector&lt;int&gt; daten;

    cout&lt;&lt;&quot;Zahlen würfeln\n&quot;;
    for(size_t i=0;i&lt;10;++i)
        daten.push_back(rand()%100);
    for(auto i:daten)
        cout&lt;&lt;i&lt;&lt;' ';
    cout&lt;&lt;'\n';

    cout&lt;&lt;&quot;Indexfeld bauen\n&quot;;
    vector&lt;int*&gt; index;
    for(auto&amp; i:daten)
        index.push_back(&amp;i);

    cout&lt;&lt;&quot;Indexfeld sortieren\n&quot;;
    sort(index.begin(),index.end(),[](int* a,int* b){return *a&gt;*b;});
    for(size_t i=0;i&lt;10;++i)
        cout&lt;&lt;&quot;Rang &quot;&lt;&lt;i&lt;&lt;&quot;  an Platz &quot;&lt;&lt;(index[i]-&amp;*daten.begin())&lt;&lt;&quot;  mit Wert &quot;&lt;&lt;*index[i]&lt;&lt;'\n';

    return 0;
}
</code></pre>
<pre><code>Zahlen würfeln
83 86 77 15 93 35 86 92 49 21 
Indexfeld bauen
Indexfeld sortieren
Rang 0  an Platz 4  mit Wert 93
Rang 1  an Platz 7  mit Wert 92
Rang 2  an Platz 1  mit Wert 86
Rang 3  an Platz 6  mit Wert 86
Rang 4  an Platz 0  mit Wert 83
Rang 5  an Platz 2  mit Wert 77
Rang 6  an Platz 8  mit Wert 49
Rang 7  an Platz 5  mit Wert 35
Rang 8  an Platz 9  mit Wert 21
Rang 9  an Platz 3  mit Wert 15
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2291459</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2291459</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 19 Jan 2013 22:13:03 GMT</pubDate></item><item><title><![CDATA[Reply to effizient suchen on Sat, 19 Jan 2013 22:18:25 GMT]]></title><description><![CDATA[<p>Oder mit ints als Indizes.</p>
<pre><code>#include &lt;vector&gt;
#include &lt;iostream&gt;
#include &lt;iterator&gt;
#include &lt;algorithm&gt;

int main(){
    using namespace std;

    vector&lt;int&gt; daten;

    cout&lt;&lt;&quot;Zahlen würfeln\n&quot;;
    for(size_t i=0;i&lt;10;++i)
        daten.push_back(rand()%100);
    for(auto i:daten)
        cout&lt;&lt;i&lt;&lt;' ';
    cout&lt;&lt;'\n';

    cout&lt;&lt;&quot;Indexfeld bauen\n&quot;;
    vector&lt;int&gt; index;
    for(size_t i=0;i&lt;10;++i)
        index.push_back(i);

    cout&lt;&lt;&quot;Indexfeld sortieren\n&quot;;
    sort(index.begin(),index.end(),[=](int a,int b){return daten[a]&gt;daten[b];});
    for(size_t i=0;i&lt;10;++i)
        cout&lt;&lt;&quot;Rang &quot;&lt;&lt;i&lt;&lt;&quot;  an Platz &quot;&lt;&lt;index[i]&lt;&lt;&quot;  mit Wert &quot;&lt;&lt;daten[index[i&rsqb;&rsqb;&lt;&lt;'\n';

    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2291467</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2291467</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 19 Jan 2013 22:18:25 GMT</pubDate></item></channel></rss>