zoukankan      html  css  js  c++  java
  • 自己写一个 Hash 表

    项目地址:  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  之间 应该要有 显著 的 差距,  如果 两者 相等 或者 相近,  可能会  刚 扩容 又 缩容,  刚 缩容 又 扩容,  频繁 扩容 缩容 导致 性能低下  。

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

     

  • 相关阅读:
    phpStudy mysql升级至5.7
    apache 子域名自动与子域名同名的目录绑定
    js 移动端获取当前用户的经纬度
    PHPStudy环境下搭建composer
    MySQL sock 文件丢失被删除解决方法
    Nginx+Php-fpm运行原理详解
    服务器反爬虫攻略:Apache/Nginx/PHP禁止某些User Agent抓取网站
    php 下载文件/直接下载数据内容
    window 克隆复制当前窗口
    staff
  • 原文地址:https://www.cnblogs.com/KSongKing/p/10425152.html
Copyright © 2011-2022 走看看