容器使用笔记(扩展篇)

前两篇文章分别介绍了几种容器,他们之间的区别与联系也做了简单的介绍,这篇文章主要在存储机制和工作效率上来扩展一下。

我们从数据的角度将它们分为两类一维集合和二维集合(这里不讨论数组),一维集合主要包括ArrayList、List,二维集合主要包括HashTable、Dictionary<K,v>,其它类型(使用较少)不做讨论。

首先说一维集合,来源于数组,他们在内存中的存储机制也是来源于数组,以顺序存储的方式存放在内存中,以下标为索引查找数据,效率较高。

再来谈谈二维表,HashTable和Dictionary<K,V>,俗称字典都是键值对的集合,可以说Dictionary<K,V>其实就是哈希表的泛型版本。字典与一维集合的区别就是字典通过key来查找value,他的算法复杂度为O(1),而一维数组通过下标索引查找value,算法复杂度也为O(1),因而他们的存储机制完全不同。

我们先来看一下Dictionary<K,V>,和HashTable的差异。看以下两段代码:

    class Program
    {
        static void Main(string[] args)
        {
            Dictionary<int, string> dicTest1 = new Dictionary<int, string>();
            dicTest1.Add(1, "a");
            dicTest1.Add(2, "b");
            dicTest1.Add(3, "c");
            foreach (var item in dicTest1)
            {
                Console.WriteLine("Dictionary输出顺序 key: " + item.Key );
            }

            Hashtable tableTest = new Hashtable();
            tableTest.Add(1, "a");
            tableTest.Add(2, "b");
            tableTest.Add(3, "c");

            foreach (var item in tableTest.Keys)
            {
                Console.WriteLine("HashTable输出顺序 key:" + item.ToString());
            }
            Console.ReadKey();
        }
    }

可以看的出来,字典在输出是完全是按照数据插入的顺序输出的,而哈希表会在插入数据时打乱其存储顺序。

再来看看二维集合的存储机制,在存储二维集合时,计算机会根据二维集合的key通过哈希算法计算出一个虚拟地址,然后将数据存储在相应位置。查找数据时也一样,需要根据key通过哈希算法找到对应的虚拟地址,然后获得数据。

它们的效率有多大的差距呢?下图是一个高手写的程序的运行结果:

他们在遍历整个集合时效率的差距是很大的。所以,顺序表存储结构在遍历查询数据时,有很大优势。

下图是几种字典在存储结构和性能上的差异总结:


Type


内部结构


支持索引


内存占用


随机插入的速度(毫秒)


顺序插入的速度(毫秒)


根据键获取元素的速度(毫秒)


未排序字典


Dictionary<T,V>


哈希表



22


30


30


20


Hashtable


哈希表



38


50


50


30


ListDictionary


链表



36


50000


50000


50000


OrderedDictionary


哈希表

+数组



59


70


70


40


排序字典


SortedDictionary<K,V>


红黑树



20


130


100


120


SortedList<K,V>


2xArray



20


3300


30


40


SortList


2xArray



27


4500


100


180

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

时间: 2024-08-25 00:51:03

容器使用笔记(扩展篇)的相关文章

Vue学习笔记入门篇——组件的使用

本文为转载,原文:Vue学习笔记入门篇--组件的使用 组件定义 组件 (Component) 是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素,Vue.js 的编译器为它添加特殊功能.在有些情况下,组件也可以是原生 HTML 元素的形式,以 is 特性扩展. 组件使用 注册 注册一个全局组件,你可以使用 Vue.component(tagName, options).组件在注册之后,便可以在父实例的模块中以自定义元素 的形式使用.

《javascript权威指南》读书笔记——第一篇

<javascript权威指南>读书笔记--第一篇 金刚 javascript js javascript权威指南 由于最近想系统学习下javascript,所以开始在kindle上看这本书来补充下. 今天是今年的196天,由于我之前承诺过,每天分享读书笔记,只是之前分享的是大众读物,所以随手分享到kindle阅读群里了.但是现在读的是技术类书籍,分享到kindle读书群不太合适,所以还是以博客的形式分享.这样子,一个链接,大家感兴趣了就点开看看,不感兴趣了,就不点开. 其实这篇文章应该是昨天

渗透学习笔记--基础篇--sql注入(字符型)

环境:dvwa1.7数据库:mysql前置知识:sql语句(Click me)      在进行sql注入前,我们先熟悉熟悉select语句.一.打开我们的sql终端 二.进入之后可以看到有mysql>我们输入sql语句,即可返回我们想要的结果,注意分号哟!我们使用的dvwa,在我们前几章设置的时候,会在数据库中生成一个dvwa的database:这里我们使用它来进行我们的select 语句:(1)使用dvwa数据库use dvwa;(2)在users表里查询用户名为'admin'的所有信息se

java学习笔记 第二篇 核心技术(二)

第十四章 集合类 集合类用来存放对象的引用.继承关系如下图: 14.1 Collection 接口 是层次结构中的根接口,构成Collection的单位称为元素.Collection接口不能直接使用,但该接口提供了添加元素.删除元素.管理数据的方法. Collection接口常用方法: 14.2 List 集合 包括List接口以及List集合的所有实现类.List集合中的元素允许重复,各元素循序就是对象插入的顺序 1.List接口,两个重要方法: get(int index): 获取指定索引位

Vue学习笔记入门篇——组件的内容分发(slot)

本文为转载,原文:Vue学习笔记入门篇--组件的内容分发(slot) 介绍 为了让组件可以组合,我们需要一种方式来混合父组件的内容与子组件自己的模板.这个过程被称为 内容分发 (或 "transclusion" 如果你熟悉 Angular).Vue.js 实现了一个内容分发 API,使用特殊的 'slot' 元素作为原始内容的插槽. 编译作用域 在深入内容分发 API 之前,我们先明确内容在哪个作用域里编译.假定模板为: <child-component> {{ messa

Vue学习笔记入门篇——组件的通讯

本文为转载,原文:Vue学习笔记入门篇--组件的通讯 组件意味着协同工作,通常父子组件会是这样的关系:组件 A 在它的模版中使用了组件 B.它们之间必然需要相互通信:父组件要给子组件传递数据,子组件需要将它内部发生的事情告知给父组件.然而,在一个良好定义的接口中尽可能将父子组件解耦是很重要的.这保证了每个组件可以在相对隔离的环境中书写和理解,也大幅提高了组件的可维护性和可重用性.在 Vue 中,父子组件的关系可以总结为 props down, events up.父组件通过 props 向下传递

《javascript权威指南》读书笔记——第二篇

<javascript权威指南>读书笔记--第二篇 金刚 javascript js javascript权威指南 今天是今年的196天,分享今天的读书笔记. 第2章 词法结构 2.1 字符集 JavaScript程序是用Unicode字符集编写. Unicode是ASCII和Latin-1的超集,支持几乎所有语言. ES3 要求支持Unicode 2.1及后续版本 ES5 要求支持Unicode 3及后续版本 2.1.1 区分大小写 JavaScript是区分大小写的. HTML 并不区分大

SystemTap 学习笔记 - 安装篇

https://segmentfault.com/a/1190000000671438 在安装前,需要知道下自己的系统环境,我的环境如下: uname -r 2.6.18-308.el5 Linux 2.6.18-308.el5 #1 SMP Tue Feb 21 20:06:06 EST 2012 x86_64 x86_64 x86_64 GNU/Linux 安装 为了部署 SystemTap,需要安装以下两个 RPM 包: systemtap systemtap-runtime 以 root

lwIP移植笔记 - ethernet篇

我们已经完成了lwIP的系统移植,那么我们就需要进行ethernet的移植工作. ethernet的移植工作,主要是"填空"ethernetif.c的过程!(PS. 再一次感谢Adam Dunkels大侠的无私工作!以及对他的敬意!) ethernetif.c位置(../src/netif) 一.移植硬件 1. 初始化 实现函数:static    void    low_level_init(struct    netif    *netif); (1) 初始化MAC地址 (2) 初

Vue学习笔记进阶篇——Render函数

本文为转载,原文:Vue学习笔记进阶篇--Render函数 基础 Vue 推荐在绝大多数情况下使用 template 来创建你的 HTML.然而在一些场景中,你真的需要 JavaScript 的完全编程的能力,这就是 render 函数,它比 template 更接近编译器. <h1> <a name="hello-world" href="#hello-world"> Hello world! </a> </h1>