c# – 为什么SortedList不使用指针的值?

前端之家收集整理的这篇文章主要介绍了c# – 为什么SortedList不使用指针的值?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
所以我正在查看SortedList< TKey,TValue>的实现.并且Add(其中调用Insert如下所示)的实现真的让我感到意外.

添加方法做出明显的二进制搜索来确定KVP应该去哪里的索引,但是Insert似乎可以显着改善(尽管当然是更大的比例):

private void Insert(int index,TKey key,TValue value)
{
  if (this._size == this.keys.Length)
    this.EnsureCapacity(this._size + 1);
  if (index < this._size)
  {
    Array.Copy((Array) this.keys,index,(Array) this.keys,index + 1,this._size - index);
    Array.Copy((Array) this.values,(Array) this.values,this._size - index);
  }
  this.keys[index] = key;
  this.values[index] = value;
  ++this._size;
  ++this.version;
}

如果我正确阅读,我保留在任何时候都是错的权利,这是一个O(2n)操作.

在我看来,值应该用指针来实现.类似于LinkedList的关键字的值,但没有链接,因为它不支持随机访问.更重要的是关键是简单地链接到它的价值. get操作不会慢一些,因为我们有指针也不会删除,而是添加操作现在是O(n).

有人可以明白为什么这个决定可能走向这个方向?

解决方法

这不应该让你感到惊讶,它在MSDN的SortedList文章中有详细的记录:

SortedDictionary has faster insertion and removal operations for unsorted data,O(logn) as opposed to O(n) for SortedList.

SortedDictionary使用红黑树(即“指针”),SortedList是一个数组.根据您收集的内容,您可以选择两者之间.两者都是O(logn)用于查找,但是如果您经常迭代集合,那么您可以在SortedList中获得很大的收益.它更有效地使用cpu缓存.在现代机器上产生巨大的差异.

另外请注意,向集合添加项目的效率在很大程度上取决于项目的排序方式. SortedDictionary真的喜欢随机数据,给它更好的几率,不必重新平衡树.将其排序给出最坏情况的O(n)行为. SortedList真的喜欢排序的项目,使添加O(1).

猜你在找的C#相关文章