当前位置: 首页 > wzjs >正文

2018 政府网站建设发言企业培训考试app

2018 政府网站建设发言,企业培训考试app,商城网站建设 亚马逊,网站上传软件在 C# 中&#xff0c;Dictionary<TKey, TValue> 是一个基于哈希表&#xff08;Hash Table&#xff09;实现的键值对集合。它提供了高效的插入、删除和查找操作&#xff0c;平均时间复杂度接近 O(1)。下面是 Dictionary 的核心实现原理&#xff1a; 1. Dictionary 的核心数…

在 C# 中,Dictionary<TKey, TValue> 是一个基于哈希表(Hash Table)实现的键值对集合。它提供了高效的插入、删除和查找操作,平均时间复杂度接近 O(1)。下面是 Dictionary 的核心实现原理:


1. Dictionary 的核心数据结构

C# 的 Dictionary<TKey, TValue> 主要由以下几个部分组成:

  • 数组(buckets):存储哈希桶(Bucket)的索引。
  • 数组(entries):存储键值对(哈希表中的实际数据)。
  • 哈希函数(GetHashCode):将键映射到哈希桶。
  • 碰撞解决(拉链法):采用 链地址法(Chaining with Linked List)。
  • 负载因子(Load Factor):决定何时扩容,默认为 0.75。

数据结构

private int[] buckets;         // 哈希桶数组,存储 entry 的索引
private Entry[] entries;       // 存储实际的键值对
private int count;             // 当前存储的元素个数
private int freeList;          // 指向空闲 entry(删除后形成的空位)
private int freeCount;         // 空闲 entry 的数量private struct Entry
{public int hashCode;       // 计算出的哈希值public int next;           // 指向下一个冲突的元素(-1 表示无冲突)public TKey key;           // 键public TValue value;       // 值
}

2. Dictionary 的主要操作

(1)添加元素

当调用 dictionary.Add(key, value) 时,Dictionary 执行以下步骤:

  1. 计算哈希值:调用 key.GetHashCode() 计算哈希值 hashCode

  2. 计算索引:对哈希值取模,index = hashCode % buckets.Length,确定应该存放的桶。

  3. 检查冲突:

    • 如果该桶为空,则直接存储。此时count字段记录字典中元素个数。令bucket[index] = count,然后将内容存储到Entry[count]中,随后count++。
    • 如果发生哈希冲突,则使用链地址法存储,即将 entries 中的 next 指向旧的 Entry,形成链表。
  4. 扩容(如有必要):

    • 如果 count > capacity * 0.75,则触发扩容,通常是 2 倍扩容

    public void Add(TKey key, TValue value)

    {

     int hashCode = key.GetHashCode() & 0x7FFFFFFF;  // 计算哈希值int index = hashCode % buckets.Length;  // 计算桶的索引// 处理哈希冲突:如果桶为空,直接插入if (buckets[index] == -1){buckets[index] = count;  // 将当前元素插入桶数组entries[count] = new Entry { hashCode = hashCode, key = key, value = value, next = -1 	};count++;}else{// 发生哈希冲突,遍历链表int current = buckets[index];while (current >= 0){Entry entry = entries[current];if (entry.hashCode == hashCode && EqualityComparer<TKey>.Default.Equals(entry.key, key)){entries[current].value = value;  // 如果找到相同的键,更新值return;}current = entry.next;  // 查找下一个节点}// 如果没有找到,插入新的元素到链表头部entries[count] = new Entry { hashCode = hashCode, key = key, value = value, next = buckets[index] };buckets[index] = count;  // 更新桶的索引count++;}// 扩容检查if (count > buckets.Length * 0.75){Resize();  // 扩容}
    

    }

(2)查找元素

当调用 dictionary[key]TryGetValue(key, out value) 时:

  1. 计算哈希值hashCode = key.GetHashCode()

  2. 计算索引index = hashCode % buckets.Length

  3. 遍历链表

    • 如果桶中第一个元素匹配,则直接返回。
    • 如果有哈希冲突(next != -1),遍历 entries 直到找到 key

(3)删除元素

当调用 dictionary.Remove(key) 时:

  1. 计算哈希值,找到哈希桶索引。
  2. 遍历链表,找到匹配的 Entry
  3. 更新链表指针:
    • 如果是第一个元素,则更新 buckets 指向 next 位置。
    • 如果在链表中,则调整 next 以跳过该元素。
  4. 回收 entry:
    • entry 记录到 freeList,方便后续使用。

(4)扩容机制

count >= capacity * 0.75 时,Dictionary 会进行 2 倍扩容

  1. 创建更大的 buckets 和 entries 数组(通常是 2 倍大小)。
  2. 重新计算索引,重新分配 bucketsentries
  3. 重新插入所有 Entry,因为 hashCode % newCapacity 结果不同,所有键值对需要重新计算索引。

3. Dictionary 的碰撞处理

C# 的 Dictionary 采用 链地址法 处理哈希冲突:

  • entries 形成链表,每个 Entry 记录 next 指向同一个桶的下一个 Entry
  • 遍历链表时,检查 hashCodekey 是否匹配。

示例假设 buckets 长度为 5,并插入以下键值对:

dict.Add(1, "Apple");
dict.Add(6, "Banana"); // 6 % 5 == 1,与 1 发生哈希冲突

哈希桶结构如下:

buckets: [ -1,  0 -> 1, -1, -1, -1 ]   // index 1 存储链表 (1 → 6)
entries: 0: { hashCode=1, key=1, value="Apple", next=1 }1: { hashCode=6, key=6, value="Banana", next=-1 }

查找 dict[6] 时:

  1. 计算 index = 6 % 5 = 1
  2. 遍历链表:
    • entries[0] (key=1) 不匹配,继续遍历 next=1
    • entries[1] (key=6) 匹配,返回 "Banana"

4. Dictionary 的优缺点

优点

  • 查找快:平均时间复杂度 O(1)
  • 插入删除快:平均时间复杂度 O(1)
  • 自动扩容:避免手动管理大小。

缺点

  • 内存占用大:数组 + 链表可能浪费额外空间。
  • 哈希碰撞影响性能:冲突越多,查找速度降至 O(n)
  • 不保证顺序Dictionary 无序存储键值对。

5. Dictionary 的替代方案

数据结构适用场景
SortedDictionary<TKey, TValue>需要按键排序(基于 红黑树,O(log n))
SortedList<TKey, TValue>适用于小数据量,查找快但插入慢
HashSet<T>仅存储键,不存储值
ConcurrentDictionary<TKey, TValue>多线程安全字典

http://www.dtcms.com/wzjs/260953.html

相关文章:

  • 建设自动弹出qq对话框的网站成人教育培训机构
  • 专注网站建设与制作新乡百度网站优化排名
  • 网站更换主机注意58精准推广点击器
  • 主播做的头像在哪个网站上做的搜索引擎营销的主要模式
  • 网站的栏目有什么名字网络营销工具分析
  • 网站建设高端定制精品成品网站入口
  • 2017政府网站建设通知整站优化 mail
  • 兰州网站推广优化百度指数数据分析平台入口
  • 德保县建设局的网站广东做seo的公司
  • 如何在电商网站做市场调研优化关键词技巧
  • 武汉外贸电商网站建设磁力吧最佳搜索引擎
  • 麻城网站建设网络营销网站推广方法
  • 西平网站建设十大软件免费下载网站排行榜
  • 品牌推广网站怎么做百度seo网站
  • 网站后台 添加用户深圳网络推广大师
  • 网页设计师收费标准seo推广网站
  • 一家专门做原型的网站seo 公司
  • 医疗网站建设百度电话人工服务
  • 二手书网站的建设规模小程序开发工具
  • 网站开发培训要多少钱南京seo收费
  • 深圳网站建设商河南品牌网络推广外包
  • 医疗网站建设好么江苏搜索引擎优化公司
  • 九五至尊娱乐场网站利尔化学股票股吧
  • 网站设计便宜搜索热词排名
  • wordpress 获取文章评论seo教程搜索引擎优化入门与进阶
  • 外贸做网站推广b站推广网站2024mmm
  • 忘忧草福建导航东莞整站优化
  • 长沙网站建设论坛网站之家查询
  • 商城网站建设行情如何做品牌营销
  • 营销型网站建设有哪些特点百度seo怎么做网站内容优化