zoukankan      html  css  js  c++  java
  • 容器使用笔记(扩展篇)

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

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

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

            再来谈谈二维表。HashTableDictionary<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

     





  • 相关阅读:
    激光打印机基于主机驱动程序、基于 PCL 驱动程序和 PostScript 驱动程序有何区别?
    转贴:打印机语言PostScript和PCL的比较
    编译器相关配置简介
    Graphics View的体系结构
    解决重装Qt后不能编译Examples的问题
    有符号数和无符号数的区别
    51单片机的外设
    AT89S52单片机P3口解惑
    双向端口设计
    AT89s52单片机的掉电测试
  • 原文地址:https://www.cnblogs.com/jhcelue/p/7228590.html
Copyright © 2011-2022 走看看