浅谈C#常用集合类的实现以及基本操作复杂度
List 集合类是顺序线性表,Add操作是O(1)或是O(n)的,由于List的容量是动态扩容的,在未扩容之前,其Add操作是O(1),而在需要扩容的时候,会拷贝已存在的那些元素同时添加新的元素,此时的Add操作是O(n)的。而对于Contains方法,其是按照线性检索的,其复杂度是O(n)。而BinarySearch方法,其是按二分查找的,其复杂度是O(lg n)。
SortedList集合类是有序线性表,Add操作是O(n), 其Contains方法是通过二分查找检索元素的,因此复杂度是O(lg n),其Containskey方法也是通过二分查找检索元素,复杂度也是O(lg n),ContainsValue方法是使用线性查找元素,复杂度是O(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)。
HashSet集合类是包含不重复项的无序hash表(非线性表)。Add操作是O(1)或是O(n)的,原因同List集合类。Contains方法是O(1)。HashSet是Set集合,它只实现了ICollection接口,在单独元素访问上,有很大的限制: 1、跟List相比,不能使用下标来访问元素,如:list[1] 。 2、跟Dictionary相比,不能通过键值来访问元素,例如:dic[key],因为HashSet每条数据只保存一项,并不采用Key-Value的方式,换句话说,HashSet中的Key就是Value,假如已经知道了Key,也没必要再查询去获取Value,需要做的只是检查值是否已存在。
SortedSet集合类是基于红黑树实现的,其Add方法是O(lg n),Contains方法也是O(lg n)
目前只涉及到Add以及Contains等检索方法,后续可能会补充上删除等操作的复杂度。
参考:
C# SortedDictionary以及SortedList的浅谈
浅谈C#常用集合类的实现以及基本操作复杂度的更多相关文章
- C#常用集合类的实现以及基本操作复杂度
List 集合类是顺序线性表,Add操作是O(1)或是O(n)的,由于List的容量是动态扩容的,在未扩容之前,其Add操作是O(1),而在需要扩容的时候,会拷贝已存在的那些元素同时添加新的元素,此时 ...
- 浅谈传感器常用Delta-SigmaADC
过采样ADC,或噪声整形ADC,也叫Delta-Sigma ADC.名字很多,基本上都由求差电路,积分求和电路组成调制器,后续由数字滤波器获得Nbit数字输出.不管怎样,数学上的除法能够让你理解这类A ...
- 浅谈前端常用脚手架cli工具及案例
前端常用脚手架工具 前端有很多特定的脚手架工具大多都是为了特定的项目类型服务的,比如react项目中的reate-react-app,vue项目中的vue-cli,angular 项目中的angula ...
- 浅谈css常用伪类用法
着重写一下after和before的用法: css样式搞定:标签元素+伪类after a.'class名':after{//我的样式名称是这个,可以写成你自己的样式名称 content: '已打包'; ...
- 浅谈Python常用英文单词
一.交互式环境与print输出 1.print:打印/输出2.coding:编码3.syntax:语法4.error:错误5.invalid:无效6.identifier:名称/标识符7.charac ...
- 浅谈c语言的线性表的基本操作———基于严蔚敏的数据结构(c语言版)
主要讲的是线性表的创建,插入及删除: 0. 线性表的建立,对于这类操作主要是利用了结构体的性质,对于定义的线性表的特性主要有三点:首先 Typedef struct { ElemType *ele ...
- C++ STL中的常用容器浅谈
STL是C/C++开发中一个非常重要的模板,而其中定义的各种容器也是非常方便我们大家使用.下面,我们就浅谈某些常用的容器.这里我们不涉及容器的基本操作之类,只是要讨论一下各个容器其各自的特点.STL中 ...
- 【转】浅谈常用的几种web攻击方式
浅谈常用的几种web攻击方式 一.Dos攻击(Denial of Service attack) 是一种针对服务器的能够让服务器呈现静止状态的攻击方式.有时候也加服务停止攻击或拒绝服务攻击.其原理就是 ...
- $.ajax()方法详解 ajax之async属性 【原创】详细案例解剖——浅谈Redis缓存的常用5种方式(String,Hash,List,set,SetSorted )
$.ajax()方法详解 jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为Str ...
随机推荐
- 用户认证授权和Shiro入门
1.权限管理基础(认证和授权): 前言 本文主要讲解的知识点有以下: 权限管理的基础知识 模型 粗粒度和细粒度的概念 回顾URL拦截的实现 Shiro的介绍与简单入门 一.Shiro基础知识 在学习S ...
- linxu上安装mongodb3.6实战
根据linux 版本到官网下载对应mongodb版本 查看服务器版本:cat /proc/version 查看linux发行版本:cat /etc/redhat-release 我用的阿里云服务器,对 ...
- windows 双网卡同时上专网(内网)和外网
本操作是用网线做专网(内网),无线网卡用于外网 1. 记录有线网卡的网络的网关,例如10.103.14.1 2. 有线网卡必须是手动指定的ip地址,把网关清掉,例如 3. 删除0.0.0.0 路由 r ...
- JAVA进阶18
间歇性混吃等死,持续性踌躇满志系列-------------第18天 1.飞机游戏小项目 ①创建窗口 package cn.xfj.game; import javax.swing.*; import ...
- L2-013 红色警报 (25 分) (并查集)
链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805063963230208 题目: 战争中保持各个城市间的连通性非 ...
- Mysql 时间差(年、月、天、时、分、秒)
SELECT TIME_TO_SEC(TIMEDIFF('2018-09-30 19:38:45', '2018-08-23 10:13:01')) AS DIFF_SECOND1, -- 秒 UNI ...
- python学习第34天
# 互斥锁# 进程之间的数据共享 # 关于数据安全的问题# 进程池(自己了解,后面线程部分还会讲) # from multiprocessing import Pool# 线程的概念 (面试的重点)# ...
- 【Ubuntu 18.04 搭建VNC服务器】
https://www.jianshu.com/p/f58fe5cdeb5f 桌面共享 Ubuntu 18.04自带桌面共享,可以将物理桌面共享给VNC.但是无法创建新的桌面. 具体参考 https: ...
- C# EntityFramework Code First 迁移
如果使用的是 Code First 工作流,推荐使用 Code First 迁移改进应用程序的数据库架构. 迁移提供一组允许以下操作的工具: 创建可用于 EF 模型的初始数据库 生成迁移以跟踪对 EF ...
- IE8引用jQuery报$或者jQuery未定义
最近公司做的项目要求兼容到IE8,结果在页面调试的时候出了个bug,在IE8上面一直报错$未定义,或者jQuery未定义,导致页面上面写的jQuery全部失效,在Chrome浏览器没有任何问题.很是头 ...