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