0

我正在写一些东西来记录跨对象的各种方法的性能。我想找到前 10 个最慢的时间。因此,我想要一个固定的排序列表,例如在我的案例 10 中。所以每当我有一个新的时间时,我只需插入它并对其进行排序。它将被修复,所以在我插入第 5 次之后(假设它在下面的示例中限制为 5)然后列表不会增长,但它只会将其插入列表中,并删除最小值。

例如

var topTen = new XXX<double>(5);

XXX.Insert(1);
XXX.Insert(3);
XXX.Insert(2);
XXX.Insert(6);
XXX.Insert(4);
XXX.Insert(5);

/*
topTen[0] is 6
topTen[1] is 5
topTen[2] is 4
topTen[3] is 3
topTen[4] is 2
*/

我打算为它写一些东西,但我只是想知道.net 中是否已经存在任何东西。

4

2 回答 2

0

通常,您对堆执行类似的操作。例如:

var heap = new BinaryHeap<int>();

for (int i = 0; i < 1000; ++i)
{
    var time = GetTimeSomehow();
    if (heap.Count < 5)
    {
        heap.Insert(time);
    }
    else if (time > heap.Peek())
    {
        // the new value is larger than the smallest value on the heap.
        // remove the smallest value and add this one.
        heap.RemoveRoot();
        heap.Insert(time);
    }
}

这将大小限制为 5,完成后,您可以按顺序获得前 5 名:

while (heap.Count > 0)
{
    var time = heap.RemoveRoot();
    Console.WriteLine(time);
}

.NET Framework 中没有可用的堆数据结构。不久前我发表了一篇简单的文章。请参阅通用 BinaryHeap 类

于 2013-03-22T21:57:51.013 回答
0

试试这个(未经测试):

int listLength = 5;

List<int> list = new List<int>(listLength+1);

void VerifyTime(int time) {
  list[listLength] = time;
  var i = listLength;
  while (listLength>0  &&  list[listLength] < list[listLength-1])
    swap(list, listLength, listLength-1);
}

void swap (List<int> l, int a, int b) {
  var temp = l[a];
  l[a] = l[b];
  l[b] = temp;
}

对于 ListLength 的任何小值,它应该可以正常工作。

于 2013-03-22T22:09:21.287 回答