项目地址:  https://github.com/kelin-xycs/HashTableLib

为什么会想要自己写一个 Hash 表, 以前也想过 Hash 表 的 原理, 觉得很神奇,

不过最近的 直接原因 是 最近在搞  ILBC, 这可以认为是一个 编译器 项目,

有关 ILBC,  见 《ILBC 规范》  https://www.cnblogs.com/KSongKing/p/10354824.html ,

编译器 里 会 需要 快速 的 查找 成员(变量 、字段 、类 、 方法 / 函数),  比如 检验 成员 是否重名, 以及 对 成员 的 访问 的 编译工作 。

也包括 运行期查找成员(反射 / 动态链接)  。

当然 ILBC 里使用的 Hash 表 会用 C 语言 写, 这次写的 项目 是 用 C# 写的, 在 原理 上 实现了一下 。

具体的逻辑 看代码 就行, 代码不多, 大约 350 行 。  ^^

不过有一点说明一下, 就是可以调用 HashTable 的

public HashTable(int initCapacity)

这个 构造函数 重载 来 指定    initCapacity ,

也可以调用

public HashTable(int initCapacity, double whenEnlarge, double enlargeRatio)

这个 构造函数 重载 来 指定    initCapacity,  whenEnlarge,  enlargeRatio ,

initCapacity  表示 new HashTable  时 的 初始 的 Hash 表 容量,  容量 是指 Hash 表 内部 存储元素 的 数组 的 长度,

whenEnlarge  表示 当 元素(键值对) 的 数量 达到  容量 的 百分之几 时, 要对 Hash 表 扩容(增大容量), 扩容 就是 按照 新的 容量 申请一个 数组, 把 原来的 数组 的 元素 重新 添加到 新数组 里, 注意 这里的 添加 不是 简单的复制, 而是 把  元素(键值对) 重新 添加(Add) 到 Hash 表, 在 添加(Add) 时 会 重新计算 key 的 Hash 值 并 根据 key 的 Hash 值 计算 键值对 在 数组 里的 位置(下标 ( index )) 。

enlargeRatio  表示 扩容 时 要 扩大多少, 即 增加的容量 相对于 原来的容量 所占 的 百分比 。

如果不想自己指定   initCapacity,  whenEnlarge,  enlargeRatio ,    也可以调用 无参 构造函数

public HashTable()

无参 构造函数 使用 默认的   initCapacity,  whenEnlarge,  enlargeRatio ,

initCapacity 的 默认值 是 100 ,

whenEnlarge 的 默认值 是 0.8 ,

enlargeRatio 的 默认值 是 0.3  。

如果 知道 元素(键值对) 的 数量 或者 大概数量, 可以 指定  InitCapacity ,  这样可以 避免 或 减少 扩容 , 提高效率 。

注意 如果 指定 Capacity 是 100,  whenEnlarge 是 0.8, 那么 当 元素(键值对) 数量 达到  100 * 0.8 = 80  后, 再 添加 键值对 时, 就会 扩容 。

现在的设计 只涉及到 扩容, 没有 “缩容”,  缩容 是指 当 元素(键值对) 数量 减少到 一定程度 时, 会 减少 Capacity ,  把 元素(键值对) 放到一个 长度更小 的 数组 里  。

缩容 的 部分 可以仿照 扩容 来写,   但要注意  whenDeLarge 和 whenEnlarge  之间 应该要有 显著 的 差距,  如果 两者 相等 或者 相近,  可能会  刚 扩容 又 缩容,  刚 缩容 又 扩容,  频繁 扩容 缩容 导致 性能低下  。

不过 一般场合 好像 不需要 缩容  。

自己写一个 Hash 表的更多相关文章

  1. 用node.js给C#写一个数据表的实体类生成工具

    虽然微软提供了T4模板,但是我感觉非常难用.哪儿比得上直接用脚本来写模板来的爽. 因为要给一个老项目做周边的工具,需要连接到数据库. 我习惯性用EntityFrameworkCore来做,因为毕竟从出 ...

  2. 计蒜客 成绩统计 (Hash表)

    链接 : Here! 思路 : 如果用 $STL$ 的 $map$ 或者是使用 $unordered\underline{}map$ 的话是会 $T$ 的, 所以得手写一个 $hash表$. 其实这个 ...

  3. 写一个简单易用可扩展vue表单验证插件(vue-validate-easy)

    写一个vue表单验证插件(vue-validate-easy) 需求 目标:简单易用可扩展 如何简单 开发者要做的 写了一个表单,指定一个name,指定其验证规则. 调用提交表单方法,可以获取验证成功 ...

  4. 【数据结构】非常有用的hash表

        这篇博客的目的是让尚未学会hash表的朋友们对hash表有一个直观的理解,并且能根据本文定义出属于自己的第一个hash表,但算不上研究文,没有深究概念和成功案例.         什么是has ...

  5. nyist oj 138 找球号(二)(hash 表+位运算)

    找球号(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描写叙述 在某一国度里流行着一种游戏.游戏规则为:现有一堆球中.每一个球上都有一个整数编号i(0<=i< ...

  6. Hash表的扩容(转载)

    Hash表(Hash Table)   hash表实际上由size个的桶组成一个桶数组table[0...size-1] . 当一个对象经过哈希之后.得到一个对应的value , 于是我们把这个对象放 ...

  7. LeetCode169:Majority Element(Hash表\位操作未懂)

    题目来源: Given an array of size n, find the majority element. The majority element is the element that ...

  8. 简单好用的hash表-----uthash

    在软件开发中,不可不免的会使用到hash表,hash表的优点这里就不说了,以下介绍一个hash表的C实现, uthash是用宏实现的,使用的时候非常方便,只用包含uthash.h即可. Uthash的 ...

  9. Linux-c glib库hash表GHashTable介绍

    百度云glib  链接:https://pan.baidu.com/s/1W9qdlMKWRKIFykenTVuWNQ 密码:ol6y hash表是一种提供key-value访问的数据结构,通过指定的 ...

随机推荐

  1. 力扣(LeetCode) 821. 字符的最短距离

    给定一个字符串 S 和一个字符 C.返回一个代表字符串 S 中每个字符到字符串 S 中的字符 C 的最短距离的数组. 示例 1: 输入: S = "loveleetcode", C ...

  2. 【分布式搜索引擎】Elasticsearch写入和读取数据过程

    一.Elasticsearch写人数据的过程 1)客户端选择一个node发送请求过去,这个node就是coordinating node(协调节点)2)coordinating node,对docum ...

  3. 问题处理:Library not loaded: /usr/local/opt/readline/lib/libreadline.7.dylib (LoadError)

    进入rails 文件夹, terminal输入rails console报告❌. 类似下面的 Running via Spring preloader Traceback (most recent c ...

  4. Android之Fragment(碎片)方方面面

    Fragment简介碎片(Fragment)是一种可以嵌入到活动当中的UI片段,它能让程序更加合理和充分的利用大屏幕的空间. Fragment的生命周期 它与Activity生命周期的关系: 可以看到 ...

  5. 『Python』多进程处理

    尝试学习python的多进程模组,对比多线程,大概的区别在: 1.多进程的处理速度更快 2.多进程的各个子进程之间交换数据很不方便 多进程调用方式 进程基本使用multicore() 进程池优化进程的 ...

  6. React文档(十五)使用propTypes进行类型检查

    注意: React.PropTypes 自 React v15.5 起已弃用.请使用 prop-types 库代替. 随着你的应用的开发,你会使用类型检查的方法来捕获很多bug.对于一些应用,你可以使 ...

  7. sql server替换字段中的某个字符

    USE [Vocabulary ] GO --UPDATE [dbo].[table name] --   SET [en] = '' --      ,[cn] ='' -- WHERE --cha ...

  8. spring基础知识,未完待续

    https://blog.csdn.net/slow_wakler/article/details/54895508   http://www.runoob.com/design-pattern/ch ...

  9. html5(八) IndexedDB

    IndexedDB 是一个数据库系统,它在用户的计算机上存储索引信息. IndexedDB与传统的数据库不同.在IndexedDB中,数据库中的信息以对象的形式存储在对象库表中.对象库没有特定的结构, ...

  10. 2015-10-07 jQuery2

    jQuery (2) 四. 过滤选择器 1.  $("input[type='button']").val(“中国”)   //所有设置type=button的input,其val ...