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等检索方法,后续可能会补充上删除等操作的复杂度。

参考:

真是O(1)吗?想清楚了没?

C# SortedDictionary以及SortedList的浅谈

你真的了解字典(Dictionary)吗?

浅谈C#常用集合类的实现以及基本操作复杂度的更多相关文章

  1. C#常用集合类的实现以及基本操作复杂度

    List 集合类是顺序线性表,Add操作是O(1)或是O(n)的,由于List的容量是动态扩容的,在未扩容之前,其Add操作是O(1),而在需要扩容的时候,会拷贝已存在的那些元素同时添加新的元素,此时 ...

  2. 浅谈传感器常用Delta-SigmaADC

    过采样ADC,或噪声整形ADC,也叫Delta-Sigma ADC.名字很多,基本上都由求差电路,积分求和电路组成调制器,后续由数字滤波器获得Nbit数字输出.不管怎样,数学上的除法能够让你理解这类A ...

  3. 浅谈前端常用脚手架cli工具及案例

    前端常用脚手架工具 前端有很多特定的脚手架工具大多都是为了特定的项目类型服务的,比如react项目中的reate-react-app,vue项目中的vue-cli,angular 项目中的angula ...

  4. 浅谈css常用伪类用法

    着重写一下after和before的用法: css样式搞定:标签元素+伪类after a.'class名':after{//我的样式名称是这个,可以写成你自己的样式名称 content: '已打包'; ...

  5. 浅谈Python常用英文单词

    一.交互式环境与print输出 1.print:打印/输出2.coding:编码3.syntax:语法4.error:错误5.invalid:无效6.identifier:名称/标识符7.charac ...

  6. 浅谈c语言的线性表的基本操作———基于严蔚敏的数据结构(c语言版)

    主要讲的是线性表的创建,插入及删除: 0. 线性表的建立,对于这类操作主要是利用了结构体的性质,对于定义的线性表的特性主要有三点:首先 Typedef struct { ElemType   *ele ...

  7. C++ STL中的常用容器浅谈

    STL是C/C++开发中一个非常重要的模板,而其中定义的各种容器也是非常方便我们大家使用.下面,我们就浅谈某些常用的容器.这里我们不涉及容器的基本操作之类,只是要讨论一下各个容器其各自的特点.STL中 ...

  8. 【转】浅谈常用的几种web攻击方式

    浅谈常用的几种web攻击方式 一.Dos攻击(Denial of Service attack) 是一种针对服务器的能够让服务器呈现静止状态的攻击方式.有时候也加服务停止攻击或拒绝服务攻击.其原理就是 ...

  9. $.ajax()方法详解 ajax之async属性 【原创】详细案例解剖——浅谈Redis缓存的常用5种方式(String,Hash,List,set,SetSorted )

    $.ajax()方法详解   jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为Str ...

随机推荐

  1. jvm 字节码执行 (二)动态类型支持与基于栈的字节码解释执行

    动态类型语言 动态类型语言的关键特征是它的类型检查的主体过程是在运行期而不是编译期. 举例子解释“类型检查”,例如代码: obj.println("hello world"); 假 ...

  2. 自定义shiro实现权限验证方法isAccessAllowed

    由于Shiro filterChainDefinitions中 roles默认是and, admin= user,roles[system,general] 比如:roles[system,gener ...

  3. idea中如何添加RunDashboard

    在微服务开发中,往往要同时启动多个服务,这时候使用Run控制台难免会出错,并且不方便管理,这里推荐一个功能Run Dashboard idea中打开Run Dashboard的方法如下 view &g ...

  4. 字符串join函数跟+号测试

    字符串join函数for循环+区别: 原因是这样的,字符串是不可变对象,当用操作符+连接字符串的时候,每执行一次+都会申请一块新的内存,然后复制上一个+操作的结果和本次操作的右操作符到这块内存空间,因 ...

  5. HTML 重定向 页面跳转

    通过响应头重定向 响应状态 301 和 302 可以指定重定向URL, 推荐使用302 FOUND HttpServletResponse. static final int SC_MOVED_TEM ...

  6. mysql 设置skip_name_resolve参数 日志 [Warning] 'user' entry 'root@localhost' ignored in --skip-name-resolve mode

    [环境介绍]  系统环境:Red Hat Enterprise Linux 7 + 5.7.25-enterprise-commercial-advanced-log MySQL Enterprise ...

  7. 原生JS实现banner图的滚动与跳转

    HTML部分: <div id="banner"> <!--4张滚动的图片--> <div id="inside"> < ...

  8. CSS white-space属性详解

    概述 CSS的white-space属性用于指定如何处理容器中的空白字符,例如:空格( ).换行(\n).缩进(\t)等. white-space出自CSS1,适用于块状元素,具有继承性,支持IE 5 ...

  9. 上传代码到github

    上传代码前需配置连接秘钥和设置本地git账号密码. 1.检查上传文件目录状态 git status 2.将更改文件添加到缓存区 git add . 3.添加本次代码更改说明 git commit -m ...

  10. 转载-IDEA项目左边栏只能看到文件看不到项目结构

    原文-https://blog.csdn.net/weixin_42362985/article/details/80538064 有时IDEA Maven项目打开左侧Project窗口本应该显示项目 ...