.NET集合类的渐近复杂性

.NET集合类的渐近复杂性,.net,collections,big-o,asymptotic-complexity,.net,Collections,Big O,Asymptotic Complexity,关于.NET集合类(Dictionary,List等)的方法的渐进复杂性(big-O和其他)有什么参考资料吗 我知道C5库的文档包含一些关于它的信息(),但我对标准的.NET集合也感兴趣。。。(PowerCollections的信息也很好) MSDN列出了以下内容: (编辑:链接错误;下面是链接) 等等。例如: SortedList(TKey,TValue)通用 类是一个具有 O(logn)检索,其中n是 字典中的元素数。 在这方面,它类似于 SortedDictionary(TKey

关于.NET集合类(
Dictionary
List
等)的方法的渐进复杂性(big-O和其他)有什么参考资料吗

我知道C5库的文档包含一些关于它的信息(),但我对标准的.NET集合也感兴趣。。。(PowerCollections的信息也很好)

MSDN列出了以下内容:

  • (编辑:链接错误;下面是链接)
等等。例如:

SortedList(TKey,TValue)通用 类是一个具有 O(logn)检索,其中n是 字典中的元素数。 在这方面,它类似于 SortedDictionary(TKey,TValue)泛型 班级。这两个班级有相似的特点 对象模型,两者都有O(logn) 检索这两个班在哪里 不同之处在于内存使用和存储速度 插入和删除:

SortedList(TKey,TValue)使用更少 比SortedDictionary(TKey, TValue)

SortedDictionary(TKey,TValue)已 更快的插入和删除 未排序数据的操作,O(日志n) 相对于O(n)表示 分类列表(TKey,TValue)

如果列表一次全部填充 从排序数据中,选择SortedList(TKey, TValue)比 SortedDictionary(TKey,TValue)

没有所谓的“集合类的复杂性”。相反,这些集合上的不同操作具有不同的复杂性。例如,将元素添加到
字典

…接近O(1)操作。如果必须增加容量以容纳新元素,此方法将变为O(n)操作,其中
n
Count

而从
字典

…接近O(1)操作

总结了使用Java的各种集合类型的一些时间复杂性,尽管它们对于.NET应该完全相同

我已经从该页面中获取了表,并为.NET框架修改/扩展了它们。 另请参见和的MSDN页面,其中详细说明了各种操作所需的时间复杂性


搜索 搜索类型/集合类型复杂性注释 线性搜索数组/ArrayList/LinkedList O(N)未排序的数据。 二进制搜索排序数组/ArrayList/O(log N)需要排序数据。 搜索哈希表/字典O(1)使用哈希函数。 二进制搜索SortedDictionary/SortedKey O(log N)排序是自动的。 检索和插入 操作数组/数组列表链接列表分类字典分类列表 访问回O(1)O(1)O(日志N)O(日志N) 前出入口O(1)O(1)不适用不适用。 访问中间O(1)O(N)N.A.N.A。 在背面插入O(1)O(1)O(日志N)O(N) 在前面插入O(N)O(1)N.A.N.A。 插入中间O(N)O(1)N.A.N.A。 对于关联集合,删除的复杂性应与插入的复杂性相同

SortedList在插入和检索方面有几个显著的特点

插入(添加方法):

此方法是针对的O(n)操作 未排序的数据,其中n为计数。它是 如果新的 元素添加到 列表如果插入导致调整大小, 操作为O(n)

检索(项目属性):

正在检索此属性的值 是一个O(logn)操作,其中n是 计数设置属性是一个重要的任务 O(日志n)操作(如果密钥为 已在分类列表中)。如果钥匙不在 列表中,将属性设置为O(n) 未排序数据的操作,或O(日志 n) 如果新元素是在 名单的末尾。如果插入导致 调整大小,操作为O(n)

请注意,就所有操作的复杂性而言,
ArrayList
相当于
List


我一般不知道(刚才发布的另一个答案可能会告诉您确切的答案)-但是您可以使用ILSpy反映这一点和其他方法(使用FSharp代码有点笨拙,是真的),这最终会产生这个函数作为C#:

内部静态a最大元素(集合树s,a n)
{
while(true)
{
SetTree SetTree=s;
if(setTree是setTree.SetOne)
{
打破
}
if(setTree==null)
{
返回n;
}
SetTree.SetNode SetNode=(SetTree.SetNode)s;
SetTree arg_23_0=setNode.item3;
n=setNode.item1;
s=arg_23_0;
}
返回((SetTree.SetOne)s).item;
返回n;
}

好吧,用C术语来说,这不是完全“正确”的代码——但是
while(true)
循环的存在意味着它至少不能是O(1);至于它到底是什么。。。嗯,我的头太痛了,无法找到:)

文档说它是建立在二叉树上的,没有提到跟踪最大元素。如果文档是正确的,这意味着它应该是O(logn)。集合文档中曾经至少有一个错误(将阵列支持的数据结构称为二元搜索树),但这一错误已得到纠正。

本页简要介绍了大多数.NET集合的一些主要优缺点:


一类的复杂性,我会考虑圈复杂度而不是渐近时间/空间复杂度。我将后者归因于类中的操作。您可以编写一个程序来为您感兴趣的特定函数计时,并根据不同输入模式的N绘制结果。我认为没有记录时间复杂性的主要原因是这是一个实现细节,因此.NET团队保留将来更改实现细节的权利。因此,t的规范 Type of Search/Collection Types Complexity Comments Linear search Array/ArrayList/LinkedList O(N) Unsorted data. Binary search sorted Array/ArrayList/ O(log N) Requires sorted data. Search Hashtable/Dictionary<T> O(1) Uses hash function. Binary search SortedDictionary/SortedKey O(log N) Sorting is automated. Operation Array/ArrayList LinkedList SortedDictionary SortedList Access back O(1) O(1) O(log N) O(log N) Access front O(1) O(1) N.A. N.A. Access middle O(1) O(N) N.A. N.A. Insert at back O(1) O(1) O(log N) O(N) Insert at front O(N) O(1) N.A. N.A. Insert in middle O(N) O(1) N.A. N.A.
internal static a maximumElementAux<a>(SetTree<a> s, a n)
{
  while (true)
  {
    SetTree<a> setTree = s;
    if (setTree is SetTree<a>.SetOne)
    {
      break;
    }
    if (setTree == null)
    {
      return n;
    }
    SetTree<a>.SetNode setNode = (SetTree<a>.SetNode)s;
    SetTree<a> arg_23_0 = setNode.item3;
    n = setNode.item1;
    s = arg_23_0;
  }
  return ((SetTree<a>.SetOne)s).item;
  return n;
}