首页 > 其他分享 >哈希表

哈希表

时间:2023-12-14 16:48:46浏览次数:25  
标签:index return 哈希 buckets value key const

简单哈希表

class Pair {
	constructor(key, value) {
		this.key = key
		this.value = value
	}
}

class Hash {
	constructor() {
		this.buckets = new Array(100).fill(null)
	}

	hashFunction(key) {
		return key % 100
	}

	set(key, value) {
		const index = this.hashFunction(key)
		this.buckets[index] = new Pair(key, value)
	}

	delete(key) {
		const index = this.hashFunction(key)
		this.buckets[index] = null
	}

	get(key) {
		const index = this.hashFunction(key)
		const pair = this.buckets[index]
		if (pair === null) return null
		return pair
	}

	keys() {
		const arr = []
		for (let i = 0; i < this.buckets.length; i++) {
			if (this.buckets[i] !== null) arr.push(this.buckets[i].key)
		}
		return arr
	}

	values() {
		const arr = []
		for (let i = 0; i < this.buckets.length; i++) {
			if (this.buckets[i] !== null) arr.push(this.buckets[i].value)
		}
		return arr
	}

	entries() {
		const arr = []
		for (let i = 0; i < this.buckets.length; i++) {
			if (this.buckets[i] !== null) arr.push(this.buckets[i])
		}
		return arr
	}
}

链表法解决哈希冲突

建立桶数组,每个数组元素是一个桶链表,将哈希值相同的数据进行链表管理

class Pair {
	constructor(key, value) {
		this.key = key
		this.value = value
	}
}

class Hash {
	constructor() {
		this.size = 0
		this.capacity = 100
		this.loadThres = 2 / 3
		this.extendRatio = 2
		this.buckets = new Array(this.capacity).fill(null).map(x => [])
	}

	hashFun(key) {
		return key % this.capacity
	}

	loadFactor() {
		return this.size / this.capacity
	}

	extend() {
		const tempBucket = this.buckets
		this.capacity *= this.extendRatio
		this.buckets = new Array(this.capacity).fill(null).map(x=>[])
		this.size = 0
		for(let i = 0 ;i < tempBucket.length; i++) {
			for(let j = 0; j < tempBucket[i]; j++) {
				this.set(tempBucket[i][j].key,tempBucket[i][j].value)
			}
		}
	}

	get(key) {
		const index = this.hashFun(key)
		const bucket = this.buckets[index]
		for (let i = 0; i < bucket.length; i++) {
			if (bucket[i].key === key) return bucket[i].value
		}
		return null
	}

	set(key, value) {
		if(this.loadFactor > this.loadThres) {
			this.extend()
		}
		const index = this.hashFun(key)
		const bucket = this.buckets[index]
		for (let i = 0; i < bucket.length; i++) {
			if (bucket[i].key === key) {
				bucket[i].value = value
				return
			}
		}
		const pair = new Pair(key, value)
		bucket.push(pair)
		this.size++
	}

	delete(key) {
		const index = this.hashFun(key)
		const bucket = this.buckets[index]
		for(let i = 0; i < bucket.length; i++) {
			if(bucket[i].key === key) {
				bucket.splice(i,1)
				this.size--
				return
			}
		}
	}
	
}

线性探测法解决哈希冲突

当哈希值相同时,往后寻找最近的空桶并填入

删除元素利用了懒惰删除,解决了指针查找到为null而跳出的情况

class Pair {
	constructor(key, value) {
		this.key = key
		this.value = value
	}
}

class Hash {
	constructor() {
		this.size = 0
		this.capacity = 100
		this.loadThres = 2 / 3
		this.extendRatio = 2
		this.buckets = new Array(this.capacity).fill(null)
		this.deleteFlag = new Pair(-1, '-1')
	}

	hashFun(key) {
		return key % this.capacity
	}

	loadFactor() {
		return this.size / this.capacity
	}

	findBucket(key) {
		const index = this.hashFun(key)
		while (this.buckets[index] !== null) {
			if (this.buckets[index].key === key) {
				return index
			}
			index = index + 1
		}
		return index
	}

	extend() {
		const tempBucket = this.buckets
		this.capacity *= this.extendRatio
		this.buckets = new Array(this.capacity).fill(null)
		this.size = 0
		for (let i = 0; i < tempBucket; i++) {
			if (tempBucket[i] !== null && tempBucket[i] !== this.deleteFlag) {
				this.set(tempBucket[i].key, tempBucket[i].value)
			}
		}
	}

	get(key) {
		const index = this.findBucket(key)
		if (
			this.buckets[index] !== null &&
			this.buckets[index] !== this.deleteFlag
		)
			return this.buckets[index].value
		return null
	}

	set(key, value) {
		if (this.loadFactor() > this.loadThres) {
			this.extend()
		}
		const index = this.findBucket(key)
		if (
			this.buckets[index] !== null &&
			this.buckets[index] !== this.deleteFlag
		) {
			this.buckets[index].value = value
			return
		}
		this.buckets[index] = new Pair(key, value)
		this.size++
	}

	delete(key) {
		const index = this.findBucket(key)
		if (
			this.buckets[index] === null ||
			this.buckets[index] === this.deleteFlag
		)
			return
		this.buckets[index] = this.deleteFlag
		this.size--
	}
}

 

标签:index,return,哈希,buckets,value,key,const
From: https://www.cnblogs.com/karle/p/17901467.html

相关文章

  • 【交叉链表】Java哈希表——HashSet类/双指针
    leetcode160.相交链表题意:给定两个链表A、B的表头节点,找到链表交叉节点(地址值相同)。链表A长度为m,链表B长度为n,范围在[1,3e4]题解1:根据哈希表去重的原理,使用哈希表集合HashSet来维护链表节点,默认比较节点地址值。将链表A中的节点全部add进HashSet中,然后遍历链表B中的节点,如果......
  • 洛谷P3396 哈希冲突
    根号分治模板题#include<iostream>#include<stdio.h>#include<algorithm>#include<cstring>#include<cmath>#defineRED"\033[0;32;31m"#defineNONE"\033[m"#defineR(x)x=read()#defineFor(i,j,n)for......
  • 算法--哈希表
    哈希表利用空间换时间当我们要快速判断一个元素是否出现在集合里的时候,就需要考虑哈希表。哈希表一般会选择三种数据结构,分别是:数组、set(集合)、map(映射)。数组就是简单的哈希表,但是其大小不能无限开辟优先使用unordered_set(因为其查找和增删效率最优);若需要集合有序,则用set;若不......
  • 【JavaSE】数据结构-哈希表(HashSet/HashMap底层哈希表详解,源码分析)
    哈希表结构JDK8版本之前:数组+链表JDK8版本及之后:数组+链表+红黑树哈希表HashMapput()方法的添加流程创建HashSet集合时,构造方法中自动创建HashMap集合;HashMap空参构造方法会创建一个默认长度为16,默认加载因子为0.75的数组,数组名为table(tips:实际上,HashSet对象创建后,第......
  • 字符串哈希
    单哈希且用自然溢出代替取模操作,常数小但是容易被卡单字符串区间内比较typedefunsignedlonglongULL;constintN=100010,P=131;intn,m;charstr[N];ULLh[N],p[N];ULLget(intl,intr){returnh[r]-h[l-1]*p[r-l+1];}intmain(){......
  • 【OpenSSL】哈希、非对称加密和对称加密函数使用
    1.哈希1.1md5的使用头文件#include<openssl/md5.h>#include<openssl/sha.h>MD5散列值的长度#defineMD5_DIGEST_LENGTH16//根据这个分配一块空内存保存散列值初始化MD5->给MD5传入运算的数据(可以多次传入)->计算MD5#defineMD5_DIGEST_LENGTH1......
  • 第13章. 哈希表
    哈希表(HashTable)一、引言TreeMap分析添加、删除、搜索的时间复杂度:O(n)特点:key必须具备可比较性元素的分布是有顺序的但是在实际应用中,很多时候的需求中Map中存储的元素不需要讲究顺序Map中的Key不需要具备可比较性不考虑顺序、不考虑Key的可比较性,Map有更好......
  • 第五节:哈希表详解 和 面试题剖析
    一.        二.        三.         !作       者:Yaopengfei(姚鹏飞)博客地址:http://www.cnblogs.com/yaopengfei/声     明1:如有错误,欢迎讨论,请勿谩骂^_^。声     明2:原创博客请在转载......
  • 【THM】哈希 - Crypto 101
    关键术语在开始之前,我们需要先了解一些行话。阅读这些内容,并尽可能多地吸收。我们将在稍后的房间里扩展其中的一些内容。纯文本 -加密或哈希之前的数据,通常是文本,但并不总是如此,因为它可能是照片或其他文件。编码 -这不是一种加密形式,只是一种数据表示形式,如base64或十六......
  • 第三章 哈希表**part01**
    第三章哈希表**part01** 242.有效的字母异位词 题目链接:https://leetcode.cn/problems/valid-anagram/需要注意的点 字符串结束标志的判断 字母ASCII到数字的映射/简化映射 similar的操作,在简化时,如果只需要判断,可采取互补向......