<?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[schneller algorithmus für ein problem]]></title><description><![CDATA[<p>hallo,</p>
<p>ich muss morgen meine übung (Informatik I) abgeben und mir fehlt ein algorithmus:</p>
<p>Aufgabenstellung:<br />
Geben Sie einen Algorithmus mit worst-case Laufzeit O(n log n) an, der folgendes leistet: Für eine gegebene endliche Menge S Teilmenge von Q(rationale Zahlen) und eine Zahl X Element von Q(rat. Zahlen) wird entschieden, ob es zwei Elemente a,b Element von S gibt, deren Summe x ergibt.</p>
<p>einen naiven Algorithmus für das Problem (mit quadratischer laufzeit) habe ich mir natürlich schon aus dem ärmel schütteln können:</p>
<pre><code>#include &lt;iostream&gt;
using namespace std;

int main()
{
	double x=55, S[10]={2,4,4,6,8,12,43,64,65,76}, temp=0, summe=0;
	bool janein=0;

	for(int i=0; i &lt; 10; i++)
	{
		temp=S[i];
		for(int j=i; j &lt; 10; j++)
		{
			summe = temp+S[j];
			if(summe==x) janein=1;
		}
	}
	if (janein) cout &lt;&lt; &quot;jop&quot; &lt;&lt; endl;
	return 0;
}
</code></pre>
<p>aber er soll ja die Laufzeitfunktion T(n) = n log n haben...wir sollen das mit dem divide and conquer prinzip machen (also merge sort), dann gibts auch die gewünschte laufzeitfunktion...</p>
<pre><code>void merge_sort(int *A, int p, int r)
{
	int q;
	if (p &lt; r)
	{
		q = (p + r) / 2;
		merge_sort(A, p, q);
		merge_sort(A, q + 1, r);
		merge(A, p, q, r);
	}
}
</code></pre>
<p>merge_sort(...) ist klar, aber ich hab keine ahnung, was sich in merge() abspielen soll...</p>
<p>(log ist der zweierlogarithmus)</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/73369/schneller-algorithmus-für-ein-problem</link><generator>RSS for Node</generator><lastBuildDate>Thu, 16 Jul 2026 14:10:37 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/73369.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 09 May 2004 12:29:34 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to schneller algorithmus für ein problem on Sun, 09 May 2004 12:29:34 GMT]]></title><description><![CDATA[<p>hallo,</p>
<p>ich muss morgen meine übung (Informatik I) abgeben und mir fehlt ein algorithmus:</p>
<p>Aufgabenstellung:<br />
Geben Sie einen Algorithmus mit worst-case Laufzeit O(n log n) an, der folgendes leistet: Für eine gegebene endliche Menge S Teilmenge von Q(rationale Zahlen) und eine Zahl X Element von Q(rat. Zahlen) wird entschieden, ob es zwei Elemente a,b Element von S gibt, deren Summe x ergibt.</p>
<p>einen naiven Algorithmus für das Problem (mit quadratischer laufzeit) habe ich mir natürlich schon aus dem ärmel schütteln können:</p>
<pre><code>#include &lt;iostream&gt;
using namespace std;

int main()
{
	double x=55, S[10]={2,4,4,6,8,12,43,64,65,76}, temp=0, summe=0;
	bool janein=0;

	for(int i=0; i &lt; 10; i++)
	{
		temp=S[i];
		for(int j=i; j &lt; 10; j++)
		{
			summe = temp+S[j];
			if(summe==x) janein=1;
		}
	}
	if (janein) cout &lt;&lt; &quot;jop&quot; &lt;&lt; endl;
	return 0;
}
</code></pre>
<p>aber er soll ja die Laufzeitfunktion T(n) = n log n haben...wir sollen das mit dem divide and conquer prinzip machen (also merge sort), dann gibts auch die gewünschte laufzeitfunktion...</p>
<pre><code>void merge_sort(int *A, int p, int r)
{
	int q;
	if (p &lt; r)
	{
		q = (p + r) / 2;
		merge_sort(A, p, q);
		merge_sort(A, q + 1, r);
		merge(A, p, q, r);
	}
}
</code></pre>
<p>merge_sort(...) ist klar, aber ich hab keine ahnung, was sich in merge() abspielen soll...</p>
<p>(log ist der zweierlogarithmus)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/516991</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/516991</guid><dc:creator><![CDATA[floppy]]></dc:creator><pubDate>Sun, 09 May 2004 12:29:34 GMT</pubDate></item><item><title><![CDATA[Reply to schneller algorithmus für ein problem on Sun, 09 May 2004 12:48:34 GMT]]></title><description><![CDATA[<p>Erst Liste sortieren mit Mergesort: O(n*log(n))</p>
<p>Dann sei a das erste Listenelement und b := x-a<br />
Teste ob b in der Liste ist mit Binärer Suche: O(log(n))</p>
<p>Wiederhole den Vorgang wobei du als a nacheinander, aufsteigend die Listenelemente nimmst.<br />
Im schlechtesten Fall musst du diese Suche n mal wiederholen: O(n*log(n))</p>
<p>Ergibt zusammen O(n*log(n) + n*log(n)) = O(2*n*log(n)) = O(n*log(n))</p>
<blockquote>
<p>(log ist der zweierlogarithmus)</p>
</blockquote>
<p>Ist den Komplexitätstheoretikern völlig egal, weil sich die Logarithmen sowieso nur durch<br />
einen konstanten Faktor unterscheiden <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/516999</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/516999</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 09 May 2004 12:48:34 GMT</pubDate></item><item><title><![CDATA[Reply to schneller algorithmus für ein problem on Sun, 09 May 2004 15:56:40 GMT]]></title><description><![CDATA[<p>super! danke! du hast mir wirklich geholfen...habs genauso implementiert und es funktioniert prima... echt nett, dass du so schnell geantwortet hast.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/517138</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/517138</guid><dc:creator><![CDATA[floppy]]></dc:creator><pubDate>Sun, 09 May 2004 15:56:40 GMT</pubDate></item></channel></rss>