C#集合性能总结
一、引言
前面篇章我们讲解了很多的集合,如List<T>、Stack<T>、Queue<T>、HashSet<T>、SortedSet<T>、LinkedList<T>、Dictionary<Tkey,Tvalue>、SortedDictionary<Tkey,Tvalue>、SortedList<T>等
它们的结构和特点均不同,执行中的效率也有不同。本篇章着重讲解以上几种集合的效率。以便选择更高效的工具。
首先讲解一下几点衡量执行效率和时间的表述符:
1、O(1) //执行的时间和效率与数据项无关
例如ArrayList的函数Add();在不超过容量的情况下,无Add()函数的执行时间和前面的元素个数没关系。因为不需要重新分配内存。
2、O(log n) //执行的时间和效率与数据项多少成对数曲线关系
例如执行在集合中插入元素的时候就会使对数曲线的关系。
3、O(n) //执行的时间和效率与数据项多少成线性关系
如果ArrayList存储的元素超过了容量的话,再次添加就会超出,此时需要将原先的数组拷贝,然后重新分配容量更大的数组,最后将原先的数组复制到新数组中。此过程的耗时会随着数组元素的增加二增加,所以具有线性关系。
二、各种集合的效率对比
其中的n/a表示不支持这个方法。
集合 | Add | Insert | Remove | Item | Sort | Find |
---|---|---|---|---|---|---|
List<T> | 如果集合重置大小就是O1/On | On | On | O1 | On/Ologn,最坏的情况是On^2 | |
Stack<T> | Push()如果栈重置大小就是O1/On | n/a | Pop,O1 | n/a | n/a | n/a |
Queue<T> | Enqueue(),如果队列重置大小就是O1/On | n/a | Dequeue,O1 | n/a | n/a | n/a |
HashSet<T> | 如果集重置大小就是O1/On | Add,O1/On | O1 | n/a | n/a | n/a |
SortedSet<T> | 如果集重置大小就是O1/On | Add,O1/On | O1 | n/a | n/a | n/a |
LinkedList<T> | AddLast,O1 | AddAfter,O1 | O1 | n/a | n/a | On |
Dictionary<Tkey,Tvalue> | O1/On | n/a | O1 | O1 | n/a | n/a |
SortedDictionary<Tkey,Tvalue> | Ologn | n/a | Ologn | Ologn | n/a | n/a |
SortedList<T> | 无序数据为On,重置大小为On,到列表尾部Ologn | n/a | On | 读写是Ologn,如果健在列表中就是Ologn,如果不在就是On | n/a | n/a |