Tôi cần phải tìm n thấp nhất (mà không phải là 0) từ mảng các đôi (chúng ta hãy gọi mảng mẫu). Tôi cần phải làm điều này nhiều lần trong một vòng lặp, do đó tốc độ thực hiện là rất quan trọng. Tôi đã cố gắng đầu tiên phân loại các mảng và sau đó lấy 10 giá trị đầu tiên (mà không phải là 0), tuy nhiên, mặc dù Array.Sort được cho là nhanh, nó đã trở thành nút cổ chai:cách nhanh nhất để có được n thấp nhất từ mảng
const int numLowestSamples = 10;
double[] samples;
double[] lowestSamples = new double[numLowestSamples];
for (int count = 0; count < iterations; count++) // iterations typically around 2600000
{
samples = whatever;
Array.Sort(samples);
lowestSamples = samples.SkipWhile(x => x == 0).Take(numLowestSamples).ToArray();
}
Vì vậy, tôi đã thử một khác nhau, nhưng giải pháp ít sạch, bằng cách đọc thứ nhất trong các giá trị n đầu tiên, phân loại chúng, sau đó lặp qua tất cả các giá trị khác trong mẫu kiểm tra nếu giá trị nhỏ hơn giá trị cuối cùng trong sắp xếp lowestSamples mảng. Nếu giá trị thấp hơn thì thay thế nó bằng giá trị trong mảng và sắp xếp lại mảng. Điều này hóa ra nhanh hơn khoảng 5 lần:
const int numLowestSamples = 10;
double[] samples;
List<double> lowestSamples = new List<double>();
for (int count = 0; count < iterations; count++) // iterations typically around 2600000
{
samples = whatever;
lowestSamples.Clear();
// Read first n values
int i = 0;
do
{
if (samples[i] > 0)
lowestSamples.Add(samples[i]);
i++;
} while (lowestSamples.Count < numLowestSamples)
// Sort the array
lowestSamples.Sort();
for (int j = numLowestSamples; j < 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] > 0 && samples[j] < lowestSamples[numLowestSamples - 1])
{
lowestSamples[numLowestSamples - 1] = samples[j];
lowestSamples.Sort();
}
}
}
Mặc dù điều này hoạt động tương đối nhanh, tôi muốn thách thức bất kỳ ai đưa ra giải pháp nhanh hơn và tốt hơn.
Tôi tự hỏi, nếu duy trì một min-heap là một giải pháp tốt ở đây. – ChaosPandion
ChaosPandion: Đánh bại tôi sau 5 giây;) – robbrit
Nếu đây là cái gì đó được gọi một lần là đạt được hiệu suất đáng giá thêm công việc/phức tạp (về khả năng bảo trì mã)? – Jake1164