<?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[k naechsten punkte zu einem referenzpunkt]]></title><description><![CDATA[<p>hi,</p>
<p>ich moechte folgenden algo optimieren:<br />
gegeben sind n punkte in 2d mit (xi, yi)</p>
<p>ich moechte die k naechsten punkte finden, welche die kuerzeste distanz zu einem referenzpunkt (x,y) haben.</p>
<p>ich hab einen vector sortiert in n log n...gehts noch schneller?</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;algorithm&gt;
#include &lt;queue&gt;
#include &lt;limits&gt;
#include &lt;ctime&gt;
using namespace std;

class coord {
public:
	int x;
	int y;
	coord(int x_, int y_): x(x_), y(y_) {}
};

class distIndex {
public:
	float dist;
	int index;
	distIndex(float dist_, int index_): dist(dist_), index(index_) {}
};

class Compare {
public:
	bool operator()(const distIndex &amp;lhs, const distIndex &amp;rhs) {
		return lhs.dist &lt; rhs.dist;
	}
};

vector&lt;coord&gt; find_k_nearest_points(vector&lt;coord&gt; points, coord ref, int k) {
	vector&lt;distIndex&gt; vec;
	vector&lt;coord&gt; k_nearest;

	for (int i = 0; i &lt; points.size(); i++) {
		int x = abs(points[i].x - ref.x);
		int y = abs(points[i].y - ref.y);
		float dist = sqrt(x * x + y * y);
		vec.push_back(distIndex(dist, i));
	}

	sort(vec.begin(), vec.end(), Compare());

	for (int i = 0; i &lt; k; i++) {
		int index = vec[i].index;
		k_nearest.push_back(points[index]);
	}

	return k_nearest;
}

int main() {

	vector&lt;coord&gt; vec = { { 1, 1 }, { 10, 2 }, { 8, 1 }, { 2, 2 }, { 5, 5 }, { 6, 2 }, { 3, 3 } };

	vector&lt;coord&gt; points = find_k_nearest_points(vec, coord(2, 3), 3);
	for_each(points.begin(), points.end(), [](coord p) { cout &lt;&lt; &quot;x: &quot; &lt;&lt; p.x &lt;&lt; &quot;, y: &quot; &lt;&lt; p.y &lt;&lt; endl; });

	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/328160/k-naechsten-punkte-zu-einem-referenzpunkt</link><generator>RSS for Node</generator><lastBuildDate>Wed, 08 Jul 2026 15:04:32 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/328160.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 25 Sep 2014 18:57:31 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to k naechsten punkte zu einem referenzpunkt on Thu, 25 Sep 2014 18:57:31 GMT]]></title><description><![CDATA[<p>hi,</p>
<p>ich moechte folgenden algo optimieren:<br />
gegeben sind n punkte in 2d mit (xi, yi)</p>
<p>ich moechte die k naechsten punkte finden, welche die kuerzeste distanz zu einem referenzpunkt (x,y) haben.</p>
<p>ich hab einen vector sortiert in n log n...gehts noch schneller?</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;algorithm&gt;
#include &lt;queue&gt;
#include &lt;limits&gt;
#include &lt;ctime&gt;
using namespace std;

class coord {
public:
	int x;
	int y;
	coord(int x_, int y_): x(x_), y(y_) {}
};

class distIndex {
public:
	float dist;
	int index;
	distIndex(float dist_, int index_): dist(dist_), index(index_) {}
};

class Compare {
public:
	bool operator()(const distIndex &amp;lhs, const distIndex &amp;rhs) {
		return lhs.dist &lt; rhs.dist;
	}
};

vector&lt;coord&gt; find_k_nearest_points(vector&lt;coord&gt; points, coord ref, int k) {
	vector&lt;distIndex&gt; vec;
	vector&lt;coord&gt; k_nearest;

	for (int i = 0; i &lt; points.size(); i++) {
		int x = abs(points[i].x - ref.x);
		int y = abs(points[i].y - ref.y);
		float dist = sqrt(x * x + y * y);
		vec.push_back(distIndex(dist, i));
	}

	sort(vec.begin(), vec.end(), Compare());

	for (int i = 0; i &lt; k; i++) {
		int index = vec[i].index;
		k_nearest.push_back(points[index]);
	}

	return k_nearest;
}

int main() {

	vector&lt;coord&gt; vec = { { 1, 1 }, { 10, 2 }, { 8, 1 }, { 2, 2 }, { 5, 5 }, { 6, 2 }, { 3, 3 } };

	vector&lt;coord&gt; points = find_k_nearest_points(vec, coord(2, 3), 3);
	for_each(points.begin(), points.end(), [](coord p) { cout &lt;&lt; &quot;x: &quot; &lt;&lt; p.x &lt;&lt; &quot;, y: &quot; &lt;&lt; p.y &lt;&lt; endl; });

	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2419222</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2419222</guid><dc:creator><![CDATA[c++14coder]]></dc:creator><pubDate>Thu, 25 Sep 2014 18:57:31 GMT</pubDate></item><item><title><![CDATA[Reply to k naechsten punkte zu einem referenzpunkt on Thu, 25 Sep 2014 19:22:23 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>
<p>Alternative: Merk dir doch nur die k kleinsten Werte, anstatt alle Werte.</p>
<p>Ansonsten zum Algorithmus: Kommt drauf an <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="🙂"
    /> . Wenn das eine einmalige Aktion ist, geht's kaum besser (außer mit den oben vorgeschlagenen Detailverbesserungen). Wenn du öfters die Funktion auf den gleichen Datensatz los lässt, dann kann man da was machen, indem man die Daten vorbehandelt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2419228</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2419228</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 25 Sep 2014 19:22:23 GMT</pubDate></item><item><title><![CDATA[Reply to k naechsten punkte zu einem referenzpunkt on Thu, 25 Sep 2014 20:56:06 GMT]]></title><description><![CDATA[<p>Die Wurzel kannst du weglassen, da du die Distanzen nur vergleichst -&gt; einen Funktionsaufruf pro Wert gespart.</p>
<p>Ansonsten würde ich <code>vector&lt;coord&gt; points</code> als <code>const&amp;</code> übergeben dann sparst du dir die Kopie. <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>EDIT:<br />
Das <code>abs</code> kannst du auch weglassen, da du x und y ja mit sich selbst multiplizierst. Dadurch sind die dann schon positiv -&gt; wieder zwei Funktionsaufrufe pro Wert gespart.</p>
<p>Außerdem würde ich für die Vektoren vec und k_nearest schonmal Speicher reservieren, dann sparst du dir den Overhead durch das neu-allokieren:</p>
<pre><code>vector&lt;distIndex&gt; vec;
vector&lt;coord&gt; k_nearest;

// vec ist immer genau so groß wie points. Alternativ halt k wenn du SeppJs Tipp umsetzt
vec.reserve(points.size()); 

// k_nearest ist entweder genau k lang, oder so groß wie points.size() wenn k größer als dieses ist
// Damit hast du dann immer die perfekte Speichergröße reserviert:
k_nearest.reserve(std::min(k, points.size()));
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2419230</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2419230</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Thu, 25 Sep 2014 20:56:06 GMT</pubDate></item></channel></rss>