<?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[Welcher median ist schneller?]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe hier aus dem Forum und aus dem Internet einige Median Funktionen gefunden.<br />
Ich habe einen Vector der momentan einen laufenden Median erzeugen soll.<br />
d.h. 100 mal pro Sekunde wird hinten eine neue Zahl angehängt und vorne eine abgetrennt. Insgesammt sind es 50 Werte, wobei sich das benutzerabhängig ändern soll.</p>
<p>folgende interessante Funktionen habe ich gefunden:</p>
<pre><code>double median(std::vector&lt;double&gt;&amp; vec)
{
  std::nth_element( vec.begin(), vec.begin() + vec.size() / 2, vec.end() );
  return *( vec.begin() + vec.size() / 2 );
}
</code></pre>
<pre><code>#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

int DoubleComparator( const void * x, const void * y )
{
    return (int)( *(double *)x - *(double *)y );
}

double Median(double v[],int n)
{
    // Sort the input array
    qsort(v, n, sizeof(double), DoubleComparator);

    // If the number of items is odd
    if (n &amp; 1)
    {
        // Return middle number
        return v[ n/2 ];
    }
    else
    {
        // else if it is even

        // Return mean of middle numbers
        double a = v[ n/2 ];
        double b = v[ n/2 -1 ];
        return ( a + b ) / 2;
    }
}

int main()
{
    double data1[] = {7, 2, 4};
    double data2[] = {2, 12, 7, 4};

    printf(&quot;Median 1 = %g\n&quot;, Median(data1, _countof(data1)));
    printf(&quot;Median 2 = %g\n&quot;, Median(data2, _countof(data2)));

    return 0;
}
</code></pre>
<p>Nun stellt sich mir die Frage welcher Median wohl der schnellste ist um möglichst wenig CPU load zu erzeugen?<br />
Bei nTh Element muss ich wohl wegen meinem laufenden Median zuerst den Vector duplizieren, was auch Zeit kostet.<br />
Kennt ihr schnellere Methoden?</p>
<p>Grüße<br />
TheNoName</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/273196/welcher-median-ist-schneller</link><generator>RSS for Node</generator><lastBuildDate>Fri, 28 Aug 2026 10:05:36 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/273196.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 02 Sep 2010 08:34:19 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Welcher median ist schneller? on Thu, 02 Sep 2010 08:35:07 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe hier aus dem Forum und aus dem Internet einige Median Funktionen gefunden.<br />
Ich habe einen Vector der momentan einen laufenden Median erzeugen soll.<br />
d.h. 100 mal pro Sekunde wird hinten eine neue Zahl angehängt und vorne eine abgetrennt. Insgesammt sind es 50 Werte, wobei sich das benutzerabhängig ändern soll.</p>
<p>folgende interessante Funktionen habe ich gefunden:</p>
<pre><code>double median(std::vector&lt;double&gt;&amp; vec)
{
  std::nth_element( vec.begin(), vec.begin() + vec.size() / 2, vec.end() );
  return *( vec.begin() + vec.size() / 2 );
}
</code></pre>
<pre><code>#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

int DoubleComparator( const void * x, const void * y )
{
    return (int)( *(double *)x - *(double *)y );
}

double Median(double v[],int n)
{
    // Sort the input array
    qsort(v, n, sizeof(double), DoubleComparator);

    // If the number of items is odd
    if (n &amp; 1)
    {
        // Return middle number
        return v[ n/2 ];
    }
    else
    {
        // else if it is even

        // Return mean of middle numbers
        double a = v[ n/2 ];
        double b = v[ n/2 -1 ];
        return ( a + b ) / 2;
    }
}

int main()
{
    double data1[] = {7, 2, 4};
    double data2[] = {2, 12, 7, 4};

    printf(&quot;Median 1 = %g\n&quot;, Median(data1, _countof(data1)));
    printf(&quot;Median 2 = %g\n&quot;, Median(data2, _countof(data2)));

    return 0;
}
</code></pre>
<p>Nun stellt sich mir die Frage welcher Median wohl der schnellste ist um möglichst wenig CPU load zu erzeugen?<br />
Bei nTh Element muss ich wohl wegen meinem laufenden Median zuerst den Vector duplizieren, was auch Zeit kostet.<br />
Kennt ihr schnellere Methoden?</p>
<p>Grüße<br />
TheNoName</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1947219</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1947219</guid><dc:creator><![CDATA[thenoname]]></dc:creator><pubDate>Thu, 02 Sep 2010 08:35:07 GMT</pubDate></item><item><title><![CDATA[Reply to Welcher median ist schneller? on Thu, 02 Sep 2010 08:55:30 GMT]]></title><description><![CDATA[<p>Bei solchen Fragen ist immer ausprobieren angesagt, d.h. mit allen Optimierungen compilieren und Laufzeit messen.</p>
<p>Ich würde aber viel Geld auf Variante 1 setzen.</p>
<p>Was du mit dem Duplizieren erreichen willst, verstehe ich nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1947230</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1947230</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 02 Sep 2010 08:55:30 GMT</pubDate></item><item><title><![CDATA[Reply to Welcher median ist schneller? on Thu, 02 Sep 2010 09:18:12 GMT]]></title><description><![CDATA[<p>Muss man nicht trotzdem die Werte sortieren? Variante 1 scheint das nicht zu machen. Btw. wenn er schon sortiert ist, kann man bestimmt sehr optimieren. Aber das sehe ich gerade nicht in Variante 1.</p>
<p>Edit: Ok, hab 's verstanden. Einfach messen ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1947238</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1947238</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Thu, 02 Sep 2010 09:18:12 GMT</pubDate></item><item><title><![CDATA[Reply to Welcher median ist schneller? on Thu, 02 Sep 2010 09:18:32 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>also der Vector ändert sich ja fortlaufend. nth element wird ja an Position X, also hier die Mitte, den zugehörigen Wert ablegen, als wäre der Vektor sortiert. Dadurch wird der Datensammel Vektor aber verändert und trägt rechts immer die letzten Median Werte, da links neue Daten reingeschoben werden.<br />
Das Kopieren muss ich natürlich auch bei QSort machen.<br />
Ich suche irgendwas, was den nth Wert evtl. ausgibt, ohne den Vector zu verändern.</p>
<p>Grüße<br />
TheNoName</p>
<p>ps. es nennt sich glaube ich &quot;gleitender Median&quot;?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1947240</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1947240</guid><dc:creator><![CDATA[thenoname]]></dc:creator><pubDate>Thu, 02 Sep 2010 09:18:32 GMT</pubDate></item><item><title><![CDATA[Reply to Welcher median ist schneller? on Thu, 02 Sep 2010 09:16:48 GMT]]></title><description><![CDATA[<p>Wobei ich bemerken muss, das ich die Funktionsweise von nth Element nicht verstehe, da ich hier ja auch sortieren muss um den nth Wert zu erhalten???</p>
<p>Variante 1 kommt von:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-199232-and-highlight-is-median.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-199232-and-highlight-is-median.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1947241</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1947241</guid><dc:creator><![CDATA[thenoname]]></dc:creator><pubDate>Thu, 02 Sep 2010 09:16:48 GMT</pubDate></item><item><title><![CDATA[Reply to Welcher median ist schneller? on Thu, 02 Sep 2010 09:18:49 GMT]]></title><description><![CDATA[<p>std:nth_element sortiert ... etwas</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1947244</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1947244</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Thu, 02 Sep 2010 09:18:49 GMT</pubDate></item><item><title><![CDATA[Reply to Welcher median ist schneller? on Thu, 02 Sep 2010 09:22:30 GMT]]></title><description><![CDATA[<p>Wenn ich &quot;etwas&quot; sortiere kommt &quot;aestw&quot; heraus.<br />
Was schwebt dir dabei vor den Augen herum?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1947246</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1947246</guid><dc:creator><![CDATA[thenoname]]></dc:creator><pubDate>Thu, 02 Sep 2010 09:22:30 GMT</pubDate></item><item><title><![CDATA[Reply to Welcher median ist schneller? on Thu, 02 Sep 2010 09:26:27 GMT]]></title><description><![CDATA[<p>thenoname schrieb:</p>
<blockquote>
<p>Wenn ich &quot;etwas&quot; sortiere kommt &quot;aestw&quot; heraus.<br />
Was schwebt dir dabei vor den Augen herum?</p>
</blockquote>
<p>Sagen wirs mal so: Wenn du das kleinste Element in &quot;etwas&quot; suchst, musst du dann &quot;etwas&quot; vollständig sortieren? Und wenn du das zweitkleinste suchst, was würdest du dann machen? Setze den Gedankengang fort. Und denke auch daran, dass man dieselbe Argumentationskette auch mit dem größten Element starten kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1947247</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1947247</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 02 Sep 2010 09:26:27 GMT</pubDate></item><item><title><![CDATA[Reply to Welcher median ist schneller? on Thu, 02 Sep 2010 09:26:42 GMT]]></title><description><![CDATA[<p>Einfach mal google benutzen: <a href="http://www.sgi.com/tech/stl/nth_element.html" rel="nofollow">http://www.sgi.com/tech/stl/nth_element.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1947248</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1947248</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Thu, 02 Sep 2010 09:26:42 GMT</pubDate></item><item><title><![CDATA[Reply to Welcher median ist schneller? on Thu, 02 Sep 2010 10:19:19 GMT]]></title><description><![CDATA[<blockquote>
<p>Bei nTh Element muss ich wohl wegen meinem laufenden Median zuerst den Vector duplizieren, was auch Zeit kostet.</p>
</blockquote>
<p>Hier mal ein (nicht getesteter) Gedanke dazu</p>
<p>Da du einen Vektor definierter Länge hast würde ich das anders lösen:</p>
<ol>
<li>Das ganze nicht als Vektor sondern als Liste abspeichern und die Liste zu anfangs <em>einmal</em> sortieren.</li>
<li>Wenn jetzt ein Wert abgetrennt wird und einer dazugefügt wird den neu dazugefügten richtig einsortieren.</li>
</ol>
<p>qSort eines Vektors packt im ungünstigsten Fall alle Werte und kopiert sie (z.B. wenn du am Ende einen Wert einfügst der kleiner ist als alle anderen in einem bereits sortierten Vektor muss dieser nach ganz vorne kopiert werden und alle anderen um eins nach hinten)</p>
<p>Um die richtige Position in der List zu finden bietet sich eine divide&amp;conquer Strategie an und du musst effektiv dann nur noch 2 Zeiger umbiegen (wenn du die STL benutzt dann einfach list.insert(...)).</p>
<ol start="3">
<li>wie in deinem Beispiel steht der Median dann immer an der Position n = size/2, allerdings musst du nix kopieren (wobei der Zugriff auf das size/2-te Glied einer Liste langsamer ist als auf das size/2-te Glied eines Vektors)</li>
</ol>
<p>Das kannst du aber auch umgehen indem du dir die Position des letzen Medians über einen iterator (iter) merkst. Denn der neue Median ist dann an folgender Position:</p>
<p>Wenn gelöschtes und neu eingefügtes Element BEIDE größer oder kleiner waren als der Median: Dann zeigt iter bereits auf den Median.</p>
<p>Wenn gelöschtes Element größer war als Median und neu eingefügtes kleiner als Median dann steht der neue Median in iter--.</p>
<p>Wenn gelöschtes Element kleiner war als Median und neu eingefügtes größer als Median dann steht der neue Median in iter++.</p>
<p>Zusätzlicher Aufwand:</p>
<p>a) du musst dir eine zweite Liste mit Chronologie der Listenelement vorhalten (z.b. als deque mit Pointern auf deine sortierte Liste) damit du weisst welches das 'älteste' Element ist das gelöscht werden soll. Aber in der deque brauchst du ja immer nur das letzte auszulesen und das erste anfügen: also kein großer overhead.</p>
<p>b) Du musst aufpassen, dass du deinen Medianzeiger 'rettest' wenn zufällig das Median-element gerade gelöscht werden soll - denn sonst schlägt iter++ / iter-- fehl!</p>
<p>hier gibst dann auch wieder 3 Fälle:<br />
a1) neues Element kommt zufällig an position des gelöschten Elements -&gt; neues Element ist median<br />
a2) neues Element nicht benachbart mit altem Medianelement - aber größer: iter++ bevor man das alte Element löscht<br />
a3) neues Element nicht benachbart mit altem Medianelement - aber kleiner: iter-- bevor man das alte Element löscht</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1947265</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1947265</guid><dc:creator><![CDATA[antialias]]></dc:creator><pubDate>Thu, 02 Sep 2010 10:19:19 GMT</pubDate></item><item><title><![CDATA[Reply to Welcher median ist schneller? on Thu, 02 Sep 2010 11:53:13 GMT]]></title><description><![CDATA[<p>Vielleicht mal die folgende Wikipedia Seite anschauen:</p>
<p><a href="http://en.wikipedia.org/wiki/Selection_algorithm" rel="nofollow">http://en.wikipedia.org/wiki/Selection_algorithm</a></p>
<p>Es gibt jedenfalls durchaus O(n) Algorithmen, die den n-ten Median einer Menge bestimmen können.</p>
<p>In diesem Fall bietet sich aber wohl eher eine Datenstruktur an, die die Menge sortiert hält. Eine <code>multiset</code> sollte es eigentlich tun.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1947281</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1947281</guid><dc:creator><![CDATA[life]]></dc:creator><pubDate>Thu, 02 Sep 2010 11:53:13 GMT</pubDate></item><item><title><![CDATA[Reply to Welcher median ist schneller? on Thu, 02 Sep 2010 12:12:19 GMT]]></title><description><![CDATA[<p>thenoname schrieb:</p>
<blockquote>
<p>d.h. 100 mal pro Sekunde wird hinten eine neue Zahl angehängt und vorne eine abgetrennt.</p>
</blockquote>
<p>Denkbar ungünstig, da einen vector zu benutzen. Beim vorne abtrennen musst du dann nämlich jedes Element um einen Platz nach vorne kopieren. Eine Liste wäre da deutlich besser.<br />
Zum Median: wenn du vor der Bestimmung des Medians überprüfst, wie das hinzugefügte und das entfernte Element sich zum Median verhalten, kannst du schon eine Menge Medianbildungen verhindern:<br />
Sind beide Elemente größer oder beide kleiner als der Median, dann ändert sich der Median nicht. Andernfalls muss der neue Median erst wieder ermittelt werden.<br />
Wenn die Elemente wenig Speicherplatz benötigen, dann sollte es kein Problem sein, zusätzlich zu der Liste auch noch ein set zu haben und jeweils das Element, was an die Liste angehängt bzw. aus ihr entfernt wird, auch ins set zu packen bzw. daraus zu entfernen. Den median in einem Set zu bestimmen, dürfte O(1) brauchen, wenns als balancierter Baum implementiert ist, sonst O(log n).<br />
Wenn die Elemente viel Platz brauchen, sollte erst recht eine liste benutzt werden (weil das Verschieben der Elemente im vector dann entsprechend mehr Aufwand bedeutet), und da push_back bzw. pop_front einer Liste deren Iteratoren nicht invalidieren, können statt der Kopien der Elemente Iteratoren in die Liste im Set gespeichert werden (der Comparator muss dann entsprechend die Iteratoren dereferenzieren). Der Pseudocode wäre dann in etwa wie folgt:</p>
<pre><code class="language-cpp">set.erase(list.front);
list.pop_front();
list.push_back(X);
set.insert(list.back);
medianiter = getmedian(set, set.comparator);
median = *medianiter;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1947315</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1947315</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 02 Sep 2010 12:12:19 GMT</pubDate></item><item><title><![CDATA[Reply to Welcher median ist schneller? on Thu, 02 Sep 2010 13:39:28 GMT]]></title><description><![CDATA[<p>Etwa so könnte es funktionieren:</p>
<pre><code class="language-cpp">#include &lt;list&gt;
#include &lt;map&gt;
#include &lt;cassert&gt;
#include &lt;iostream&gt;

class MedianComputer
{
public:
	MedianComputer(std::list&lt;int&gt; list); //O(n log(n))

	void removeAndAddElement(int removeElement, int addElement); //O(log(n))	
	int getMedian() const; //O(1)

private:
	void eraseElement(std::map&lt;int, std::size_t&gt;::iterator&amp; it);
	void decrementMedianIt();
	void incrementMedianIt();

	std::map&lt;int, std::size_t&gt; multiset;
	std::map&lt;int, std::size_t&gt;::const_iterator medianIt;
	std::size_t medianOffset; 
};

MedianComputer::MedianComputer(std::list&lt;int&gt; list) {
	for(std::list&lt;int&gt;::const_iterator it = list.begin(); it != list.end(); ++it) {
		++multiset[*it];
	}
	medianIt = multiset.begin();
	std::size_t count = 0;
	std::size_t end = list.size()/2;
	while(count+medianIt-&gt;second &lt;= end) {
		count += medianIt-&gt;second;
		++medianIt;
	} 
	medianOffset = end - count;	
}

void MedianComputer::removeAndAddElement(int removeElement, int addElement) {
	std::map&lt;int, std::size_t&gt;::iterator removeIt = multiset.find(removeElement);
	assert(removeIt != multiset.end());

	int median = getMedian();

	if(removeElement &gt; median) {
		eraseElement(removeIt);

		++multiset[addElement];		
		if(addElement &lt; median) {
			decrementMedianIt();
		}
	}
	else if(removeElement == median &amp;&amp; addElement &lt; median) {
		++multiset[addElement];
		decrementMedianIt();
		eraseElement(removeIt);
	}
	else if(removeElement == median &amp;&amp; addElement &gt; median) {
		++multiset[addElement];
		decrementMedianIt();
		eraseElement(removeIt);
		incrementMedianIt();
	}
	else if(removeElement &lt; median) {
		eraseElement(removeIt);

		++multiset[addElement];
		if(addElement &gt;= median) {
			incrementMedianIt();
		}
	}
}

int MedianComputer::getMedian() const {
	return medianIt-&gt;first;
}

void MedianComputer::eraseElement(std::map&lt;int, std::size_t&gt;::iterator&amp; it) {
	std::size_t count = it-&gt;second;
	if(count == 1) {
		multiset.erase(it);
	} else {
		--(it-&gt;second);
	}
}

void MedianComputer::decrementMedianIt() {
	if(medianOffset &gt; 0) {
		--medianOffset;
	} else {
		--medianIt;
		medianOffset = medianIt-&gt;second - 1;
	}
}

void MedianComputer::incrementMedianIt() {
	if(medianOffset &lt; medianIt-&gt;second - 1) {
		++medianOffset;
	} else {
		++medianIt;
		medianOffset = 0;
	}
}

int main(int argc, char *argv[])
{
	std::list&lt;int&gt; list;
	list.push_back(1);
	list.push_back(2);
	list.push_back(3);
	list.push_back(4);
	list.push_back(5);

	MedianComputer medianComputer(list);
	std::cout &lt;&lt; medianComputer.getMedian() &lt;&lt; std::endl; //1 2 [3] 4 5

	list.push_back(6);
	medianComputer.removeAndAddElement(list.front(),list.back());
	list.pop_front();	
	std::cout &lt;&lt; medianComputer.getMedian() &lt;&lt; std::endl; //2 3 [4] 5 6

	list.push_back(6);
	medianComputer.removeAndAddElement(list.front(),list.back());
	list.pop_front();

	list.push_back(6);
	medianComputer.removeAndAddElement(list.front(),list.back());
	list.pop_front();

	list.push_back(6);
	medianComputer.removeAndAddElement(list.front(),list.back());
	list.pop_front();	
	std::cout &lt;&lt; medianComputer.getMedian() &lt;&lt; std::endl; //5 6 [6] 6 6

	list.push_back(7);
	medianComputer.removeAndAddElement(list.front(),list.back());
	list.pop_front();	
	std::cout &lt;&lt; medianComputer.getMedian() &lt;&lt; std::endl; //6 6 [6] 6 7

	list.push_back(8);
	medianComputer.removeAndAddElement(list.front(),list.back());
	list.pop_front();	
	std::cout &lt;&lt; medianComputer.getMedian() &lt;&lt; std::endl; //6 6 [6] 7 8

	list.push_back(9);
	medianComputer.removeAndAddElement(list.front(),list.back());
	list.pop_front();	
	std::cout &lt;&lt; medianComputer.getMedian() &lt;&lt; std::endl; //6 6 [7] 8 9

	list.push_back(1);
	medianComputer.removeAndAddElement(list.front(),list.back());
	list.pop_front();	
	std::cout &lt;&lt; medianComputer.getMedian() &lt;&lt; std::endl; //1 6 [7] 8 9

	list.push_back(1);
	medianComputer.removeAndAddElement(list.front(),list.back());
	list.pop_front();	
	std::cout &lt;&lt; medianComputer.getMedian() &lt;&lt; std::endl; //1 1 [7] 8 9

	list.push_back(1);
	medianComputer.removeAndAddElement(list.front(),list.back());
	list.pop_front();	
	std::cout &lt;&lt; medianComputer.getMedian() &lt;&lt; std::endl; //1 1 [1] 8 9

	list.push_back(10);
	medianComputer.removeAndAddElement(list.front(),list.back());
	list.pop_front();	
	std::cout &lt;&lt; medianComputer.getMedian() &lt;&lt; std::endl; //1 1 [1] 9 10
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1947350</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1947350</guid><dc:creator><![CDATA[life]]></dc:creator><pubDate>Thu, 02 Sep 2010 13:39:28 GMT</pubDate></item><item><title><![CDATA[Reply to Welcher median ist schneller? on Thu, 02 Sep 2010 14:10:29 GMT]]></title><description><![CDATA[<p>huch - lesen 4tw</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1947359</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1947359</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Thu, 02 Sep 2010 14:10:29 GMT</pubDate></item><item><title><![CDATA[Reply to Welcher median ist schneller? on Thu, 02 Sep 2010 16:29:57 GMT]]></title><description><![CDATA[<p>ich weiß nicht, ob das schon erwähnt wurde (hab's beim Überfliegen nicht gesehen) aber std::nth_element hat eine lineare Komplexität, also O(n), falls n die Zahl der Elemente sind. Eine komplette Sortierung dagegen benötigt im Schnitt O(n log(n)) Zeit.</p>
<p>Wie std::nth_element typischerweise implementiert wird, weiß ich nicht. Aber man kann es jedenfalls über einen halben Quick-Sort machen, wobei er sich nach der Partition nicht 2mal rekursiv (für linke und rechte Hälfte) aufruft sondern nur einmal. Welche &quot;Hälfte&quot; hängt davon ab, wo das Pivot-Element relativ zur gewünschten Position landet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1947440</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1947440</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Thu, 02 Sep 2010 16:29:57 GMT</pubDate></item></channel></rss>