各种集合的性能

许多集合类提供了相同的功能,例如,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

C#编程(五十九)----------集合的性能的更多相关文章

  1. 第三百五十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)介绍以及安装

    第三百五十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)介绍以及安装 elasticsearch(搜索引擎)介绍 ElasticSearch是一个基于 ...

  2. “全栈2019”Java第五十九章:抽象类与抽象方法详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  3. 学习ASP.NET Core Razor 编程系列十九——分页

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  4. SpringBoot进阶教程(五十九)整合Codis

    上一篇博文<详解Codis安装与部署>中,详细介绍了codis的安装与部署,这篇文章主要介绍介绍springboot整合codis.如果之前看过<SpringBoot进阶教程(五十二 ...

  5. JAVA学习第五十九课 — 网络编程概述

    网络模型 OSI(Open System Interconnection)开放系统互连:參考模型 TCP/IP 网络通讯要素 IP地址 port号 传输协议 网络參考模型 七层OSI模型的基本概念要了 ...

  6. java并发编程(十九)----(JUC集合)总体框架介绍

    本节我们将继续学习JUC包中的集合类,我们知道jdk中本身自带了一套非线程安全的集合类,我们先温习一下java集合包里面的集合类,然后系统的看一下JUC包里面的集合类到底有什么不同. java集合类 ...

  7. 五十九、linux 编程—— I/O 多路复用 fcntl

    59.1 介绍 前面介绍的函数如,recv.send.read 和 write 等函数都是阻塞性函数,若资源没有准备好,则调用该函数的进程将进入阻塞状态.我们可以使用 I/O 多路复用来解决此问题(即 ...

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

    Lookup类 Dictionary<Tkey,TValue>仅仅为每一个键支持一个值.新类Lookup<Tkey,TValue>是.NET3.5中新增的,它类似与Dictio ...

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

    并行集合 对于并行任务,与其相关紧密的就是对一些共享资源,数据结构的并行訪问.常常要做的就是对一些队列进行加锁-解锁,然后运行类似插入,删除等等相互排斥操作. .NET4提供了一些封装好的支持并行操作 ...

随机推荐

  1. Qt 数字和字符处理总结

    1. 四舍五入保留小数几位 QString str="12.3456789"; double d1=str.toDouble(); qDebug()<<"d1 ...

  2. docker 构建带健康检查的redis镜像

    =============================================== 2018/11/5_第1次修改                       ccb_warlock == ...

  3. Laravel中使用自己的类库三种方式

    虽然Composer使得我们可以重用很多现有的类库(例如packagist.org中的),但是我们仍然可能用到一些不兼容composer的包或者类库.另外在某一项目中,我们也可能会创建某一类库,而且可 ...

  4. 解决MySQL忘记root密码

    网上有很多关于忘记MySQL root密码的一些文章,里面都有写怎么去解决,但有时觉得写得太恶心,要么一字不漏的抄别人的,要么就说得不清不楚,好了,不吐槽了,以下是解决的整个过程. 首先我们要知道忘记 ...

  5. Smashing The Browser:From Vulnerability Discovery To Exploit学习记录

    浏览器Fuzz技术 漏洞挖掘 白盒挖掘 代码审计 自动化代码分析 黑盒挖掘 Fuzzing 两种Fuzzing技术 静态Fuzzing 基于变异的 文件.文档 多媒体 bf3 基于生成的 浏览器 重点 ...

  6. SqlServerDBCC SHRINKFILE不起作用

    检查索引碎片的结果: CREATE DATABASE test_shrink USE test_shrink CREATE TABLE show_extent(a INT,b NVARCHAR(390 ...

  7. hdu 5428 质因子

    问题描述有一个数列,FancyCoder沉迷于研究这个数列的乘积相关问题,但是它们的乘积往往非常大.幸运的是,FancyCoder只需要找到这个巨大乘积的最小的满足如下规则的因子:这个因子包含大于两个 ...

  8. MVC底层原理

    窥探ASP.Net MVC底层原理 实现跨越Session的分布式TempData 1.问题的引出 我相信大家在项目中都使用过TempData,TempData是一个字典集合,一般用于两个请求之间临时 ...

  9. PHP字符串指定位置插入字符串

    1.substr_replace(string,replacement,start,length);需插入时设置length为0即可 string 必需.规定要检查的字符串. replacement ...

  10. 015 jquery中包裹节点

    1.介绍 2.程序 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> < ...