Live Note

Remain optimistic

6.006 - 8

Hash Table - Table Doubling

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
class Hash_Table {
constructor(size = 8) {
this.data = []
this._count = 0
this._size = size
}

_hash(str, num) {
let hash = 0
str.split("").map((i) => {
hash = (hash << 5) + i.charCodeAt(0)
hash = (hash & hash) % num
})
return hash
}

insert(key, value) {
let index = this._hash(key, this._size),
modify = false,
blank = this.data[index]

if (!blank) this.data[index] = blank = []

blank.map((i) => {
if (i[0] === key) {
i[1] === value
modify = true
}
})

if (!modify) {
blank.push([key, value])
this._count++

if (this._count > this.size * 0.75) {
this.resize(this.size * 2)
}
}
}

_resize(newSize) {
let oldData = this.data

this._size = newSize
this._count = 0
this.data = []

oldData.map((i) => {
if (!i) return
for (let j = 0; j < i.length; j++) {
this.insert(i[j][0], i[j][1])
}
})
}

remove(key) {
let index = this._hash(key, this._size)
let current = this.data[index]

if (!current) return null

current.map((i, index) => {
if (i[0] === key) {
current.splice(index, 1)
this._count--

if (this._count < this._size * 0.25) {
this._resize(this._size / 2)
}

return i[1]
}
})
}

traverse(key) {
let index = this._hash(key, this._size),
current = this.data[index]

if (!current) return null

let result = current.filter((i) => i[0] == key)[0]
return result === undefined ? null : result[1]
}

traverseALl() {
console.log(this.data)
}
}

var addressBook = new Hash_Table()

addressBook.insert("Wendy", "220-02-33")
addressBook.insert("GilesYvette", "746-71-84")
addressBook.insert("Pollitt", "374-34-48")
addressBook.insert("AbeLinda", "040-17-82")
addressBook.insert("StracheyPayne", "129-35-33")
addressBook.insert("JonahIrene", "709-98-46")
addressBook.insert("DorisAngela", "205-74-43")
addressBook.insert("ThoreauTess", "946-62-95")
addressBook.insert("HaggaiFanny", "147-68-09")
addressBook.insert("KentCuritis", "095-94-11")
addressBook.insert("CecilliaFrederica", "273-72-73")
addressBook.insert("HazlittFranklin", "107-49-37")
addressBook.remove("AbeLinda")
addressBook.remove("Pollitt")
addressBook.traverseALl()
console.log(addressBook.traverse("CecilliaFrederica"))
console.log(addressBook.traverse("Pollitt"))
console.log(addressBook.traverse("HaggaiFanny"))
console.log(addressBook.traverse("ThoreauTess"))
console.log(addressBook.traverse("DorisAngela"))

result:

1
2
3
4
5
6
Array(7) […, Array(4), …, Array(2), Array(0), Array(3), Array(1)]
273-72-73
null
147-68-09
946-62-95
205-74-43