• c# 哈希表


    最近翻开一下c#的基础书,发现c#的哈希表我重来没用过。

    理解一番,觉得和dictionary有点相像,都是键值对(key-value)的形式。

    网上查询了一番,下面说说简单介绍下哈希表Hashtable 。

    哈希表(hashtable)和字典表(dictionary)效率对比:

    Hashtable hashtable = new Hashtable();
    Dictionary<string, int> dictionary = new Dictionary<string, int>();
    int countNum = 1000000;
    DateTime startTime;
    DateTime endTime;
    startTime = DateTime.Now;
    for (int i = 0; i < countNum; i++)
    {
    hashtable.Add(i.ToString(), i);
    }
    endTime = DateTime.Now;
    Console.WriteLine("给哈希表赋值:" + (endTime - startTime).Milliseconds); //输出: 796

    startTime = DateTime.Now;
    for (int i = 0; i < countNum; i++)
    {
    dictionary.Add(i.ToString(), i);
    }
    endTime = DateTime.Now;
    Console.WriteLine("字典类型赋值:" + (endTime - startTime).Milliseconds); //输出: 448

    startTime = DateTime.Now;
    for (int i = 0; i < countNum; i++)
    {
    hashtable.ContainsKey(i.ToString());
    }
    endTime = DateTime.Now;
    Console.WriteLine("输出哈希表值:" + (endTime - startTime).Milliseconds); //输出: 268

    startTime = DateTime.Now;
    for (int i = 0; i < countNum; i++)
    {
    dictionary.ContainsKey(i.ToString());
    }
    endTime = DateTime.Now;
    Console.WriteLine("输出字典类型值:" + (endTime - startTime).Milliseconds); //输出: 183

    结论:添加数据时,dictionary快,频繁调用数据时Dictionary快。Dictionary<K,V>是泛型的,当K或V是值类型时,其速度远远超过Hashtable。

    由于 Hashtable 和 Dictionary 同时存在, 在使用场景上必然存在选择性, 并不任何时刻都能相互替代.
    [1] 单线程程序中推荐使用 Dictionary, 有泛型优势, 且读取速度较快, 容量利用更充分.
    [2] 多线程程序中推荐使用 Hashtable, 默认的 Hashtable 允许单线程写入, 多线程读取, 对 Hashtable 进一步调用 Synchronized() 方法可以获得完全线程安全的类型. 而 Dictionary 非线程安全, 必须人为使用 lock 语句进行保护, 效率大减.
    [3] Dictionary 有按插入顺序排列数据的特性 (注: 但当调用 Remove() 删除过节点后顺序被打乱), 因此在需要体现顺序的情境中使用 Dictionary 能获得一定方便.

    不过有人认为:我认为应该始终使用Dictionary<K, V>,即使要用Hashtable了,也可以用Dictionary<object, object>来替代。

  • 相关阅读:
    数论算法 剩余系相关 学习笔记 (基础回顾,(ex)CRT,(ex)lucas,(ex)BSGS,原根与指标入门,高次剩余,Miller_Rabin+Pollard_Rho)
    51Nod1123 X^A Mod B 数论 中国剩余定理 原根 BSGS
    BZOJ2219 数论之神 数论 中国剩余定理 原根 BSGS
    BZOJ3583 杰杰的女性朋友 矩阵
    BZOJ2821 作诗(Poetize) 主席树 bitset
    BZOJ2178 圆的面积并 计算几何 辛普森积分
    BZOJ1058 [ZJOI2007]报表统计 set
    BZOJ2480 Spoj3105 Mod 数论 扩展BSGS
    BZOJ1095 [ZJOI2007]Hide 捉迷藏 动态点分治 堆
    AtCoder Regular Contest 101 (ARC101) D
  • 原文地址:https://www.cnblogs.com/BeeSnow/p/7989834.html
Copyright © 2020-2023  润新知