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 |
C#编程(五十九)----------集合的性能的更多相关文章
- 第三百五十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)介绍以及安装
第三百五十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)介绍以及安装 elasticsearch(搜索引擎)介绍 ElasticSearch是一个基于 ...
- “全栈2019”Java第五十九章:抽象类与抽象方法详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- 学习ASP.NET Core Razor 编程系列十九——分页
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- SpringBoot进阶教程(五十九)整合Codis
上一篇博文<详解Codis安装与部署>中,详细介绍了codis的安装与部署,这篇文章主要介绍介绍springboot整合codis.如果之前看过<SpringBoot进阶教程(五十二 ...
- JAVA学习第五十九课 — 网络编程概述
网络模型 OSI(Open System Interconnection)开放系统互连:參考模型 TCP/IP 网络通讯要素 IP地址 port号 传输协议 网络參考模型 七层OSI模型的基本概念要了 ...
- java并发编程(十九)----(JUC集合)总体框架介绍
本节我们将继续学习JUC包中的集合类,我们知道jdk中本身自带了一套非线程安全的集合类,我们先温习一下java集合包里面的集合类,然后系统的看一下JUC包里面的集合类到底有什么不同. java集合类 ...
- 五十九、linux 编程—— I/O 多路复用 fcntl
59.1 介绍 前面介绍的函数如,recv.send.read 和 write 等函数都是阻塞性函数,若资源没有准备好,则调用该函数的进程将进入阻塞状态.我们可以使用 I/O 多路复用来解决此问题(即 ...
- C#高级编程五十四天----Lookup类和有序字典
Lookup类 Dictionary<Tkey,TValue>仅仅为每一个键支持一个值.新类Lookup<Tkey,TValue>是.NET3.5中新增的,它类似与Dictio ...
- C#高级编程五十八天----并行集合
并行集合 对于并行任务,与其相关紧密的就是对一些共享资源,数据结构的并行訪问.常常要做的就是对一些队列进行加锁-解锁,然后运行类似插入,删除等等相互排斥操作. .NET4提供了一些封装好的支持并行操作 ...
随机推荐
- Python实现 -- 冒泡排序、选择排序、插入排序
冒泡排序 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法. 冒泡排序的原理: 比较两个相邻的元素,如果第一个比第二个大,就交换他们 对每一对相邻的元素做同样的工作,从开始第 ...
- poj2056
寻找向左凸的地方,每个左凸能让S数量-2.上边或下边如果是半个左凸的话则各对应-1 #include <cstdio> #include <cstring> #include ...
- wpf 千位符 格式化字符串
StringFormat={}{0:N2}}//格式话字符串,增加千位符,2保留小数点后2位 StringFormat={}{0:N0}}//格式话字符串,增加千位符,无小数点后
- javaScript对金额处理的方式
例如 var price = $("#price").val(); 此时price 为字符串格式 假使我们想将其乘以100 可以选择 price*100将其转换为数值格式 但是有些 ...
- linux pwd指令C实现
linux pwd指令C实现 研究实现pwd所需的系统调用 我们可以通过man命令和grep命令来获取我们所需要的系统调用函数信息 man chdir Linux pwd命令用于显示工作目录. 执行p ...
- Python3.6安装OpenCV
1.安装依赖 pip install --upgrade setuptools pip install numpy Matplotlib -i https://mirrors.aliyun.com/p ...
- PAT 1066. Root of AVL Tree (25)
An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child sub ...
- pymysql模块 执行sql封装
封装pymysql模块执行sql class HandCost(object): """ 处理数据库中的数据 """ def __init_ ...
- web理论知识--HTML结构及标签
一.参考书籍: <Web 前端开发 HTML5+CSS3+jQuery+AJAX 从学到用完美实践> 备注:本书为工具书. 二.HTML5元素: 按功能划分:基础.格式.表单.框架.图像. ...
- 服务器IO瓶颈对MySQL性能的影响
[背景] 之前我们碰到一些MySQL的性能问题,比如服务器日志备份时可能会导致慢查询增多,一句简单的select或insert语句可能执行几秒,IO负载较高的服务器更容易出现并发线程数升高,CPU上升 ...