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随着数据量增大,计算次数是没有多大变化的。这就是数据结构做的好,比如二分查找和遍历查找的区别。

原文地址:https://www.cnblogs.com/zhuyapeng/p/13680882.html