我正在写一些内容来记录跨对象的各种方法的性能。我想找到前10个最慢的时间。因此,我想要一个类似于已修复的排序列表的东西,例如我的情况10.因此,每当我有新的时间,我只需插入它并命令它。它将被修复,所以在我插入第5次之后(假设下面的示例限制为5),列表将不会增长,但它只会将其插入列表中,并删除最小值。 / p>
E.g。
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中是否有任何东西。
答案 0 :(得分: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中没有可用的堆数据结构。我前段时间发表了一篇简单的文章。请参阅A Generic BinaryHeap Class。
答案 1 :(得分: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的任何小值,它应该可以正常工作。