C# 字典、集合、列表的时间复杂度


List列表是顺序线性表,Add操作是O(1)或O(N),因为List是动态扩容的,在未扩容之前,其Add操作是O(1),而在扩容的时候,Add操作是O(N)的。其Contains方法,是按照线性检索的,其复杂度是O(n)。

SortedList列表是有序线性表,Add操作是O(n), 其Contains方法是通过二分查找检索元素的,因此复杂度是O(lg n),其Containskey方法也是通过二分查找检索元素,复杂度也是O(lg n),ContainsValue方法是使用线性查找元素,复杂度是O(n)。

HashSet集合类是包含不重复项的无序hash表(非线性),它本身是一个一维数组,但是二维链表结构(扩展:一维数组的大小总是2的N次方)。Add操作是O(1)或是O(N)的,原因同List集合类。Contains方法是O(1)。

SortedSet集合类是基于红黑树实现的,其Add方法是O(lg n),Contains方法也是O(lg n)。

Dictionary字典类是hash表,Add操作是O(1)或是O(N)的,原理同上。其Containskey方法是O(1),原因是通过hash来查找元素而不是遍历元素。ContainsValue方法的时间复杂度是O(N),原因是内部通过遍历key来查找value,而不是通过hash来查找。Item[Key]属性根据key来检索value,其时间复杂度也是O(1)。

SortedDictionary字典类是基于平衡二叉树实现的,其Add方法是O(lg n),ContainsKey方法也是O(lg n),而ContainsValue方法则是O(n)。