zoukankan      html  css  js  c++  java
  • Dictionary个人理解

    Dictionary原理个人总结:
    * 微软实现
    * 赋值:
    * 1.将Key用hash函数计算(类似MD5)
    * 2.将hash结果取余放入hash桶(听起来很高大上,就是放入不同数组,类似hash表)
    *
    * 取值:赋值过程差不多,取值时间复杂度基本为1。
    * 理解本质:取余计算后,直接取数组下标。如果下标多个值,再指向一个链表装数据。

    缺点:

    1.需要内存空间比较大。

    2.插入存在扩容。

    下面为和list对比测试结果:

    代码:

    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleApp1.DictionaryTest
    {
        /*Dictionary原理个人总结:
         * 微软实现
         * 赋值:
         * 1.将Key用hash函数计算(类似MD5)
         * 2.将hash结果求磨放入hash桶(听起来很高大上,就是放入不同数组)
         * 
         * 取值:赋值过程差不多,取值时间复杂度基本为1。
         * 其实本质感觉类似做到二分查找方式,取值方式不需要全部遍历,能减小很多次查找。
         *
         */
        public class DictonaryTest
        {
            List<string> list = new List<string>();
            Dictionary<string, int> dic = new Dictionary<string, int>();
            int dicValue;
    
            string listValue;
            int count = 10;
            string find = "9";
            public void Main1()
            {
                for (int i = 0; i < count; i++)
                {
                    list.Add(i.ToString());
                    dic.Add(i.ToString(), i);
                }
    
                DicFind();
                ListFind();
            }
    
            public void DicFind()
            {
                Stopwatch sw = new Stopwatch();
                sw.Start();
                dicValue = dic[find];
                sw.Stop();
                long times1 = sw.ElapsedTicks;
                Console.WriteLine("DicFind " + times1);
            }
    
            public void ListFind()
            {
                Stopwatch sw = new Stopwatch();
                sw.Start();
                listValue = list.First(x => x.Equals(find));
                sw.Stop();
                long times1 = sw.ElapsedTicks;
                Console.WriteLine("ListFind " + times1);
            }
        }
    }

    10个数据:

    1000个数据:

    100000个数据

     10000000个数据

     从测试结果总结:Dictionary随着数据量增大,计算次数是没有多大变化的。这就是数据结构做的好,比如二分查找和遍历查找的区别。

  • 相关阅读:
    loj #143. 质数判定
    Quadratic Residues POJ
    P2155 [SDOI2008]沙拉公主的困惑
    P3868 [TJOI2009]猜数字
    P3704 [SDOI2017]数字表格
    P4449 于神之怒加强版
    P2568 GCD
    P1891 疯狂LCM
    loj#6229 这是一道简单的数学题
    P3768 简单的数学题 杜教筛+推式子
  • 原文地址:https://www.cnblogs.com/zhuyapeng/p/13680882.html
Copyright © 2011-2022 走看看