typescript-ds-lib 0.3.5 → 0.3.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/lib/hash-table.js +8 -8
- package/dist/lib/hash-table.js.map +1 -1
- package/dist/lib/hash-utils.d.ts +7 -0
- package/dist/lib/{hash-table-utils.js → hash-utils.js} +37 -30
- package/dist/lib/hash-utils.js.map +1 -0
- package/dist/lib/set.d.ts +9 -7
- package/dist/lib/set.js +89 -22
- package/dist/lib/set.js.map +1 -1
- package/package.json +1 -1
- package/dist/lib/hash-table-utils.d.ts +0 -7
- package/dist/lib/hash-table-utils.js.map +0 -1
package/README.md
CHANGED
|
@@ -54,7 +54,7 @@ See the [documentation](https://github.com/baloian/typescript-ds-lib/blob/master
|
|
|
54
54
|
- Stack
|
|
55
55
|
- Graph (coming soon)
|
|
56
56
|
|
|
57
|
-
**Note:** The `Map` data structure is implemented as a Red-Black Tree
|
|
57
|
+
**Note:** The `Map` data structure is implemented as a Red-Black Tree.
|
|
58
58
|
|
|
59
59
|
## Contributions
|
|
60
60
|
Contributions are welcome and can be made by submitting GitHub pull requests
|
package/dist/lib/hash-table.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.HashTable = void 0;
|
|
4
|
-
const
|
|
4
|
+
const hash_utils_1 = require("./hash-utils");
|
|
5
5
|
const base_collection_1 = require("./base-collection");
|
|
6
6
|
class HashNode {
|
|
7
7
|
key;
|
|
@@ -25,7 +25,7 @@ class HashTable extends base_collection_1.BaseCollection {
|
|
|
25
25
|
this.count = 0;
|
|
26
26
|
}
|
|
27
27
|
insert(key, value) {
|
|
28
|
-
const index =
|
|
28
|
+
const index = hash_utils_1.HashUtils.hash(key, this.capacity);
|
|
29
29
|
// Handle empty bucket case.
|
|
30
30
|
if (!this.table[index]) {
|
|
31
31
|
this.table[index] = new HashNode(key, value);
|
|
@@ -33,14 +33,14 @@ class HashTable extends base_collection_1.BaseCollection {
|
|
|
33
33
|
return;
|
|
34
34
|
}
|
|
35
35
|
// Check first node for key match. If it matches, update the value.
|
|
36
|
-
if (
|
|
36
|
+
if (hash_utils_1.HashUtils.equals(this.table[index].key, key)) {
|
|
37
37
|
this.table[index].value = value;
|
|
38
38
|
return;
|
|
39
39
|
}
|
|
40
40
|
// Traverse chain to find key or last node. If it matches, update the value.
|
|
41
41
|
let current = this.table[index];
|
|
42
42
|
while (current?.next) {
|
|
43
|
-
if (
|
|
43
|
+
if (hash_utils_1.HashUtils.equals(current.next.key, key)) {
|
|
44
44
|
current.next.value = value;
|
|
45
45
|
return;
|
|
46
46
|
}
|
|
@@ -51,10 +51,10 @@ class HashTable extends base_collection_1.BaseCollection {
|
|
|
51
51
|
this.count++;
|
|
52
52
|
}
|
|
53
53
|
get(key) {
|
|
54
|
-
const index =
|
|
54
|
+
const index = hash_utils_1.HashUtils.hash(key, this.capacity);
|
|
55
55
|
let current = this.table[index];
|
|
56
56
|
while (current) {
|
|
57
|
-
if (
|
|
57
|
+
if (hash_utils_1.HashUtils.equals(current.key, key)) {
|
|
58
58
|
return current.value;
|
|
59
59
|
}
|
|
60
60
|
current = current.next;
|
|
@@ -62,11 +62,11 @@ class HashTable extends base_collection_1.BaseCollection {
|
|
|
62
62
|
return undefined;
|
|
63
63
|
}
|
|
64
64
|
remove(key) {
|
|
65
|
-
const index =
|
|
65
|
+
const index = hash_utils_1.HashUtils.hash(key, this.capacity);
|
|
66
66
|
let current = this.table[index];
|
|
67
67
|
let prev = null;
|
|
68
68
|
while (current) {
|
|
69
|
-
if (
|
|
69
|
+
if (hash_utils_1.HashUtils.equals(current.key, key)) {
|
|
70
70
|
if (prev) {
|
|
71
71
|
prev.next = current.next;
|
|
72
72
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hash-table.js","sourceRoot":"","sources":["../../lib/hash-table.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"hash-table.js","sourceRoot":"","sources":["../../lib/hash-table.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
class
|
|
3
|
+
exports.HashUtils = void 0;
|
|
4
|
+
class HashUtils {
|
|
5
5
|
static valueToString(value) {
|
|
6
6
|
if (value === null || value === undefined)
|
|
7
7
|
return 'null';
|
|
@@ -48,7 +48,7 @@ class HashTableUtils {
|
|
|
48
48
|
* DJB2a (variant using xor rather than +) hash algorithm.
|
|
49
49
|
* See: http://www.cse.yorku.ca/~oz/hash.html
|
|
50
50
|
*/
|
|
51
|
-
static
|
|
51
|
+
static djb2aHash(str) {
|
|
52
52
|
let hash = 5381;
|
|
53
53
|
for (let i = 0; i < str.length; i++) {
|
|
54
54
|
hash = ((hash << 5) + hash) ^ str.charCodeAt(i);
|
|
@@ -61,48 +61,55 @@ class HashTableUtils {
|
|
|
61
61
|
return key.hashCode();
|
|
62
62
|
}
|
|
63
63
|
if (typeof key === 'number' && Number.isSafeInteger(key)) {
|
|
64
|
-
return
|
|
64
|
+
return HashUtils.wangHash32(key) % capacity;
|
|
65
65
|
}
|
|
66
66
|
const stringKey = this.valueToString(key);
|
|
67
|
-
return
|
|
67
|
+
return HashUtils.djb2aHash(stringKey) % capacity;
|
|
68
68
|
}
|
|
69
|
-
static
|
|
70
|
-
if (key1 && key2 && typeof key1.equals === 'function') {
|
|
71
|
-
return key1.equals(key2);
|
|
72
|
-
}
|
|
69
|
+
static equals(key1, key2) {
|
|
73
70
|
if (key1 === key2)
|
|
74
71
|
return true;
|
|
75
|
-
if (
|
|
76
|
-
return
|
|
77
|
-
|
|
72
|
+
if (key1 == null || key2 == null)
|
|
73
|
+
return key1 === key2;
|
|
74
|
+
// Check for custom equals method
|
|
75
|
+
if (typeof key1.equals === 'function') {
|
|
76
|
+
return key1.equals(key2);
|
|
77
|
+
}
|
|
78
|
+
const type1 = typeof key1;
|
|
79
|
+
const type2 = typeof key2;
|
|
80
|
+
// Handle primitives
|
|
81
|
+
if (type1 !== 'object' && type2 !== 'object') {
|
|
82
|
+
if (type1 === 'number' && type2 === 'number') {
|
|
83
|
+
return key1 === key2 || (isNaN(key1) && isNaN(key2));
|
|
84
|
+
}
|
|
78
85
|
return key1 === key2;
|
|
79
|
-
if (key1 instanceof Date && key2 instanceof Date) {
|
|
80
|
-
// Handle invalid dates
|
|
81
|
-
if (isNaN(key1.getTime()) && isNaN(key2.getTime()))
|
|
82
|
-
return true;
|
|
83
|
-
return key1.getTime() === key2.getTime();
|
|
84
86
|
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
+
// Handle special object types
|
|
88
|
+
if (key1 instanceof Date) {
|
|
89
|
+
return key2 instanceof Date &&
|
|
90
|
+
(key1.getTime() === key2.getTime() || (isNaN(key1.getTime()) && isNaN(key2.getTime())));
|
|
87
91
|
}
|
|
88
|
-
if (
|
|
89
|
-
return key1.
|
|
90
|
-
key1.every((val, idx) => HashTableUtils.keysEqual(val, key2[idx]));
|
|
92
|
+
if (key1 instanceof RegExp) {
|
|
93
|
+
return key2 instanceof RegExp && key1.toString() === key2.toString();
|
|
91
94
|
}
|
|
92
|
-
if (key1
|
|
95
|
+
if (Array.isArray(key1)) {
|
|
96
|
+
if (!Array.isArray(key2) || key1.length !== key2.length)
|
|
97
|
+
return false;
|
|
98
|
+
for (let i = 0; i < key1.length; i++) {
|
|
99
|
+
if (!HashUtils.equals(key1[i], key2[i]))
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
93
102
|
return true;
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
if (key1 === null || key1 === undefined || key2 === null || key2 === undefined)
|
|
97
|
-
return false;
|
|
103
|
+
}
|
|
104
|
+
// Handle plain objects
|
|
98
105
|
if (typeof key1 === 'object' && typeof key2 === 'object') {
|
|
99
106
|
const keys1 = Object.keys(key1);
|
|
100
107
|
const keys2 = Object.keys(key2);
|
|
101
108
|
return keys1.length === keys2.length &&
|
|
102
|
-
keys1.every(k => k in key2 &&
|
|
109
|
+
keys1.every(k => k in key2 && HashUtils.equals(key1[k], key2[k]));
|
|
103
110
|
}
|
|
104
111
|
return false;
|
|
105
112
|
}
|
|
106
113
|
}
|
|
107
|
-
exports.
|
|
108
|
-
//# sourceMappingURL=hash-
|
|
114
|
+
exports.HashUtils = HashUtils;
|
|
115
|
+
//# sourceMappingURL=hash-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hash-utils.js","sourceRoot":"","sources":["../../lib/hash-utils.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/set.d.ts
CHANGED
|
@@ -1,25 +1,27 @@
|
|
|
1
|
-
import { Comparator } from '../types';
|
|
2
1
|
import { BaseCollection } from './base-collection';
|
|
3
2
|
export interface Set<T> {
|
|
4
3
|
insert(element: T): void;
|
|
5
4
|
insertList(elements: T[]): void;
|
|
6
|
-
remove(element: T):
|
|
5
|
+
remove(element: T): boolean;
|
|
7
6
|
find(element: T): boolean;
|
|
7
|
+
has(element: T): boolean;
|
|
8
8
|
forEach(callback: (element: T) => void): void;
|
|
9
9
|
}
|
|
10
10
|
export declare class Set<T> extends BaseCollection<T> implements Set<T> {
|
|
11
|
-
private
|
|
12
|
-
|
|
11
|
+
private table;
|
|
12
|
+
private count;
|
|
13
|
+
private readonly capacity;
|
|
14
|
+
constructor(capacity?: number);
|
|
13
15
|
/**
|
|
14
|
-
* Removes all elements from the set
|
|
16
|
+
* Removes all elements from the set.
|
|
15
17
|
*/
|
|
16
18
|
clear(): void;
|
|
17
19
|
/**
|
|
18
|
-
* Returns true if the set contains no elements
|
|
20
|
+
* Returns true if the set contains no elements.
|
|
19
21
|
*/
|
|
20
22
|
isEmpty(): boolean;
|
|
21
23
|
/**
|
|
22
|
-
* Returns the number of elements in the set
|
|
24
|
+
* Returns the number of elements in the set.
|
|
23
25
|
*/
|
|
24
26
|
size(): number;
|
|
25
27
|
}
|
package/dist/lib/set.js
CHANGED
|
@@ -1,24 +1,55 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Set = void 0;
|
|
4
|
-
const binary_search_tree_1 = require("./binary-search-tree");
|
|
5
4
|
const base_collection_1 = require("./base-collection");
|
|
5
|
+
const hash_utils_1 = require("./hash-utils");
|
|
6
|
+
class Node {
|
|
7
|
+
value;
|
|
8
|
+
next;
|
|
9
|
+
constructor(value) {
|
|
10
|
+
this.value = value;
|
|
11
|
+
this.next = null;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
6
14
|
class Set extends base_collection_1.BaseCollection {
|
|
7
|
-
|
|
8
|
-
|
|
15
|
+
table;
|
|
16
|
+
count;
|
|
17
|
+
capacity;
|
|
18
|
+
constructor(capacity = 81920) {
|
|
9
19
|
super();
|
|
10
|
-
this.
|
|
20
|
+
this.capacity = capacity <= 0 ? 81920 : capacity;
|
|
21
|
+
this.table = new Array(this.capacity).fill(null);
|
|
22
|
+
this.count = 0;
|
|
11
23
|
}
|
|
12
24
|
/**
|
|
13
|
-
* Adds a value to the set if it's not already present
|
|
25
|
+
* Adds a value to the set if it's not already present.
|
|
26
|
+
*
|
|
27
|
+
* TODO: Dinamically resize the table if the collision factor is too high.
|
|
14
28
|
*/
|
|
15
29
|
insert(value) {
|
|
16
|
-
|
|
17
|
-
|
|
30
|
+
const index = hash_utils_1.HashUtils.hash(value, this.capacity);
|
|
31
|
+
// Handle empty bucket case.
|
|
32
|
+
if (!this.table[index]) {
|
|
33
|
+
this.table[index] = new Node(value);
|
|
34
|
+
this.count++;
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
// Check first node for value match. If it matches, do nothing.
|
|
38
|
+
if (hash_utils_1.HashUtils.equals(this.table[index].value, value))
|
|
39
|
+
return;
|
|
40
|
+
// Traverse chain to find value or last node. If it matches, do nothing.
|
|
41
|
+
let current = this.table[index];
|
|
42
|
+
while (current?.next) {
|
|
43
|
+
if (hash_utils_1.HashUtils.equals(current.next.value, value))
|
|
44
|
+
return;
|
|
45
|
+
current = current.next;
|
|
18
46
|
}
|
|
47
|
+
// Value not found, append new node.
|
|
48
|
+
current.next = new Node(value);
|
|
49
|
+
this.count++;
|
|
19
50
|
}
|
|
20
51
|
/**
|
|
21
|
-
* Adds multiple values to the set if they're not already present
|
|
52
|
+
* Adds multiple values to the set if they're not already present.
|
|
22
53
|
*/
|
|
23
54
|
insertList(values) {
|
|
24
55
|
for (const value of values) {
|
|
@@ -26,40 +57,76 @@ class Set extends base_collection_1.BaseCollection {
|
|
|
26
57
|
}
|
|
27
58
|
}
|
|
28
59
|
/**
|
|
29
|
-
* Checks if a value exists in the set
|
|
60
|
+
* Checks if a value exists in the set.
|
|
30
61
|
*/
|
|
31
62
|
find(value) {
|
|
32
|
-
|
|
63
|
+
const index = hash_utils_1.HashUtils.hash(value, this.capacity);
|
|
64
|
+
let current = this.table[index];
|
|
65
|
+
while (current) {
|
|
66
|
+
if (hash_utils_1.HashUtils.equals(current.value, value))
|
|
67
|
+
return true;
|
|
68
|
+
current = current.next;
|
|
69
|
+
}
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
has(value) {
|
|
73
|
+
return this.find(value);
|
|
33
74
|
}
|
|
34
75
|
/**
|
|
35
|
-
* Removes a value from the set
|
|
76
|
+
* Removes a value from the set.
|
|
36
77
|
*/
|
|
37
78
|
remove(value) {
|
|
38
|
-
|
|
79
|
+
const index = hash_utils_1.HashUtils.hash(value, this.capacity);
|
|
80
|
+
// Handle empty bucket case
|
|
81
|
+
if (!this.table[index])
|
|
82
|
+
return false;
|
|
83
|
+
// Handle first node case
|
|
84
|
+
if (hash_utils_1.HashUtils.equals(this.table[index].value, value)) {
|
|
85
|
+
this.table[index] = this.table[index].next;
|
|
86
|
+
this.count--;
|
|
87
|
+
return true;
|
|
88
|
+
}
|
|
89
|
+
// Handle remaining nodes
|
|
90
|
+
let current = this.table[index].next;
|
|
91
|
+
let prev = this.table[index];
|
|
92
|
+
while (current) {
|
|
93
|
+
if (hash_utils_1.HashUtils.equals(current.value, value)) {
|
|
94
|
+
prev.next = current.next;
|
|
95
|
+
this.count--;
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
prev = current;
|
|
99
|
+
current = current.next;
|
|
100
|
+
}
|
|
101
|
+
return false;
|
|
39
102
|
}
|
|
40
|
-
/**
|
|
41
|
-
* Executes a callback function for each element in the set
|
|
42
|
-
*/
|
|
43
103
|
forEach(callback) {
|
|
44
|
-
this.
|
|
104
|
+
for (const node of this.table) {
|
|
105
|
+
let current = node;
|
|
106
|
+
while (current) {
|
|
107
|
+
callback(current.value);
|
|
108
|
+
current = current.next;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
45
111
|
}
|
|
46
112
|
/**
|
|
47
|
-
* Removes all elements from the set
|
|
113
|
+
* Removes all elements from the set.
|
|
48
114
|
*/
|
|
49
115
|
clear() {
|
|
50
|
-
this.
|
|
116
|
+
this.table = new Array(this.capacity).fill(null);
|
|
117
|
+
this.count = 0;
|
|
51
118
|
}
|
|
52
119
|
/**
|
|
53
|
-
* Returns true if the set contains no elements
|
|
120
|
+
* Returns true if the set contains no elements.
|
|
54
121
|
*/
|
|
55
122
|
isEmpty() {
|
|
56
|
-
return this.
|
|
123
|
+
return this.count === 0;
|
|
57
124
|
}
|
|
58
125
|
/**
|
|
59
|
-
* Returns the number of elements in the set
|
|
126
|
+
* Returns the number of elements in the set.
|
|
60
127
|
*/
|
|
61
128
|
size() {
|
|
62
|
-
return this.
|
|
129
|
+
return this.count;
|
|
63
130
|
}
|
|
64
131
|
}
|
|
65
132
|
exports.Set = Set;
|
package/dist/lib/set.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"set.js","sourceRoot":"","sources":["../../lib/set.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"set.js","sourceRoot":"","sources":["../../lib/set.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hash-table-utils.js","sourceRoot":"","sources":["../../lib/hash-table-utils.ts"],"names":[],"mappings":"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"}
|