自己写一个 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 之间 应该要有 显著 的 差距, 如果 两者 相等 或者 相近, 可能会 刚 扩容 又 缩容, 刚 缩容 又 扩容, 频繁 扩容 缩容 导致 性能低下 。
不过 一般场合 好像 不需要 缩容 。
自己写一个 Hash 表的更多相关文章
- 用node.js给C#写一个数据表的实体类生成工具
虽然微软提供了T4模板,但是我感觉非常难用.哪儿比得上直接用脚本来写模板来的爽. 因为要给一个老项目做周边的工具,需要连接到数据库. 我习惯性用EntityFrameworkCore来做,因为毕竟从出 ...
- 计蒜客 成绩统计 (Hash表)
链接 : Here! 思路 : 如果用 $STL$ 的 $map$ 或者是使用 $unordered\underline{}map$ 的话是会 $T$ 的, 所以得手写一个 $hash表$. 其实这个 ...
- 写一个简单易用可扩展vue表单验证插件(vue-validate-easy)
写一个vue表单验证插件(vue-validate-easy) 需求 目标:简单易用可扩展 如何简单 开发者要做的 写了一个表单,指定一个name,指定其验证规则. 调用提交表单方法,可以获取验证成功 ...
- 【数据结构】非常有用的hash表
这篇博客的目的是让尚未学会hash表的朋友们对hash表有一个直观的理解,并且能根据本文定义出属于自己的第一个hash表,但算不上研究文,没有深究概念和成功案例. 什么是has ...
- nyist oj 138 找球号(二)(hash 表+位运算)
找球号(二) 时间限制:1000 ms | 内存限制:65535 KB 难度:5 描写叙述 在某一国度里流行着一种游戏.游戏规则为:现有一堆球中.每一个球上都有一个整数编号i(0<=i< ...
- Hash表的扩容(转载)
Hash表(Hash Table) hash表实际上由size个的桶组成一个桶数组table[0...size-1] . 当一个对象经过哈希之后.得到一个对应的value , 于是我们把这个对象放 ...
- LeetCode169:Majority Element(Hash表\位操作未懂)
题目来源: Given an array of size n, find the majority element. The majority element is the element that ...
- 简单好用的hash表-----uthash
在软件开发中,不可不免的会使用到hash表,hash表的优点这里就不说了,以下介绍一个hash表的C实现, uthash是用宏实现的,使用的时候非常方便,只用包含uthash.h即可. Uthash的 ...
- Linux-c glib库hash表GHashTable介绍
百度云glib 链接:https://pan.baidu.com/s/1W9qdlMKWRKIFykenTVuWNQ 密码:ol6y hash表是一种提供key-value访问的数据结构,通过指定的 ...
随机推荐
- spring(aop面向切面编程)
aop很早有研究过,但是最近想回顾下,顺便记录下,aop的优点有很多,实用性也很广,就好比最早在公司没有使用aop的时候没个业务层都要写try catch来捕获异常,来处理异常,甚至于记录异常或者日志 ...
- js 数组原型
Array.isArray( Array.prototype ) // A. true // B. false // C. error // D. other 答案是A. 其实 Array.proto ...
- Character流与Byte流的区别(转)
Character流与Byte流的区别是 A) 每次读入的字节数不同 B) 前者带有缓冲,后者没有C) 前者是字符读写,后者是字节读写 D) 二者没有区别,可以互换使用 Java的流操作分为字节流和字 ...
- 盛最多水的容器(java实现)
题目: 给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0).找出其中的 ...
- win10下vs2015编译的程序如何运行在win7等系统(无需安装Redistributable)
最近新写的程序要做beta测试,在做绿色版(免安装版)时遇到了问题,vs2015做的项目本以为像之前的vs版本一样把msvcrXXX.dll还有另外几个运行时库都放到exe旁边即可,然并卵...,在w ...
- day71 菜单的排序 点击被选中
菜单的排序:(给菜单设置权重,权重高的让他显示在上面) from django import template from django.conf import settings from collec ...
- css图形——三角形
1.css图形简介 在浏览网页的时候,我们经常看见各种图形的效果,而但凡涉及到图形效果,我们第一个想到的就是用图片来实现.但是在前端开发中,为了网站的性能速度,我们都是秉承着少用图片的原生质. 因为图 ...
- linux 安装【jdk、tomcat】查看对外开放端口(防火墙拦截处理)
1.安装 jdkhttps://www.cnblogs.com/xu-dong/p/6422938.html 查看Linux下查看JDK安装路径: https://www.cnblogs.com/im ...
- Java实验6
dbq时隔这么久我总算又来更新了 这次说说一个很好玩的类,JLabel的如何改里面字的属性 label.setFont(new Font("宋体", 0 , 15)); 这个指的是 ...
- html实现滚动播报(原生JS实现)
html实现滚动播报(原生JS实现) 废话不多说,先看一个简单的滚动效果(鼠标放上去的时候可以暂停滚动,谷歌版本 66.0.3359.139(正式版本)查看时会出现滚动混乱.单独提出来的时候不会,应该 ...