Note that there are some explanatory texts on larger screens.

plurals
  1. POfastest way to get n lowest from array
    primarykey
    data
    text
    <p>I need to find n lowest (which are not 0) from array of doubles (let's call the array <em>samples</em>). I need to do this many times in a loop, thus the speed of execution is crucial. I tried first sorting the array and then taking the first 10 values (which are not 0), however, although Array.Sort is said to be fast, it became the bottleneck:</p> <pre><code>const int numLowestSamples = 10; double[] samples; double[] lowestSamples = new double[numLowestSamples]; for (int count = 0; count &lt; iterations; count++) // iterations typically around 2600000 { samples = whatever; Array.Sort(samples); lowestSamples = samples.SkipWhile(x =&gt; x == 0).Take(numLowestSamples).ToArray(); } </code></pre> <p>Thus I tried a different, but less clean solution, by first reading in the first n values, sorting them, then looping through all other values in <em>samples</em> checking if the value is smaller than the last value in the sorted <em>lowestSamples</em> array. If the value is lower then replace it with the one in the array and sort the array again. This turned out to be approximately 5 times faster:</p> <pre><code>const int numLowestSamples = 10; double[] samples; List&lt;double&gt; lowestSamples = new List&lt;double&gt;(); for (int count = 0; count &lt; iterations; count++) // iterations typically around 2600000 { samples = whatever; lowestSamples.Clear(); // Read first n values int i = 0; do { if (samples[i] &gt; 0) lowestSamples.Add(samples[i]); i++; } while (lowestSamples.Count &lt; numLowestSamples) // Sort the array lowestSamples.Sort(); for (int j = numLowestSamples; j &lt; samples.Count; j++) // samples.Count is typically 3600 { // if value is larger than 0, but lower than last/highest value in lowestSamples // write value to array (replacing the last/highest value), then sort array so // last value in array still is the highest if (samples[j] &gt; 0 &amp;&amp; samples[j] &lt; lowestSamples[numLowestSamples - 1]) { lowestSamples[numLowestSamples - 1] = samples[j]; lowestSamples.Sort(); } } } </code></pre> <p>Although this works relatively fast, I wanted to challenge anyone to come up with an even faster and better solution.</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload