<?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[schnell intervall finden]]></title><description><![CDATA[<p>ich möchte double Wert einem Intervall zupordnen. Derzeit mache ich das primitiv mit</p>
<pre><code class="language-cpp">double digitizedValue(double value)
	{
		if (value == m_InputLevel[0]) // 1. Level == 0
			return m_OutputLevel[0];

		for (int level = 0; level &lt; m_LevelNumber - 1; level++)
		{
			double comparevalue1 = m_InputLevel[level];
			double comparevalue2 = m_InputLevel[level + 1];
			if ((value &gt; comparevalue1) &amp;&amp; (value &lt;= comparevalue2))
				return m_OutputLevel[level];
		}
		// if nothing can be applied (should never happen)
		return m_InputLevel[0];
	}
</code></pre>
<p>Es wird dabei geschaut zwischen welchem Bereich (leve)</p>
<pre><code>m_InputLevel[level] &lt; value &lt;= m_InputLevel[level + 1]
</code></pre>
<p>der Wert value liegt.</p>
<p>Das ganze ist nur unheimlich langsamm. Für 1000x1000 Werte dauert das ganze 1-2 Sekunden.</p>
<p>Die Werte liegen in InputLevel der Größe nach sortiert vor.</p>
<p>Mir würde noch einfallen die Suche erst mit einem Gröberen Intervall 10 Punkte aus 256 und dann mit den übrigen 10 genauen Punkten durchzuführen.<br />
Ich könnte aber auch das Intervall immer durch 2 teilen, schauen in welchem Bereich der Wert liegt und dann von diesem wieder druch 2 teilen, bis ich das Intervall habe.</p>
<p>Welche optimiertere Strategien gibt es noch? Welche machen Sinn?</p>
<p>Matthias</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/212121/schnell-intervall-finden</link><generator>RSS for Node</generator><lastBuildDate>Wed, 14 Oct 2026 15:58:23 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/212121.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 01 May 2008 21:57:33 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to schnell intervall finden on Thu, 01 May 2008 21:57:33 GMT]]></title><description><![CDATA[<p>ich möchte double Wert einem Intervall zupordnen. Derzeit mache ich das primitiv mit</p>
<pre><code class="language-cpp">double digitizedValue(double value)
	{
		if (value == m_InputLevel[0]) // 1. Level == 0
			return m_OutputLevel[0];

		for (int level = 0; level &lt; m_LevelNumber - 1; level++)
		{
			double comparevalue1 = m_InputLevel[level];
			double comparevalue2 = m_InputLevel[level + 1];
			if ((value &gt; comparevalue1) &amp;&amp; (value &lt;= comparevalue2))
				return m_OutputLevel[level];
		}
		// if nothing can be applied (should never happen)
		return m_InputLevel[0];
	}
</code></pre>
<p>Es wird dabei geschaut zwischen welchem Bereich (leve)</p>
<pre><code>m_InputLevel[level] &lt; value &lt;= m_InputLevel[level + 1]
</code></pre>
<p>der Wert value liegt.</p>
<p>Das ganze ist nur unheimlich langsamm. Für 1000x1000 Werte dauert das ganze 1-2 Sekunden.</p>
<p>Die Werte liegen in InputLevel der Größe nach sortiert vor.</p>
<p>Mir würde noch einfallen die Suche erst mit einem Gröberen Intervall 10 Punkte aus 256 und dann mit den übrigen 10 genauen Punkten durchzuführen.<br />
Ich könnte aber auch das Intervall immer durch 2 teilen, schauen in welchem Bereich der Wert liegt und dann von diesem wieder druch 2 teilen, bis ich das Intervall habe.</p>
<p>Welche optimiertere Strategien gibt es noch? Welche machen Sinn?</p>
<p>Matthias</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1501805</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1501805</guid><dc:creator><![CDATA[pospiech]]></dc:creator><pubDate>Thu, 01 May 2008 21:57:33 GMT</pubDate></item><item><title><![CDATA[Reply to schnell intervall finden on Thu, 01 May 2008 22:29:51 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">double digitizedValue(double value)
{
    return m_OutputLevel[ std::distance( &amp;m_InputLevel[ 0 ], std::lower_bound( &amp;m_InputLevel[ 0 ], &amp;m_InputLevel[ m_LevelNumber - 1 ], value ) ];
}
</code></pre>
<p>Unter der Annahme, dass es sich um Arrays handelt, sonst die Zeiger durch entsprechende Iteratoren ersetzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1501810</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1501810</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 01 May 2008 22:29:51 GMT</pubDate></item><item><title><![CDATA[Reply to schnell intervall finden on Fri, 02 May 2008 06:53:25 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<pre><code class="language-cpp">double digitizedValue(double value)
{
    return m_OutputLevel[ std::distance( &amp;m_InputLevel[ 0 ], std::lower_bound( &amp;m_InputLevel[ 0 ], &amp;m_InputLevel[ m_LevelNumber - 1 ], value ) ];
}
</code></pre>
<p>Unter der Annahme, dass es sich um Arrays handelt, sonst die Zeiger durch entsprechende Iteratoren ersetzen.</p>
</blockquote>
<p>Es sind vector arrays. Wie müsste das ganz den mit Iteratoren aussehen (habe damit noch nicht gearbeitet).</p>
<p>Gibt es weitere Informationen wie diese Funktion arbeitet und was sie genau macht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1501860</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1501860</guid><dc:creator><![CDATA[pospiech]]></dc:creator><pubDate>Fri, 02 May 2008 06:53:25 GMT</pubDate></item><item><title><![CDATA[Reply to schnell intervall finden on Fri, 02 May 2008 07:19:29 GMT]]></title><description><![CDATA[<p>pospiech schrieb:</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<pre><code class="language-cpp">double digitizedValue(double value)
{
    return m_OutputLevel[ std::distance( &amp;m_InputLevel[ 0 ], std::lower_bound( &amp;m_InputLevel[ 0 ], &amp;m_InputLevel[ m_LevelNumber - 1 ], value ) ];
}
</code></pre>
<p>Unter der Annahme, dass es sich um Arrays handelt, sonst die Zeiger durch entsprechende Iteratoren ersetzen.</p>
</blockquote>
<p>Es sind vector arrays. Wie müsste das ganz den mit Iteratoren aussehen (habe damit noch nicht gearbeitet).</p>
<p>Gibt es weitere Informationen wie diese Funktion arbeitet und was sie genau macht?</p>
</blockquote>
<p>lower_bound findet in einer sortierten Sequenz das erste Element, an dem unser Vergleichswert eingefügt werden könnte, ohne die Sortierung der Sequenz zu beeinflussen (upper_bound findet das letzte Element - das entspräche der Bedingung (value &gt;= comparevalue1) &amp;&amp; (value &lt; comparevalue2)).<br />
Beispiel:</p>
<pre><code>Sequenz:       0  5  6  9 10
Suche nach 3:     lu
Suche nach 6:        l  u
</code></pre>
<p>Hier markiert l das Element, auf dass der von lower_bound zurückgegebene Iterator zeigen würde, u das Element, dass zu upper_bound gehört. Dabei haben wir im Hinterkopf, dass der bei insert übergebene Iterator nach dem Einfügen jeweils auf das Element <em>nach</em> dem eingefügtene Element zeigt.<br />
lower_bound und upper_bound gehören zu den Algorithmen der Standardbibliothek, die mit sortierten Sequenzen arbeiten - diese haben logarithmische Laufzeit, wenn random-access-Iteratoren verwendet werden.</p>
<pre><code class="language-cpp">double digitizedValue(double value)
{
    return m_OutputLevel[ std::distance( m_InputLevel.begin(), std::lower_bound( m_InputLevel.begin(), m_InputLevel.end() - 1, value ) ];
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1501866</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1501866</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 02 May 2008 07:19:29 GMT</pubDate></item></channel></rss>