<?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[Frage zu Algorithmus: &amp;quot;Finde ähnlichste Paare&amp;quot;]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich hab ein Bottleneck in meiner Anwendung (sagt mir zumindest mein Profiler^^) bei meinem Algorithmus, welcher die &quot;ähnlichsten Paare&quot; aus zwei vectoren (bzw. sequentiellen Containern) suchen soll.</p>
<p>Ein Beispiel (die Container sind sortiert):</p>
<pre><code>Input: 
a = 5, 7, 9 
b = 6, 10, 11, 13

Output:
c = -1, -1, -4
</code></pre>
<p>Die &quot;ähnlichsten Paare&quot; (also die mit geringster quadratischer Abweichung) wären hier:</p>
<pre><code>5 und 6 -&gt; Differenz = -1
9 und 10 -&gt; Differenz = -1
7 und 11 -&gt; Differenz = -4
</code></pre>
<p>Im output c sollen die Differenzen der ähnlichsten Paare gespeichert werden.</p>
<p>Mein bisheriger Algorithmus sieht so aus (noch nicht templatisiert etc.):</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;algorithm&gt;
#include &lt;limits&gt;

void find_minimum_index(std::vector&lt;int&gt; const &amp;a, std::vector&lt;int&gt; const &amp;b, int &amp;index_a, int &amp;index_b)
{
	int min_deviation = std::numeric_limits&lt;int&gt;::max();

	for (size_t i = 0; i &lt; a.size(); ++i)
	{
		for (size_t j = 0; j &lt; b.size(); ++j)
		{
			int cur_deviation = std::abs(a[i] - b[j]);
			if (cur_deviation &lt; min_deviation)
			{
				min_deviation = cur_deviation;
				index_a = i;
				index_b = j;
			}
		}
	}
}

std::vector&lt;int&gt; most_common_pairs(std::vector&lt;int&gt; a, std::vector&lt;int&gt; b)
{
	std::vector&lt;int&gt; result;
	result.reserve(std::min(a.size(), b.size()));

	while (!a.empty() &amp;&amp; !b.empty())
	{
		int index_a, index_b;
		find_minimum_index(a, b, index_a, index_b);

		result.push_back(a[index_a] - b[index_b]);

		a.erase(a.begin() + index_a);
		b.erase(b.begin() + index_b);
	}
	return result;
}

int main()
{
	std::vector&lt;int&gt; a = { 5, 7, 9 };
	std::vector&lt;int&gt; b = { 6, 10, 11, 13 };

	std::vector&lt;int&gt; c = most_common_pairs(a, b);

	for (auto const &amp;item : c)
	{
		std::cout &lt;&lt; item &lt;&lt; '\n'; // Output: -1, -1, -4
	}
}
</code></pre>
<p>Kann man da noch was optimieren/verbessern? Die Funktion <code>most_common_pairs</code> wird halt extrem oft mit sehr langen vectoren als input Parametern aufgerufen, was ziemlich dauert...</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/332181/frage-zu-algorithmus-quot-finde-ähnlichste-paare-quot</link><generator>RSS for Node</generator><lastBuildDate>Tue, 28 Apr 2026 10:56:54 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/332181.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 14 Apr 2015 17:17:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zu Algorithmus: &amp;quot;Finde ähnlichste Paare&amp;quot; on Tue, 14 Apr 2015 17:18:42 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich hab ein Bottleneck in meiner Anwendung (sagt mir zumindest mein Profiler^^) bei meinem Algorithmus, welcher die &quot;ähnlichsten Paare&quot; aus zwei vectoren (bzw. sequentiellen Containern) suchen soll.</p>
<p>Ein Beispiel (die Container sind sortiert):</p>
<pre><code>Input: 
a = 5, 7, 9 
b = 6, 10, 11, 13

Output:
c = -1, -1, -4
</code></pre>
<p>Die &quot;ähnlichsten Paare&quot; (also die mit geringster quadratischer Abweichung) wären hier:</p>
<pre><code>5 und 6 -&gt; Differenz = -1
9 und 10 -&gt; Differenz = -1
7 und 11 -&gt; Differenz = -4
</code></pre>
<p>Im output c sollen die Differenzen der ähnlichsten Paare gespeichert werden.</p>
<p>Mein bisheriger Algorithmus sieht so aus (noch nicht templatisiert etc.):</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;algorithm&gt;
#include &lt;limits&gt;

void find_minimum_index(std::vector&lt;int&gt; const &amp;a, std::vector&lt;int&gt; const &amp;b, int &amp;index_a, int &amp;index_b)
{
	int min_deviation = std::numeric_limits&lt;int&gt;::max();

	for (size_t i = 0; i &lt; a.size(); ++i)
	{
		for (size_t j = 0; j &lt; b.size(); ++j)
		{
			int cur_deviation = std::abs(a[i] - b[j]);
			if (cur_deviation &lt; min_deviation)
			{
				min_deviation = cur_deviation;
				index_a = i;
				index_b = j;
			}
		}
	}
}

std::vector&lt;int&gt; most_common_pairs(std::vector&lt;int&gt; a, std::vector&lt;int&gt; b)
{
	std::vector&lt;int&gt; result;
	result.reserve(std::min(a.size(), b.size()));

	while (!a.empty() &amp;&amp; !b.empty())
	{
		int index_a, index_b;
		find_minimum_index(a, b, index_a, index_b);

		result.push_back(a[index_a] - b[index_b]);

		a.erase(a.begin() + index_a);
		b.erase(b.begin() + index_b);
	}
	return result;
}

int main()
{
	std::vector&lt;int&gt; a = { 5, 7, 9 };
	std::vector&lt;int&gt; b = { 6, 10, 11, 13 };

	std::vector&lt;int&gt; c = most_common_pairs(a, b);

	for (auto const &amp;item : c)
	{
		std::cout &lt;&lt; item &lt;&lt; '\n'; // Output: -1, -1, -4
	}
}
</code></pre>
<p>Kann man da noch was optimieren/verbessern? Die Funktion <code>most_common_pairs</code> wird halt extrem oft mit sehr langen vectoren als input Parametern aufgerufen, was ziemlich dauert...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450180</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450180</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Tue, 14 Apr 2015 17:18:42 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Algorithmus: &amp;quot;Finde ähnlichste Paare&amp;quot; on Tue, 14 Apr 2015 18:40:42 GMT]]></title><description><![CDATA[<p>7 und 6 ist &quot;ähnlicher&quot; als 7 und 11.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450193</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450193</guid><dc:creator><![CDATA[xgrif]]></dc:creator><pubDate>Tue, 14 Apr 2015 18:40:42 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Algorithmus: &amp;quot;Finde ähnlichste Paare&amp;quot; on Tue, 14 Apr 2015 18:47:23 GMT]]></title><description><![CDATA[<p>xgrif schrieb:</p>
<blockquote>
<p>7 und 6 ist &quot;ähnlicher&quot; als 7 und 11.</p>
</blockquote>
<p>6 wurde schon im Schritt davor eleminiert, durch den Vergleich mit 5 (5 und 6 sind einander genauso ähnlich wie 7 und 6).</p>
<p>Nachdem ein Paar gebildet wurde wird dieses aus den vectoren a und b entfernt, daher bleibt als bestes Paar 7 und 11 übrig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450195</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450195</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Tue, 14 Apr 2015 18:47:23 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Algorithmus: &amp;quot;Finde ähnlichste Paare&amp;quot; on Tue, 14 Apr 2015 19:43:39 GMT]]></title><description><![CDATA[<p>Frage: Bei den Listen</p>
<pre><code>1 7
6 9
</code></pre>
<p>Ist die Lösung 7-6, 1-9 oder 1-6, 7-9?</p>
<p>Für beide Fälle gibt es bessere Ansätze wie deiner, aber ich mache mir nicht die Mühe, beide sauber aufzuschreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450202</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450202</guid><dc:creator><![CDATA[parrybear]]></dc:creator><pubDate>Tue, 14 Apr 2015 19:43:39 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Algorithmus: &amp;quot;Finde ähnlichste Paare&amp;quot; on Tue, 14 Apr 2015 19:57:24 GMT]]></title><description><![CDATA[<p>parrybear schrieb:</p>
<blockquote>
<p>Frage: Bei den Listen</p>
<pre><code>1 7
6 9
</code></pre>
<p>Ist die Lösung 7-6, 1-9 oder 1-6, 7-9?</p>
</blockquote>
<p>Meinst du die Listen jetzt vertikal oder horizontal gelesen? Ich gehe mal von horizontal aus, also</p>
<pre><code>a = 1, 7
b = 6, 9
</code></pre>
<p>Lösung wäre dann entsprechend 7-6 und 1-9, also</p>
<pre><code>c = 1, -8
</code></pre>
<p>parrybear schrieb:</p>
<blockquote>
<p>Für beide Fälle gibt es bessere Ansätze wie deiner, aber ich mache mir nicht die Mühe, beide sauber aufzuschreiben.</p>
</blockquote>
<p>Ok, und unsauber? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
Komplexität ist ja momentan ungefähr O(n^3) (a und b sind meistens ziemlich gleich lang)... wäre schön wenn man das irgendwie drücken könnte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450206</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450206</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Tue, 14 Apr 2015 19:57:24 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Algorithmus: &amp;quot;Finde ähnlichste Paare&amp;quot; on Tue, 14 Apr 2015 20:08:20 GMT]]></title><description><![CDATA[<p>Ok, dann also greedy die besten Paare suchen.</p>
<p>Mein Vorschlag wäre alle Paare generieren, sortieren und der Reihe nach durchgehen.</p>
<pre><code class="language-cpp">std::vector&lt;int&gt; most_common_pairs(std::vector&lt;int&gt; a, std::vector&lt;int&gt; b)
{
  std::vector&lt;std::tuple&lt;int, std::size_t, std::size_t&gt;&gt; pairs;
  for (std::size_t i=0; i&lt;a.size(); ++i)
    for (std::size_t j=0; j&lt;b.size(); ++j)
      pairs.emplace_back(std::abs(a[i]-b[j]), i, j);
  std::sort(pairs.begin(), pairs.end());
  std::vector&lt;bool&gt; used_a(a.size());
  std::vector&lt;bool&gt; used_b(b.size());
  std::vector&lt;int&gt; result;
  for (auto&amp; t : pairs) {
    int d, i, j;
    std::tie(d, i, j) = t;
    if (!used_a[i] &amp;&amp; !used_b[j]) {
      result.push_back(d);
      used_a[i] = used_b[j] = true;
    }
  }
  return result;
}
</code></pre>
<p>Laufzeit ist O(n^2 log n).</p>
<p>Geht vielleicht noch besser, aber vielleicht reicht das ja schon?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450208</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450208</guid><dc:creator><![CDATA[parrybear]]></dc:creator><pubDate>Tue, 14 Apr 2015 20:08:20 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Algorithmus: &amp;quot;Finde ähnlichste Paare&amp;quot; on Tue, 14 Apr 2015 20:28:19 GMT]]></title><description><![CDATA[<p>Und was soll die Lösung bei</p>
<p>1 4<br />
3 5</p>
<p>sein?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450210</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450210</guid><dc:creator><![CDATA[xgrif]]></dc:creator><pubDate>Tue, 14 Apr 2015 20:28:19 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Algorithmus: &amp;quot;Finde ähnlichste Paare&amp;quot; on Tue, 14 Apr 2015 20:35:49 GMT]]></title><description><![CDATA[<p>xgrif schrieb:</p>
<blockquote>
<p>Und was soll die Lösung bei</p>
<p>1 4<br />
3 5</p>
<p>sein?</p>
</blockquote>
<p>Optimalerweise 4-5 und 1-3, also</p>
<p>-1, -2</p>
<p>Mein Algorithmus macht das aber auch noch falsch merke ich gerade, das scheint noch komplizierter zu werden... <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>
<p>EDIT:</p>
<p>parrybear schrieb:</p>
<blockquote>
<p>Mein Vorschlag wäre alle Paare generieren, sortieren und der Reihe nach durchgehen.</p>
</blockquote>
<p>Erst jetzt gesehen, werd ich mir gleich mal anschauen, danke <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/2450213</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450213</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Tue, 14 Apr 2015 20:35:49 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Algorithmus: &amp;quot;Finde ähnlichste Paare&amp;quot; on Tue, 14 Apr 2015 20:59:08 GMT]]></title><description><![CDATA[<p>Wieso ist der Greedy n^2 log n? Für mich ist der n^2... <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="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450217</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450217</guid><dc:creator><![CDATA[komplex]]></dc:creator><pubDate>Tue, 14 Apr 2015 20:59:08 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Algorithmus: &amp;quot;Finde ähnlichste Paare&amp;quot; on Wed, 15 Apr 2015 05:11:59 GMT]]></title><description><![CDATA[<p>und warum bevorzugst du in parrybears beispiel die abstaende (1,-8) gegenueber der anderen loesung mit abstaenden (-2,-5)? die summe der absolut abstaende ist im zweiten fall (7) kleiner als im ersten (9), ebenso wie die summe der quadratischen abstaende (29 zu 65), die du im op mal erwaehnst.</p>
<p>was ist das genaue(!) guetekriterium, nach dem zwei potentielle loesungen verglichen werden sollen um die bessere loesung zu ermitteln?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450241</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450241</guid><dc:creator><![CDATA[xgrif]]></dc:creator><pubDate>Wed, 15 Apr 2015 05:11:59 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Algorithmus: &amp;quot;Finde ähnlichste Paare&amp;quot; on Wed, 15 Apr 2015 06:03:04 GMT]]></title><description><![CDATA[<p>parrybears Idee geht wohl schon in die richtige Richtung, wenn du denn wirklich einen Algorithmus haben willst der greedy ist. Nur so ein Algorithmus wird nicht immer die Paare finden, die in der Summe am aehnlichsten sind. Mein Gefuehl sagt mir, das diese Aufgabe NP vollstaendig ist weil mir das dem TSP verwandt erscheint (Paare von Staedten suchen die geringen Abstand haben mit einer etwas anderen Randbedingung). Von daher waere die Frage erstmal ob du die beste Loesung brauchst oder eine die ihr nur nahe kommt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450243</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450243</guid><dc:creator><![CDATA[TGGC]]></dc:creator><pubDate>Wed, 15 Apr 2015 06:03:04 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Algorithmus: &amp;quot;Finde ähnlichste Paare&amp;quot; on Wed, 15 Apr 2015 06:16:25 GMT]]></title><description><![CDATA[<p>Mein Gefühl sagt mir, dass Du da falsch liegst, da das ein Matching-Problem ist und diese polynomiell lösbar sind -- allerdings im Allgemeinen nicht mit einem einfachen Greedy-Verfahren. Der Hauptunterschied zum TSP ist, dass man hier nicht fordert, dass die ausgewählten Verbindungen (Paare) einen zusammenhängenden Graphen ergeben... und das macht alles leichter.</p>
<p>Hier dürfte der Fall deutlich einfacher sein: Beide Listen sortieren und dann die kleinere in die größere matchen mittels dynamischem Programm. Vorher mal irgendwann beweisen, dass wenn a&lt;b in Liste A und c&lt;d in Liste B, dass dann ac und bd besser ist als ad und bc, die Paare also in beiden Listen sortiert vorliegen. Das schränkt den Suchraum deutlich ein, sodass man sich eigentlich nur noch merken muss bis zu welchem Element der langen Liste man schon vorgerückt ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450246</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450246</guid><dc:creator><![CDATA[Jester]]></dc:creator><pubDate>Wed, 15 Apr 2015 06:16:25 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Algorithmus: &amp;quot;Finde ähnlichste Paare&amp;quot; on Wed, 15 Apr 2015 06:28:12 GMT]]></title><description><![CDATA[<p>Jester schrieb:</p>
<blockquote>
<p>Der Hauptunterschied zum TSP ist, dass man hier nicht fordert, dass die ausgewählten Verbindungen (Paare) einen zusammenhängenden Graphen ergeben... und das macht alles leichter.</p>
</blockquote>
<p>Ja, wenn man eine Methode findet, die zeigt, das der zusammenhaengene Graph nicht die beste Loesung sein wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450249</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450249</guid><dc:creator><![CDATA[TGGC]]></dc:creator><pubDate>Wed, 15 Apr 2015 06:28:12 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Algorithmus: &amp;quot;Finde ähnlichste Paare&amp;quot; on Wed, 15 Apr 2015 08:04:36 GMT]]></title><description><![CDATA[<p>xgrif schrieb:</p>
<blockquote>
<p>und warum bevorzugst du in parrybears beispiel die abstaende (1,-8) gegenueber der anderen loesung mit abstaenden (-2,-5)? die summe der absolut abstaende ist im zweiten fall (7) kleiner als im ersten (9), ebenso wie die summe der quadratischen abstaende (29 zu 65), die du im op mal erwaehnst.</p>
</blockquote>
<p>Ja, das stimmt, dieses Problem hatte ich nicht bedacht...</p>
<p>Problem bei meinem jetzigen (und parrybears) Algorithmus ist, dass wenn es mehrere gleichgute Lösungen gibt es nicht egal ist welche man nimmt (wie in deinem Beispiel).</p>
<p>Das Ganze ist Teil einer Kostenfunktion für einen Optimierungsalgorithmus zur Auslegung von Bauteilen, deswegen ist mir das bis jetzt noch gar nicht aufgefallen (der Algorithmus optimiert schon, allerdings wahrscheinlich nicht so gut wie wenn der Algorithmus richtig wäre)...</p>
<p>Am besten wäre wohl wenn am Ende die Summe der Quadrate über den result vector minimal wäre. Allerdings darf ein einmal gebildetes Paar nicht weiter verwendet werden (sonst könnte man ja einfach alle Kombinationsmölichkeiten in O(n^2) erstellen und die n besten nehmen)... Weiß gerade nicht wie ich das lösen soll <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/2450257</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450257</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Wed, 15 Apr 2015 08:04:36 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Algorithmus: &amp;quot;Finde ähnlichste Paare&amp;quot; on Wed, 15 Apr 2015 11:45:18 GMT]]></title><description><![CDATA[<p>TGGC schrieb:</p>
<blockquote>
<p>Jester schrieb:</p>
<blockquote>
<p>Der Hauptunterschied zum TSP ist, dass man hier nicht fordert, dass die ausgewählten Verbindungen (Paare) einen zusammenhängenden Graphen ergeben... und das macht alles leichter.</p>
</blockquote>
<p>Ja, wenn man eine Methode findet, die zeigt, das der zusammenhaengene Graph nicht die beste Loesung sein wird.</p>
</blockquote>
<p>Nein, es sagt niemand, dass die Lösung für ein einfacheres Problem nicht auch mal zufällig eine Lösung für ein schwierigeres Problem sein darf.</p>
<p>Hier tritt aber selbst dieser Fall nicht auf, da ja nur Paare gebildet werden und damit kein Knoten zweimal vorkommt -- also können auch keine Kreise entstehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450296</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450296</guid><dc:creator><![CDATA[Jester]]></dc:creator><pubDate>Wed, 15 Apr 2015 11:45:18 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Algorithmus: &amp;quot;Finde ähnlichste Paare&amp;quot; on Wed, 15 Apr 2015 12:19:42 GMT]]></title><description><![CDATA[<p>Jester schrieb:</p>
<blockquote>
<p>Nein, es sagt niemand, dass die Lösung für ein einfacheres Problem nicht auch mal zufällig eine Lösung für ein schwierigeres Problem sein darf.</p>
</blockquote>
<p>Ja, das stimmt. Ich hatte mir das so vorgestellt, das ich die Paare dann aneinanderhaenge und sich so ein Kreis ergibt, fuer den Fall das zufaelligerweise genau diese restlichen Kosten 0 waeren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450302</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450302</guid><dc:creator><![CDATA[TGGC]]></dc:creator><pubDate>Wed, 15 Apr 2015 12:19:42 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Algorithmus: &amp;quot;Finde ähnlichste Paare&amp;quot; on Wed, 15 Apr 2015 13:29:23 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/30076">@happystudent</a>: Versuch mal zu beweisen dass man Paare nicht verdrehen sollte. Also wenn ich a&lt;b in Liste A und c&lt;d in Liste B habe, dass dann die Paare ac und bd immer genauso gut oder besser als die Paarung ad und bc ist.</p>
<p>Wenn das gilt, löst es direkt das Problem wenn die Listen gleich lang sind, weil Du einfach nur sortieren musst und den kleinsten Eintrag aus A mit dem kleinsten Eintrag aus B paaren musst usw.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450316</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450316</guid><dc:creator><![CDATA[Jester]]></dc:creator><pubDate>Wed, 15 Apr 2015 13:29:23 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Algorithmus: &amp;quot;Finde ähnlichste Paare&amp;quot; on Wed, 15 Apr 2015 13:58:28 GMT]]></title><description><![CDATA[<p>Jester schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/30076">@happystudent</a>: Versuch mal zu beweisen dass man Paare nicht verdrehen sollte. Also wenn ich a&lt;b in Liste A und c&lt;d in Liste B habe, dass dann die Paare ac und bd immer genauso gut oder besser als die Paarung ad und bc ist.</p>
</blockquote>
<p>Ok. Sei</p>
<p><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>a</mi><mo>&lt;</mo><mi>b</mi><mo separator="true">,</mo><mi>c</mi><mo>&lt;</mo><mi>d</mi><mtext><mtext> </mtext><mi mathvariant="normal">u</mi><mi mathvariant="normal">n</mi><mi mathvariant="normal">d</mi><mtext> </mtext></mtext><mi>a</mi><mo separator="true">,</mo><mi>b</mi><mo separator="true">,</mo><mi>c</mi><mo separator="true">,</mo><mi>d</mi><mo>≠</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">a &lt; b, c &lt; d \text{ und } a,b,c,d \neq 0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="strut" style="height:0.716em;"></span><span class="strut bottom" style="height:0.9309999999999999em;vertical-align:-0.215em;"></span><span class="base textstyle uncramped"><span class="mord mathit">a</span><span class="mrel">&lt;</span><span class="mord mathit">b</span><span class="mpunct">,</span><span class="mord mathit">c</span><span class="mrel">&lt;</span><span class="mord mathit">d</span><span class="text mord textstyle uncramped"><span class="mord mspace"> </span><span class="mord mathrm">u</span><span class="mord mathrm">n</span><span class="mord mathrm">d</span><span class="mord mspace"> </span></span><span class="mord mathit">a</span><span class="mpunct">,</span><span class="mord mathit">b</span><span class="mpunct">,</span><span class="mord mathit">c</span><span class="mpunct">,</span><span class="mord mathit">d</span><span class="mrel">≠</span><span class="mord mathrm">0</span></span></span></span></p>
<p>Dann folgt daraus für die Summe der Abstandsquadrate:</p>
(a - c)^2 + (b - d)^2 \leq (a - d)^2 + (b - c)^2 \\  
a^2 - 2ac + c^2 + b^2 - 2bd + d^2 \leq a^2 - 2ad + d^2 + b^2 - 2bc + c^2 \\  
-2ac - 2bd \leq -2ad - 2bc \\  
ac + bd \geq ad + bc \\  
ac - ad \geq bc - bd \\  
a(c -d) \geq b(c - d) \\  
a \geq b \\
<p>und damit ein Widerspruch zu unserer ursprünglichen Annahme dass a &lt; b.<br />
Die Bedingung ist somit nicht erfüllt und zwar für allgemeine a, b, c, d.</p>
<p>Hilft es vielleicht dass die vectoren streng monoton sind?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450323</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450323</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Wed, 15 Apr 2015 13:58:28 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Algorithmus: &amp;quot;Finde ähnlichste Paare&amp;quot; on Wed, 15 Apr 2015 14:11:09 GMT]]></title><description><![CDATA[<p>Und jetzt finde den Fehler. <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="🙂"
    /> Tipp: was ist das Vorzeichen von (c-d)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450324</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450324</guid><dc:creator><![CDATA[Jester]]></dc:creator><pubDate>Wed, 15 Apr 2015 14:11:09 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Algorithmus: &amp;quot;Finde ähnlichste Paare&amp;quot; on Wed, 15 Apr 2015 14:27:04 GMT]]></title><description><![CDATA[<p>Jester schrieb:</p>
<blockquote>
<p>Und jetzt finde den Fehler. <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="🙂"
    /> Tipp: was ist das Vorzeichen von (c-d)?</p>
</blockquote>
<p>Hm, ungünstig ungeformt. Wie wärs damit:</p>
\vdots \\  
ac + bd \geq ad + bc \\  
bd - ad \geq bc - ac \\  
d(b - a) \geq c \underbrace{(b - a)}_{b - a > 0} \\  
d \geq c\\
<p>was widerum ein Widerspruch wäre, da c &lt; d gefordert war.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450325</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450325</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Wed, 15 Apr 2015 14:27:04 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Algorithmus: &amp;quot;Finde ähnlichste Paare&amp;quot; on Wed, 15 Apr 2015 14:49:07 GMT]]></title><description><![CDATA[<p>happystudent schrieb:</p>
<blockquote>
<p>d \geq c\\<br />
was widerum ein Widerspruch wäre, da c &lt; d gefordert war.</p>
</blockquote>
<p>Wenn c &lt; d, ist d &gt; c...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450332</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450332</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Wed, 15 Apr 2015 14:49:07 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Algorithmus: &amp;quot;Finde ähnlichste Paare&amp;quot; on Wed, 15 Apr 2015 14:50:20 GMT]]></title><description><![CDATA[<p>Wo genau findet sich der Widerspruch zwischen c&lt;=d und c&lt;d?</p>
<p>edit: mit anderen Worten, eigentlich hast Du die Aussage bewiesen. Es kommt nämlich eine Bedingung heraus, die nach Eingangsvoraussetzung erfüllt ist. <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/2450333</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450333</guid><dc:creator><![CDATA[Jester]]></dc:creator><pubDate>Wed, 15 Apr 2015 14:50:20 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Algorithmus: &amp;quot;Finde ähnlichste Paare&amp;quot; on Wed, 15 Apr 2015 16:16:54 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>Wenn c &lt; d, ist d &gt; c...</p>
</blockquote>
<p>Jester schrieb:</p>
<blockquote>
<p>Wo genau findet sich der Widerspruch zwischen c&lt;=d und c&lt;d?</p>
<p>edit: mit anderen Worten, eigentlich hast Du die Aussage bewiesen. Es kommt nämlich eine Bedingung heraus, die nach Eingangsvoraussetzung erfüllt ist. <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>
<p>Oh verdammt, ihr habt recht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Gut, dann ist das jetzt bewiesen, aber das bringt ja nur was bei gleichlangen Listen, richtig? Weil meistens sind die Listen halt unterschiedlich lang (die Länge ist zwar ungefähr gleich, aber fast nie identisch).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450351</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450351</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Wed, 15 Apr 2015 16:16:54 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Algorithmus: &amp;quot;Finde ähnlichste Paare&amp;quot; on Wed, 15 Apr 2015 18:11:36 GMT]]></title><description><![CDATA[<p>Das bringt viel! Jetzt ist die Frage nur noch, welche Elemente du aus der langen Liste rausschmeißt. Welche Paare zusammen gehören ergibt sich dann von ganz alleine. Und die Aufgabe ist ratz fatz mit einem dynamischen Programm gelöst.</p>
<p>OE sei A die längere Liste. Entweder A[1] spielt mit, und (A[1], B[1]) ist das erste Paar und du musst nur noch den Rest A[2...] und B[2...] prüfen, oder A[1] fliegt raus und du vergleichst A[2...] gegen B[1...]. Das ganze bricht ab, wenn A und B gleich lang sind, dann müssen alle Paare rein. Da in jedem Schritt A ein Element kürzer wird, bricht der Algorithmus auch schnell ab.</p>
<p>happystudent schrieb:</p>
<blockquote>
<p>Das Ganze ist Teil einer Kostenfunktion für einen Optimierungsalgorithmus [...]</p>
</blockquote>
<p>Meinst du nicht, dass die Kostenfunktion ein wesentlicher Teil des Problems ist, und du genau mit der mal rausrücken solltest? Und zwar am besten schon im Anfangspost!</p>
<p>Obiger Algorithmus funktioniert auch nur mit der Summe der quadratischen Abstände als Kostenfunktion, denn du hast ja eine Eigenschaft der quadratischen Abstände in deinem letzten Beweis genutzt, um zu diesem Algorithmus zu kommen.</p>
<p>Wenn du jetzt endlich mal mit der Kostenfunktion rausrückst und es dann nicht die Summe der quadratischen Abstände ist, war u. U. bisher alles für die Katz.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450375</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450375</guid><dc:creator><![CDATA[xgrif]]></dc:creator><pubDate>Wed, 15 Apr 2015 18:11:36 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Algorithmus: &amp;quot;Finde ähnlichste Paare&amp;quot; on Wed, 15 Apr 2015 18:41:36 GMT]]></title><description><![CDATA[<p>xgrif schrieb:</p>
<blockquote>
<p>Wenn du jetzt endlich mal mit der Kostenfunktion rausrückst und es dann nicht die Summe der quadratischen Abstände ist, war u. U. bisher alles für die Katz.</p>
</blockquote>
<p>Naja, also der Algorithmus ist eigentlich schon die Kostenfunktion. Man hat halt zwei unterschiedlich lange Vektoren, die möglichst &quot;ähnlich&quot; zueinander gemacht werden sollen.</p>
<p>Da sie unterschiedlich lang sind, läuft das in zwei Schritten: Zuerst werden die ähnlichsten Paare bestimmt. Das ergibt dann zwei gleich lange Vektoren, die auf klassische Art und Weise verglichen werden können und einen Kostenwert x liefern.</p>
<p>Im zweiten Schritt wird dann mittels einer Heuristik noch ein zusätzlicher Kostenwert y bestimmt, der berücksichtigt wie unterschiedlich die Länge der beiden Vektoren ist. Die Gesamtkosten ergeben sich dann als z = x + y. Am besten wäre nämlich, wenn die beiden Vektoren genau gleich lang wären und identische Einträge hätten.</p>
<p>Es handelt sich dabei um eine physikalisches Model, das so parametriert werden soll, dass die von ihm produzierten Outputs einem vom Benutzer vorgegebenen Wunsch-Output entsprechen (bei gleichem Input). Im Prinzip sieht das so aus:</p>
<pre><code>input = user input 1 // Model input
x_set = user input 2 // Gewünschter Model output

while (error is big)
    p = determine new parameters // Irgendeine Optimierungsmethode
    x_cur = ModelFunction(p, input) // Output des Models mit den aktuellen Parametern p
    error = CalculateErrorBetween(x_cur, x_set) // Fehlerberechnung
endwhile
</code></pre>
<p>Problem ist eben dass die Länge des Outputs des Modells (also die Länge des Vektors <code>x_cur</code> ) abhängig von den Parametern <code>p</code> ist.</p>
<p>Mit der oben beschriebenen Methode funktioniert es in einigen Fällen schon ziemlich gut, in anderen aber schlecht bis gar nicht. Außerdem ist die Laufzeit sehr hoch.</p>
<p>So, ich hoffe das waren dann alle relevanten Infos. Letztendlich sollte das Grundproblem sich dadurch aber nicht ändern?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450383</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450383</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Wed, 15 Apr 2015 18:41:36 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Algorithmus: &amp;quot;Finde ähnlichste Paare&amp;quot; on Wed, 15 Apr 2015 19:47:18 GMT]]></title><description><![CDATA[<p>happystudent schrieb:</p>
<blockquote>
<p>Das ergibt dann zwei gleich lange Vektoren, die auf klassische Art und Weise verglichen werden können</p>
</blockquote>
<p>Und warum sagst du nicht einfach, wie du sie genau vergleichst? Das ist immerhin das entscheidende Kriterium und macht den Unterschied aus, ob der Algorithmus passt oder nicht. Ich hab zwar eine Kristallkugel, die mir zu &quot;auf klassische Art und Weise&quot; ein trübes Bild liefert, aber das tut doch nun wirklich nicht Not hier auf so nebulöse Angaben aufzubauen.</p>
<blockquote>
<p>Im zweiten Schritt wird dann mittels einer Heuristik noch ein zusätzlicher Kostenwert y bestimmt, der berücksichtigt wie unterschiedlich die Länge der beiden Vektoren ist.</p>
</blockquote>
<p>Eine Heuristik wovon? Von dem Kostenwert der unterschiedlich langen Listen? Wenn du direkt an den ran kommst, wozu der Umweg?</p>
<blockquote>
<p>Mit der oben beschriebenen Methode funktioniert es in einigen Fällen schon ziemlich gut, in anderen aber schlecht bis gar nicht.</p>
</blockquote>
<p>Was kommt bei einem Beispiel raus, bei dem es nicht gut funktioniert? Und woher weißt du, dass es nicht gut funktioniert hat?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450389</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450389</guid><dc:creator><![CDATA[xgrif]]></dc:creator><pubDate>Wed, 15 Apr 2015 19:47:18 GMT</pubDate></item></channel></rss>