let HashTable1 = function () {
let items = []
// 通过ascII码转换
let loseloseHashCode = function (key) {
let hash = 0
for (let i = 0
hash += key[i].charCodeAt()
}
return hash % 37
}
// 添加
this.put = function (key, value) {
let position = loseloseHashCode(key)
items[position] = value
}
// 获取
this.getItems = function () {
return items
}
// 移除
this.rmove = function (key) {
items[loseloseHashCode(key)] = undefined
}
// 获取
this.get = function (key) {
return items[loseloseHashCode(key)]
}
// djb2HashCode
}
// 这里会出现hash冲突
// 分离链接法
// 线性探查法
let HashTable = function () {
let items = []
// 通过ascII码转换
let loseloseHashCode = function (key) {
let hash = 0
for (let i = 0
hash += key[i].charCodeAt()
}
return hash % 37
}
let Node = function (key, value) {
this.key = key
this.value = value
}
// 添加
this.put = function (key, value) {
let position = loseloseHashCode(key)
if (items[position]) {
items[position].append(new Node(key, value))
} else {
let l = new LikedList()
items[position] = l
items[position].append(new Node(key, value))
}
}
// 获取
this.getItems = function () {
return items
}
// 获取
this.get = function (key) {
let position = loseloseHashCode(key)
if (items[position]) {
// 链表线性查找
let current = items[position].getHead()
while (current) {
if (current.element.key == key) {
return current.element.value
}
current = current.next
}
} else {
return undefined
}
}
this.rmove = function (key) {
let position = loseloseHashCode(key)
if (items[position]) {
let current = items[position].getHead()
while (current) {
if (current.element.key == key) {
items[position].rmove(current.element)
if (items[position].isEmpty()) {
items[position] = undefined
}
return true
}
current = current.next
}
} else {
return false
}
}
// djb2HashCode
}
// 线性探查法
let HashTable3 = function () {
let table = []
// 通过ascII码转换
let loseloseHashCode = function (key) {
let hash = 0
for (let i = 0
hash += key[i].charCodeAt()
}
return hash % 37
}
let Node = function (key, value) {
this.key = key
this.value = value
}
this.put = function (key, value) {
let position = loseloseHashCode(key)
if (table[position] == undefined) {
table[position] = new Node(key, value)
} else {
// 如果当前值已经存有值了,则接着往下存储
let index = position + 1
while (table[index] !== undefined) {
index++
}
table[index] = new Node(key, value)
}
}
this.get = function () {}
this.rmove = function () {}
}
function djb2HashCode(key) {
let hash = 5381
for (let i = 0
hash = hash * 33 + key[i].charCodeAt()
}
return hash % 1013
}