C#高级编程五十九天----集合的性能

各种集合的性能

许多集合类提供了相同的功能,例如,SortedList类与SortedDictionary类的功能几乎完全相同.但是,其性能常常有很大的区别.SortedList集合使用的内存少,SortedDictionary集合的元素检索速度快.

在MSDN文档中,集合的方法常常有性能提示,给出了以大O(字母)表示的操作时间:

O(1)

O(log n)

O(n)

O(1)表示无论集合中有多少数据项,这个操作需要的时间都不变.例如ArrayList类的Add()方法就具有O(1)行为.无论列表中有多少个元素,在列表末尾添加一个新元素的时间都相同.Count属性会给出元素个数,所以很容易找到列表末尾.

O(n)表示对于集合中的每个元素,需要增加的时间都相同.如果需要重新给集合分配内存,ArrayList类的Add()方法就是一个O(n)操作.改变容量,需要复制列表,赋值的时间随元素的增加而线性增加.

O(log n)表示操作需要的时间随集合中元素的增加而增加,但每个元素需要增加的时间不是线性的,而是呈对数曲线.在集合中执行插入操作时,SortedDictionary<TKey,TValue>集合类具有O(log n)行为,而SortedList<TKey,TValue>集合类具有O(n)行为.这里SortedDictionary<TKey,TValue>集合类要快得多,因为它在树形结构中插入元素的效率要比列表中高得多.

下表列出了集合类及其执行不同操作的性能,例如添加,插入和删除元素.使用这个表可以选择性能最佳的集合类.左列是集合类,Add列出了在集合中的添加元素所需要的时间.List<T>和HashSet<T>类把Add方法定义为集合中添加元素.其他几何类用不同的方法把元素添加到集合中.例如Stack<T>类定义了Push()方法,Queue<T>类定义了Enqueue()方法,这些信息也列在表中.

如果单元格中有多个大O值,表示若集合需要重置大小,该操作就需要一定的时间.例如,在List<T>类中,添加元素的时间为O(1).如果集合的容量不够大,需要重置大小,重置大小需要的时间长度就是O(n).集合越大,重置大小操作的时间就越长.最好避免重置集合的大小,而应把集合容量设置为一个可以包含所有元素的值.

如果单元格的内容是na(not applicatable),就表示这个操作不能应用与这种集合类型.


集合


Add


insert


Remove


Item


Sort


Find


List<T>


如果集合必须重置大小,就是O(1)或O(n)


O(n)


O(n)


O(1)


O(n log n),最坏的情况是O(n^2)


O(n)


stack<T>


Push(),如果栈必须重置大小,就是O(1)或O(n)


na


Pop(),O(1)


na


na


na


Queue<T>


Enqueue(),如果集合必须重置大小,就是O(1)或O(n)


na


Dequeue(),O(1)


na


na


na


HashSet<T>


如果集合必须重置大小,就是O(1)或O(n)


Add(),O(1)或O(n)


O(1)


na


na


na


LinkedList<T>


AddLast(),O(1)


AddAfter()

O(1)


O(1)


na


na


O(n)


Dictionary<TKey,TValue>


O(1)或O(n)


na


O(1)


O(1)


na


na


SortedDictionary<TKey,TValue>


O(log n)


na


O(log n)


O(log n)


na


na


SortedList<TKey,TValue>


无序数据为O(n);如果必须重置大小就是O(n);到列表的尾部就是O(log n)


na


O(n)


读写是O(log n);如果键在列表中,就是O(log n);如果键不在列表中,就是O(n)


na


na

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-25 11:50:45

C#高级编程五十九天----集合的性能的相关文章

C#高级编程五十六天----可观察的集合ObservableCollection

可观察的集合 如果需要集合中的元素核实删除或添加的信息,就可以使用ObservableCollection<T>类. ObservableCollection<T>类表示一个动态数据集合,在添加项,移除项或刷新整个列表时,刺激和将提供通知. 命名空间:System.Collections.ObjectModle 语法:public class ObservableCollection<T>:Collection<T>,INotifyCollectionCha

C#高级编程五十四天----Lookup类和有序字典

Lookup类 Dictionary<Tkey,TValue>只为每个键支持一个值.新类Lookup<Tkey,TValue>是.NET3.5中新增的,它类似与Dictionary<Tkey,TElement>,但把键映射带一个值集上.这个类在程序及System.Core中实现,用System,Linq命名空间定义. Lookup<Tkey,TElement>的方法和属性如下表: 属性名或者方法名 说明 Count 属性Count返回集合中的元素个数 Ite

C#高级编程五十八天----并行集合

并行集合 对于并行任务,与其相关紧密的就是对一些共享资源,数据结构的并行訪问.常常要做的就是对一些队列进行加锁-解锁,然后运行类似插入,删除等等相互排斥操作. .NET4提供了一些封装好的支持并行操作数据容器,能够降低并行编程的复杂程度. 并行集合的命名空间:System.Collections.Concurrent 并行容器: ConcurrentQueue ConcurrentStack ConcurrentBag: 一个无序的数据结构集,当不考虑顺序时很实用. BlockingCollec

C#高级编程六十九天----DLR简介

DLR 一.近年来,在TIOBE公司每个月发布的编程语言排行榜中,C#总是能挤进前十名,而在最近十年来,C#总体上呈现上升的趋势.C#能取得这样的成绩,有很多因素,其中它在语言特性上的锐意进取让人印象深刻. C#4动态功能是Dynamic Language Runtime(动态语言运行时,DLR)的一部分.DLR是添加到CLR的一系列服务,它允许添加动态语言,如Ruby和Python,并使C#具备和这些动态语言相同的某些功能. 动态编程语言并非什么新鲜事物,早在面向对象编程语言成为主流之前,人们

C#高级编程五十五天----HashSet和SortedSet

集 饱含不重复元素的集合称为"集(set)". .NET4包含两个集(HashSet<T>和SortedSet<T>),他们都实现ISet<T>接口.HashSet<T>即包含不重复元素的无序列表,SortedSet<T>集包含不重复元素的有序列表. ISet<T>接口提供的方法可以创建合集,交集,或者给出一个集合时另一个集的超集或子集的信息. 案例: //使用HashSet:重复的元素自动被移除,但是不排序 va

C#高级编程四十九天----队列

队列 1.Queue定义 System.Collections.Queue类表示对象的先进先出集合,存储在Queue(队列)中的对象在一端插入,从还有一端移除. 2.长处 (1).能对集合进行顺序处理(先进先出) (2)能接受null值,而且同意反复的元素 3.Queue的构造器 构造器函数 凝视 Queue() 初始化Queue类的新实例,该实例为空,具有默认初始容量(32)并使用默认增长因子(2.0) Queue(ICollection) 初始化Queue类的新实例,该实例包括从指定集合复制

C#高级编程三十五天----foreach和yield

枚举 在foreach语句中使用枚举,可以迭代集合中的元素,且无需知道集合中的元素个数. 数组或集合实现带GetEumerator()方法的IEumerable接口.GetEumerator()方法返回一个实现IEunmerable接口的枚举. GetEnumerator()方法用IEnumerable接口定义.foreach语句并不真的需要在集合类中实现这个借口.有一个名为GetEnumerator()的方法,他返回实现了IEnumerator接口的对象就足够了. IEnumerator接口

【读书笔记】C#高级编程 第二十五章 事务处理

(一)简介 事务的主要特征是,任务要么全部完成,要么都不完成. (二)概述 事务由事务管理器来管理和协调.每个影响事务结果的资源都由一个资源管理器来管理.事务管理器与资源管理器通信,以定义事务的结果. 1.事务处理阶段 激活阶段:在这个阶段创建事务. 准备阶段:在这个阶段,每个资源管理器都可以定义事务的结果. 提交阶段:当所有的资源管理器都成功准备好了,就开始这个阶段. 2.ACID属性 事务的特征可以用术语ACID来定义: Atomicity(原子性):表示一个工作单元. Consistenc

C#高级编程 第十五章 反射

(二)自定义特性 使自定义特性非常强大的因素时使用反射,代码可以读取这些元数据,使用它们在运行期间作出决策. 1.编写自定义特性 定义一个FieldName特性: [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)] public class FieldNameAttribute : Attribute { private string name; public FieldNam