(js描述的)数据结构[哈希表1.3](10)
1.哈希表的完善
1.容量质数(limit):需要恒为质数,来确保元素的均匀分布。
1)普通算法: 判断一个数是否为质数
function isPrime(num) {
for (var i = 2; i < num; i++) {
if (num % i == 0) {
return false
}
} return true
}
- 升级算法:只需要判断到(sqrt(num))就可以
function isPrime(num) {
var temp = parseInt(Math.sqrt(num))
for (var i = 0; i <= num; i++) {
if (num % i == 0) {
return false
}
}return true
}
--------------------------实现恒容量恒质数的哈希表---------------------------------
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
// 封装哈希表
function HashMap() {
//属性
this.storage = [] //存储数据
this.count = 0 //插入元素数量
this.limit = 7 //数组容量
//方法
//哈希函数
HashMap.prototype.hashFunc = function (str, size) {
//定义hashCode
var hashCode = 0
for (var i =0; i < str.length ; i++) {
hashCode = 37*hashCode + str.charCodeAt(i)
}
var index = hashCode % size
return index
}
// 插入&修改
HashMap.prototype.put =function(key, value) {
// 1.根据key获取对应的index
var index = this.hashFunc(key, this.limit)
// 2.根据index取出对应的bucket
var bucket = this.storage[index]
// 3.判断bucket是否为null
if (bucket == null) {
bucket = []
this.storage[index] = bucket
}
// 4.判断是否是修改数据
for (var i = 0; i< bucket.length; i++) {
var tuple = bucket[i]
if (tuple[0] == key) {
tuple[1] = value
return
}
}
// 5.进行添加操作
bucket.push([key, value])
this.count += 1
//扩容
if (this.count > this.limit * 0.75) {
var newLimit = this.getPrime(this.limit * 2)
this.resize(newLimit)
}
}
//获取操作
HashMap.prototype.get =function(key) {
// 1.根据key获取对应的index
var index = this.hashFunc(key, this.limit)
// 2.根据index取出对应的bucket
var bucket = this.storage[index]
// 3.判断bucket是否为null
if (bucket == null) {
return null
}
// 4.判断是否存在数据
for (var i = 0; i< bucket.length; i++) {
var tuple = bucket[i]
if (tuple[0] == key) {
return tuple[1]
}
}
return null
}
//删除操作
HashMap.prototype.remove =function(key) {
// 1.根据key获取对应的index
var index = this.hashFunc(key, this.limit)
// 2.根据index取出对应的bucket
var bucket = this.storage[index]
// 3.判断bucket是否为null
if (bucket == null) {
return null
}
// 4.判断是否存在数据
for (var i = 0; i< bucket.length; i++) {
var tuple = bucket[i]
if (tuple[0] == key) {
bucket.splice(i , 1)
this.count--
if (this.limit > 7 && this.count < this.limit *0.25) {
var newLimit = this.getPrime(Math.floor(this.limit / 2))
this.resize(newLimit)
}
return tuple[1]
}
}
return null
}
// 其他方法
//isEmpty方法
HashMap.prototype.isEmpty = function() {
return this.count == 0
}
//size方法
HashMap.prototype.size = function() {
return this.count
}
//数组扩容或缩容
HashMap.prototype.resize = function(newLimit) {
//保存所有属性
var oldStorage = this.storage
//重置所有属性
this.count = 0
this.limit = newLimit
this.storage = []
//遍历oldStorage中所有的bucket
for (var i = 0; i < oldStorage.length; i++) {
var bucket = oldStorage[i]
if (bucket == null) {
continue
}
for (var j = 0; i< bucket.length; j++) {
var tuple = bucket[j]
this.put(tuple[0], tuple[1])
}
}
}
//判断是否是质数
HashMap.prototype.isPrime = function(num) {
var temp = parseInt(Math.sqrt(num))
for (var i = 0; i <= num; i++) {
if (num % i == 0) {
return false
}
}return true
}
//获取质数
HashMap.prototype.getPrime = function(num) {
while (!this.isPrime(num)) {
num++
}
return num
}
}
(js描述的)数据结构[哈希表1.3](10)的更多相关文章
- (js描述的)数据结构[哈希表1.1](8)
(js描述的)数据结构[哈希表1.1](8) 一.数组的缺点 1.数组进行插入操作时,效率比较低. 2.数组基于索引去查找的操作效率非常高,基于内容去查找效率很低. 3.数组进行删除操作,效率也不高. ...
- (js描述的)数据结构[哈希表1.2](9)
一. 优秀的哈希函数 1.快速的计算: 需要快速的计算来获得对应的hashCode(霍纳法则来减少乘除次数) 2.均匀的分布: 尽可能将元素映射到不同的位置,让元素在哈希表中均匀分布 二.哈希表的扩容 ...
- (js描述的)数据结构[队列结构,优先级队列](3)
(js描述的)数据结构[队列结构](3) 一.队列结构的特点: 1.基于数组来实现,的一种受限的线性结构. 2.只允许在表头进行删除操作,在表尾进行插入操作. 3.先进先出(FIFO) 二.队列的一些 ...
- 数据结构 哈希表(Hash Table)_哈希概述
哈希表支持一种最有效的检索方法:散列. 从根来上说,一个哈希表包含一个数组,通过特殊的索引值(键)来访问数组中的元素. 哈希表的主要思想是通过一个哈希函数,在所有可能的键与槽位之间建立一张映射表.哈希 ...
- (js描述的)数据结构[字典](7)
(js描述的)数据结构[字典](7) 一.字典的特点 1.字典的主要特点是一一对应关系. 2.使用字典,剋通过key取出对应的value值. 3.字典中的key是不允许重复的,而value值是可以重复 ...
- (js描述的)数据结构[集合结构](6)
(js描述的)数据结构[集合结构](6) 一.集合结构特点 1.集合中的元素不能重复. 2.集合是无序的. 二.集合的代码实现 function Set() { this.items = {} //1 ...
- (js描述的)数据结构[双向链表](5)
(js描述的)数据结构[双向链表](5) 一.单向链表的缺点 1.只能按顺序查找,即从上一个到下一个,不能反过来. 二.双向链表的优点 1.可以双向查找 三.双向链表的缺点 1.结构较单向链表复杂. ...
- (js描述的)数据结构[链表](4)
(js描述的)数据结构 [链表](4) 一.基本结构 二.想比于数组,链表的一些优点 1.内存空间不是必须连续的,可以充分利用计算机的内存,事项灵活的内存动态管理. 2.链表不必再创建时就确定大小,并 ...
- (js描述的)数据结构[栈结构](2)
(js描述的)数据结构[栈结构](2) 一.什么是栈结构 1.一种受限制的线性结构,这种结构可以基于数组来实现. 2.可以抽象成一个容器,上面的是栈顶,底下的是栈底.所以仅允许对栈顶进行操作, 二.栈 ...
随机推荐
- js函数的三种成创建方式以及它们各自的不同
js有三种创建函数的方式: 1.function语句(也叫函数声明) function sum(a, b) { return a + b; } sum(1, 2); // 3 2. 函数直接量,又叫函 ...
- iview Checkbox 多选框 单个的时候 如果需要change 以后进行赋值 就要用value 不要用v-modal 然后用updateModel 方法
noSuchSituationSetFalse () { this.noSuchSituationOne = false this.$refs.noSuchSituationRef.updateMod ...
- Natas33 Writeup(Phar反序列化漏洞)
Natas33: 又是一个上传文件的页面,源码如下: // graz XeR, the first to solve it! thanks for the feedback! // ~morla cl ...
- 44. 更改oracle字符集编码american_america.zh16gbk 改为 SIMPLIFIED CHINESE_CHINA.ZHS16GBK
注册表NLS_LANG值改为SIMPLIFIED CHINESE_CHINA.ZHS16GBK
- MyBatis框架——延迟加载
延迟加载也叫惰性加载或者懒加载,使⽤延迟是为了提⾼程序的运⾏效率,具体是通过尽量少执⾏ SQL 语句来提升效率.Java 程序与数据库的交互频率越低越好,MyBatis 提供的延迟加载功能就可以做到这 ...
- mac redis搭建集群
1.下载redis客户端 2.修改redis.conf文件 port 6379 //端口 daemonize yes cluster-enabled yes //打开集群 cluster-config ...
- Linux中更换为国内镜像源
推荐使用清华镜像:https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/ 将下列文本添加到/etc/apt/sources.list文件里 # 默认注释了源 ...
- Java并发编程之支持并发的list集合你知道吗
Java并发编程之-list集合的并发. 我们都知道Java集合类中的arrayList是线程不安全的.那么怎么证明是线程不安全的呢?怎么解决在并发环境下使用安全的list集合类呢? 本篇是<凯 ...
- Django 配置使用日志
一. Django中使用日志 Django中使用日志其实非常简单,只需要在项目使用的配置文件中(如果没有自定义,那么就是settings.py中)加以下设置即可,同时可以根据自己的需求进行修改: # ...
- Partition Array into Disjoint Intervals
2020-02-10 22:16:50 问题描述: 问题求解: 解法一:MultiSet O(nlog) 看了下数据规模,第一个想到的是multiset,肯定可以ac的,就直接敲了出来. public ...