typescript-ds-lib 0.3.1 → 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 +10 -8
- package/dist/index.d.ts +1 -0
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/base-collection.d.ts +14 -0
- package/dist/lib/base-collection.js +7 -0
- package/dist/lib/base-collection.js.map +1 -0
- package/dist/lib/binary-search-tree.d.ts +14 -3
- package/dist/lib/binary-search-tree.js +11 -2
- package/dist/lib/binary-search-tree.js.map +1 -1
- package/dist/lib/deque.d.ts +14 -4
- package/dist/lib/deque.js +3 -1
- package/dist/lib/deque.js.map +1 -1
- package/dist/lib/hash-table.d.ts +6 -4
- package/dist/lib/hash-table.js +21 -10
- 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/heap.d.ts +32 -0
- package/dist/lib/heap.js +101 -0
- package/dist/lib/heap.js.map +1 -0
- package/dist/lib/linked-list.d.ts +14 -4
- package/dist/lib/linked-list.js +5 -3
- package/dist/lib/linked-list.js.map +1 -1
- package/dist/lib/map.d.ts +5 -4
- package/dist/lib/map.js +3 -1
- package/dist/lib/map.js.map +1 -1
- package/dist/lib/matrix.d.ts +14 -4
- package/dist/lib/matrix.js +3 -1
- package/dist/lib/matrix.js.map +1 -1
- package/dist/lib/priority-queue.d.ts +15 -4
- package/dist/lib/priority-queue.js +14 -20
- package/dist/lib/priority-queue.js.map +1 -1
- package/dist/lib/queue.d.ts +14 -4
- package/dist/lib/queue.js +3 -1
- package/dist/lib/queue.js.map +1 -1
- package/dist/lib/red-black-tree.d.ts +5 -4
- package/dist/lib/red-black-tree.js +5 -3
- package/dist/lib/red-black-tree.js.map +1 -1
- package/dist/lib/set.d.ts +19 -7
- package/dist/lib/set.js +92 -23
- package/dist/lib/set.js.map +1 -1
- package/dist/lib/stack.d.ts +14 -4
- package/dist/lib/stack.js +12 -9
- package/dist/lib/stack.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
|
@@ -9,6 +9,7 @@ TypeScript data structure implementations without external dependencies. Why to
|
|
|
9
9
|
- Lightweight
|
|
10
10
|
- Comes with Comparator (for custom types)
|
|
11
11
|
- `hashCode()` and `equals()` are supported
|
|
12
|
+
- Well documented
|
|
12
13
|
|
|
13
14
|
|
|
14
15
|
## Install
|
|
@@ -39,20 +40,21 @@ See the [documentation](https://github.com/baloian/typescript-ds-lib/blob/master
|
|
|
39
40
|
|
|
40
41
|
|
|
41
42
|
## Data Structures
|
|
42
|
-
- Stack
|
|
43
|
-
- Queue
|
|
44
|
-
- Priority Queue
|
|
45
|
-
- Linked List
|
|
46
43
|
- Binary Search Tree
|
|
47
|
-
- Red-Black Tree
|
|
48
44
|
- Deque
|
|
49
|
-
- Set
|
|
50
|
-
- Map
|
|
51
45
|
- Hash Table (unordered map)
|
|
46
|
+
- Heap
|
|
47
|
+
- Linked List
|
|
48
|
+
- Map
|
|
52
49
|
- Matrix
|
|
50
|
+
- Priority Queue
|
|
51
|
+
- Queue
|
|
52
|
+
- Red-Black Tree
|
|
53
|
+
- Set
|
|
54
|
+
- Stack
|
|
53
55
|
- Graph (coming soon)
|
|
54
56
|
|
|
55
|
-
**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.
|
|
56
58
|
|
|
57
59
|
## Contributions
|
|
58
60
|
Contributions are welcome and can be made by submitting GitHub pull requests
|
package/dist/index.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ export * from './types';
|
|
|
2
2
|
export { BinarySearchTree } from './lib/binary-search-tree';
|
|
3
3
|
export { Deque } from './lib/deque';
|
|
4
4
|
export { HashTable } from './lib/hash-table';
|
|
5
|
+
export { Heap } from './lib/heap';
|
|
5
6
|
export { LinkedList } from './lib/linked-list';
|
|
6
7
|
export { Map } from './lib/map';
|
|
7
8
|
export { Matrix } from './lib/matrix';
|
package/dist/index.js
CHANGED
|
@@ -14,7 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.Stack = exports.Set = exports.RedBlackTree = exports.Queue = exports.PriorityQueue = exports.Matrix = exports.Map = exports.LinkedList = exports.HashTable = exports.Deque = exports.BinarySearchTree = void 0;
|
|
17
|
+
exports.Stack = exports.Set = exports.RedBlackTree = exports.Queue = exports.PriorityQueue = exports.Matrix = exports.Map = exports.LinkedList = exports.Heap = exports.HashTable = exports.Deque = exports.BinarySearchTree = void 0;
|
|
18
18
|
__exportStar(require("./types"), exports);
|
|
19
19
|
var binary_search_tree_1 = require("./lib/binary-search-tree");
|
|
20
20
|
Object.defineProperty(exports, "BinarySearchTree", { enumerable: true, get: function () { return binary_search_tree_1.BinarySearchTree; } });
|
|
@@ -22,6 +22,8 @@ var deque_1 = require("./lib/deque");
|
|
|
22
22
|
Object.defineProperty(exports, "Deque", { enumerable: true, get: function () { return deque_1.Deque; } });
|
|
23
23
|
var hash_table_1 = require("./lib/hash-table");
|
|
24
24
|
Object.defineProperty(exports, "HashTable", { enumerable: true, get: function () { return hash_table_1.HashTable; } });
|
|
25
|
+
var heap_1 = require("./lib/heap");
|
|
26
|
+
Object.defineProperty(exports, "Heap", { enumerable: true, get: function () { return heap_1.Heap; } });
|
|
25
27
|
var linked_list_1 = require("./lib/linked-list");
|
|
26
28
|
Object.defineProperty(exports, "LinkedList", { enumerable: true, get: function () { return linked_list_1.LinkedList; } });
|
|
27
29
|
var map_1 = require("./lib/map");
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,0CAAwB;AACxB,+DAA4D;AAAnD,sHAAA,gBAAgB,OAAA;AACzB,qCAAoC;AAA3B,8FAAA,KAAK,OAAA;AACd,+CAA6C;AAApC,uGAAA,SAAS,OAAA;AAClB,iDAA+C;AAAtC,yGAAA,UAAU,OAAA;AACnB,iCAAgC;AAAvB,0FAAA,GAAG,OAAA;AACZ,uCAAsC;AAA7B,gGAAA,MAAM,OAAA;AACf,uDAAqD;AAA5C,+GAAA,aAAa,OAAA;AACtB,qCAAoC;AAA3B,8FAAA,KAAK,OAAA;AACd,uDAAoD;AAA3C,8GAAA,YAAY,OAAA;AACrB,iCAAgC;AAAvB,0FAAA,GAAG,OAAA;AACZ,qCAAoC;AAA3B,8FAAA,KAAK,OAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,0CAAwB;AACxB,+DAA4D;AAAnD,sHAAA,gBAAgB,OAAA;AACzB,qCAAoC;AAA3B,8FAAA,KAAK,OAAA;AACd,+CAA6C;AAApC,uGAAA,SAAS,OAAA;AAClB,mCAAkC;AAAzB,4FAAA,IAAI,OAAA;AACb,iDAA+C;AAAtC,yGAAA,UAAU,OAAA;AACnB,iCAAgC;AAAvB,0FAAA,GAAG,OAAA;AACZ,uCAAsC;AAA7B,gGAAA,MAAM,OAAA;AACf,uDAAqD;AAA5C,+GAAA,aAAa,OAAA;AACtB,qCAAoC;AAA3B,8FAAA,KAAK,OAAA;AACd,uDAAoD;AAA3C,8GAAA,YAAY,OAAA;AACrB,iCAAgC;AAAvB,0FAAA,GAAG,OAAA;AACZ,qCAAoC;AAA3B,8FAAA,KAAK,OAAA"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare abstract class BaseCollection<T> {
|
|
2
|
+
/**
|
|
3
|
+
* Checks if the collection is empty. Returns true if the collection is empty, false otherwise.
|
|
4
|
+
*/
|
|
5
|
+
abstract isEmpty(): boolean;
|
|
6
|
+
/**
|
|
7
|
+
* Returns the number of elements in the collection.
|
|
8
|
+
*/
|
|
9
|
+
abstract size(): number;
|
|
10
|
+
/**
|
|
11
|
+
* Removes all elements from the collection.
|
|
12
|
+
*/
|
|
13
|
+
abstract clear(): void;
|
|
14
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-collection.js","sourceRoot":"","sources":["../../lib/base-collection.ts"],"names":[],"mappings":";;;AAAA,MAAsB,cAAc;CAenC;AAfD,wCAeC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Comparator } from '../types';
|
|
2
|
+
import { BaseCollection } from './base-collection';
|
|
2
3
|
export interface BinarySearchTree<T> {
|
|
3
4
|
insert(element: T): void;
|
|
4
5
|
remove(element: T): void;
|
|
@@ -6,11 +7,9 @@ export interface BinarySearchTree<T> {
|
|
|
6
7
|
min(): T | undefined;
|
|
7
8
|
max(): T | undefined;
|
|
8
9
|
forEach(callback: (element: T) => void, traversal?: 'inorder' | 'preorder' | 'postorder'): void;
|
|
9
|
-
isEmpty(): boolean;
|
|
10
|
-
clear(): void;
|
|
11
10
|
count(): number;
|
|
12
11
|
}
|
|
13
|
-
export declare class BinarySearchTree<T> implements BinarySearchTree<T> {
|
|
12
|
+
export declare class BinarySearchTree<T> extends BaseCollection<T> implements BinarySearchTree<T> {
|
|
14
13
|
private root;
|
|
15
14
|
private comparator;
|
|
16
15
|
constructor(comparator?: Comparator<T>);
|
|
@@ -20,5 +19,17 @@ export declare class BinarySearchTree<T> implements BinarySearchTree<T> {
|
|
|
20
19
|
private inorderTraversal;
|
|
21
20
|
private preorderTraversal;
|
|
22
21
|
private postorderTraversal;
|
|
22
|
+
/**
|
|
23
|
+
* Returns true if the BST is empty, false otherwise
|
|
24
|
+
*/
|
|
25
|
+
isEmpty(): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Removes all nodes from the BST
|
|
28
|
+
*/
|
|
29
|
+
clear(): void;
|
|
30
|
+
/**
|
|
31
|
+
* Returns the number of nodes in the BST.
|
|
32
|
+
*/
|
|
33
|
+
size(): number;
|
|
23
34
|
private countNodes;
|
|
24
35
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.BinarySearchTree = void 0;
|
|
4
|
+
const base_collection_1 = require("./base-collection");
|
|
4
5
|
class TreeNode {
|
|
5
6
|
value;
|
|
6
7
|
left;
|
|
@@ -11,10 +12,11 @@ class TreeNode {
|
|
|
11
12
|
this.right = null;
|
|
12
13
|
}
|
|
13
14
|
}
|
|
14
|
-
class BinarySearchTree {
|
|
15
|
+
class BinarySearchTree extends base_collection_1.BaseCollection {
|
|
15
16
|
root;
|
|
16
17
|
comparator;
|
|
17
18
|
constructor(comparator = (a, b) => a < b) {
|
|
19
|
+
super();
|
|
18
20
|
this.root = null;
|
|
19
21
|
this.comparator = comparator;
|
|
20
22
|
}
|
|
@@ -185,7 +187,14 @@ class BinarySearchTree {
|
|
|
185
187
|
this.root = null;
|
|
186
188
|
}
|
|
187
189
|
/**
|
|
188
|
-
* Returns the number of nodes in the BST
|
|
190
|
+
* Returns the number of nodes in the BST.
|
|
191
|
+
*/
|
|
192
|
+
size() {
|
|
193
|
+
return this.countNodes(this.root);
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Returns the number of nodes in the BST.
|
|
197
|
+
* TODO: I should remove this method and use size() instead.
|
|
189
198
|
*/
|
|
190
199
|
count() {
|
|
191
200
|
return this.countNodes(this.root);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"binary-search-tree.js","sourceRoot":"","sources":["../../lib/binary-search-tree.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"binary-search-tree.js","sourceRoot":"","sources":["../../lib/binary-search-tree.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/deque.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { BaseCollection } from './base-collection';
|
|
1
2
|
export interface Deque<T> {
|
|
2
3
|
pushFront(element: T): void;
|
|
3
4
|
pushBack(element: T): void;
|
|
@@ -5,11 +6,20 @@ export interface Deque<T> {
|
|
|
5
6
|
popBack(): T | undefined;
|
|
6
7
|
front(): T | undefined;
|
|
7
8
|
back(): T | undefined;
|
|
8
|
-
isEmpty(): boolean;
|
|
9
|
-
size(): number;
|
|
10
|
-
clear(): void;
|
|
11
9
|
}
|
|
12
|
-
export declare class Deque<T> implements Deque<T> {
|
|
10
|
+
export declare class Deque<T> extends BaseCollection<T> implements Deque<T> {
|
|
13
11
|
private items;
|
|
14
12
|
constructor();
|
|
13
|
+
/**
|
|
14
|
+
* Returns true if the deque is empty, false otherwise
|
|
15
|
+
*/
|
|
16
|
+
isEmpty(): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Returns the number of elements in the deque
|
|
19
|
+
*/
|
|
20
|
+
size(): number;
|
|
21
|
+
/**
|
|
22
|
+
* Removes all elements from the deque
|
|
23
|
+
*/
|
|
24
|
+
clear(): void;
|
|
15
25
|
}
|
package/dist/lib/deque.js
CHANGED
|
@@ -2,9 +2,11 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Deque = void 0;
|
|
4
4
|
const linked_list_1 = require("./linked-list");
|
|
5
|
-
|
|
5
|
+
const base_collection_1 = require("./base-collection");
|
|
6
|
+
class Deque extends base_collection_1.BaseCollection {
|
|
6
7
|
items;
|
|
7
8
|
constructor() {
|
|
9
|
+
super();
|
|
8
10
|
this.items = new linked_list_1.LinkedList();
|
|
9
11
|
}
|
|
10
12
|
/**
|
package/dist/lib/deque.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deque.js","sourceRoot":"","sources":["../../lib/deque.ts"],"names":[],"mappings":";;;AAAA,+CAA2C;
|
|
1
|
+
{"version":3,"file":"deque.js","sourceRoot":"","sources":["../../lib/deque.ts"],"names":[],"mappings":";;;AAAA,+CAA2C;AAC3C,uDAAmD;AAanD,MAAa,KAAS,SAAQ,gCAAiB;IACrC,KAAK,CAAgB;IAE7B;QACE,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,KAAK,GAAG,IAAI,wBAAU,EAAK,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,OAAU;QAClB,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,OAAU;QACjB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,OAAO;QACL,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,KAAK;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,IAAI;QACF,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED;;OAEG;IACH,OAAO;QACL,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,IAAI;QACF,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;CACF;AAtED,sBAsEC"}
|
package/dist/lib/hash-table.d.ts
CHANGED
|
@@ -1,14 +1,16 @@
|
|
|
1
|
+
import { BaseCollection } from './base-collection';
|
|
1
2
|
export interface HashTable<K, V> {
|
|
2
3
|
insert(key: K, value: V): void;
|
|
3
4
|
get(key: K): V | undefined;
|
|
4
5
|
remove(key: K): boolean;
|
|
5
|
-
|
|
6
|
-
isEmpty(): boolean;
|
|
7
|
-
clear(): void;
|
|
6
|
+
forEach(callback: (key: K, value: V) => void): void;
|
|
8
7
|
}
|
|
9
|
-
export declare class HashTable<K, V> implements HashTable<K, V> {
|
|
8
|
+
export declare class HashTable<K, V> extends BaseCollection<V> implements HashTable<K, V> {
|
|
10
9
|
private table;
|
|
11
10
|
private count;
|
|
12
11
|
private readonly capacity;
|
|
13
12
|
constructor(capacity?: number);
|
|
13
|
+
size(): number;
|
|
14
|
+
isEmpty(): boolean;
|
|
15
|
+
clear(): void;
|
|
14
16
|
}
|
package/dist/lib/hash-table.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
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
|
+
const base_collection_1 = require("./base-collection");
|
|
5
6
|
class HashNode {
|
|
6
7
|
key;
|
|
7
8
|
value;
|
|
@@ -12,18 +13,19 @@ class HashNode {
|
|
|
12
13
|
this.next = null;
|
|
13
14
|
}
|
|
14
15
|
}
|
|
15
|
-
class HashTable {
|
|
16
|
+
class HashTable extends base_collection_1.BaseCollection {
|
|
16
17
|
table;
|
|
17
18
|
count;
|
|
18
19
|
capacity;
|
|
19
20
|
constructor(capacity = 4096) {
|
|
21
|
+
super();
|
|
20
22
|
// Handle negative or zero capacity by using default capacity
|
|
21
23
|
this.capacity = capacity <= 0 ? 4096 : capacity;
|
|
22
24
|
this.table = new Array(this.capacity).fill(null);
|
|
23
25
|
this.count = 0;
|
|
24
26
|
}
|
|
25
27
|
insert(key, value) {
|
|
26
|
-
const index =
|
|
28
|
+
const index = hash_utils_1.HashUtils.hash(key, this.capacity);
|
|
27
29
|
// Handle empty bucket case.
|
|
28
30
|
if (!this.table[index]) {
|
|
29
31
|
this.table[index] = new HashNode(key, value);
|
|
@@ -31,14 +33,14 @@ class HashTable {
|
|
|
31
33
|
return;
|
|
32
34
|
}
|
|
33
35
|
// Check first node for key match. If it matches, update the value.
|
|
34
|
-
if (
|
|
36
|
+
if (hash_utils_1.HashUtils.equals(this.table[index].key, key)) {
|
|
35
37
|
this.table[index].value = value;
|
|
36
38
|
return;
|
|
37
39
|
}
|
|
38
40
|
// Traverse chain to find key or last node. If it matches, update the value.
|
|
39
41
|
let current = this.table[index];
|
|
40
|
-
while (current
|
|
41
|
-
if (
|
|
42
|
+
while (current?.next) {
|
|
43
|
+
if (hash_utils_1.HashUtils.equals(current.next.key, key)) {
|
|
42
44
|
current.next.value = value;
|
|
43
45
|
return;
|
|
44
46
|
}
|
|
@@ -49,10 +51,10 @@ class HashTable {
|
|
|
49
51
|
this.count++;
|
|
50
52
|
}
|
|
51
53
|
get(key) {
|
|
52
|
-
const index =
|
|
54
|
+
const index = hash_utils_1.HashUtils.hash(key, this.capacity);
|
|
53
55
|
let current = this.table[index];
|
|
54
56
|
while (current) {
|
|
55
|
-
if (
|
|
57
|
+
if (hash_utils_1.HashUtils.equals(current.key, key)) {
|
|
56
58
|
return current.value;
|
|
57
59
|
}
|
|
58
60
|
current = current.next;
|
|
@@ -60,11 +62,11 @@ class HashTable {
|
|
|
60
62
|
return undefined;
|
|
61
63
|
}
|
|
62
64
|
remove(key) {
|
|
63
|
-
const index =
|
|
65
|
+
const index = hash_utils_1.HashUtils.hash(key, this.capacity);
|
|
64
66
|
let current = this.table[index];
|
|
65
67
|
let prev = null;
|
|
66
68
|
while (current) {
|
|
67
|
-
if (
|
|
69
|
+
if (hash_utils_1.HashUtils.equals(current.key, key)) {
|
|
68
70
|
if (prev) {
|
|
69
71
|
prev.next = current.next;
|
|
70
72
|
}
|
|
@@ -79,6 +81,15 @@ class HashTable {
|
|
|
79
81
|
}
|
|
80
82
|
return false;
|
|
81
83
|
}
|
|
84
|
+
forEach(callback) {
|
|
85
|
+
for (const node of this.table) {
|
|
86
|
+
let current = node;
|
|
87
|
+
while (current) {
|
|
88
|
+
callback(current.key, current.value);
|
|
89
|
+
current = current.next;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
82
93
|
size() {
|
|
83
94
|
return this.count;
|
|
84
95
|
}
|
|
@@ -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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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Comparator } from '../types';
|
|
2
|
+
import { BaseCollection } from './base-collection';
|
|
3
|
+
export interface Heap<T> {
|
|
4
|
+
push(element: T): void;
|
|
5
|
+
pop(): T | undefined;
|
|
6
|
+
top(): T | undefined;
|
|
7
|
+
}
|
|
8
|
+
export declare class Heap<T> extends BaseCollection<T> implements Heap<T> {
|
|
9
|
+
private items;
|
|
10
|
+
private comparator;
|
|
11
|
+
constructor(comparator?: Comparator<T>);
|
|
12
|
+
/**
|
|
13
|
+
* Checks if the heap is empty. Returns true if empty, false otherwise.
|
|
14
|
+
*/
|
|
15
|
+
isEmpty(): boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Returns the number of elements in the heap.
|
|
18
|
+
*/
|
|
19
|
+
size(): number;
|
|
20
|
+
/**
|
|
21
|
+
* Removes all elements from the heap.
|
|
22
|
+
*/
|
|
23
|
+
clear(): void;
|
|
24
|
+
/**
|
|
25
|
+
* Moves an element up the heap to its correct position.
|
|
26
|
+
*/
|
|
27
|
+
private heapifyUp;
|
|
28
|
+
/**
|
|
29
|
+
* Moves an element down the heap to its correct position.
|
|
30
|
+
*/
|
|
31
|
+
private heapifyDown;
|
|
32
|
+
}
|
package/dist/lib/heap.js
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Heap = void 0;
|
|
4
|
+
const base_collection_1 = require("./base-collection");
|
|
5
|
+
class Heap extends base_collection_1.BaseCollection {
|
|
6
|
+
items;
|
|
7
|
+
comparator;
|
|
8
|
+
constructor(comparator = (a, b) => a < b) {
|
|
9
|
+
super();
|
|
10
|
+
this.items = [];
|
|
11
|
+
this.comparator = comparator;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Adds an element to the heap.
|
|
15
|
+
*/
|
|
16
|
+
push(element) {
|
|
17
|
+
this.items.push(element);
|
|
18
|
+
this.heapifyUp(this.items.length - 1);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Removes and returns the root element from the heap, or undefined if heap is empty.
|
|
22
|
+
*/
|
|
23
|
+
pop() {
|
|
24
|
+
if (this.isEmpty()) {
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
const root = this.items[0];
|
|
28
|
+
const lastElement = this.items.pop();
|
|
29
|
+
if (!this.isEmpty()) {
|
|
30
|
+
this.items[0] = lastElement;
|
|
31
|
+
this.heapifyDown(0);
|
|
32
|
+
}
|
|
33
|
+
return root;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Returns the root element without removing it, or undefined if heap is empty.
|
|
37
|
+
*/
|
|
38
|
+
top() {
|
|
39
|
+
return this.items[0];
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Checks if the heap is empty. Returns true if empty, false otherwise.
|
|
43
|
+
*/
|
|
44
|
+
isEmpty() {
|
|
45
|
+
return this.items.length === 0;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Returns the number of elements in the heap.
|
|
49
|
+
*/
|
|
50
|
+
size() {
|
|
51
|
+
return this.items.length;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Removes all elements from the heap.
|
|
55
|
+
*/
|
|
56
|
+
clear() {
|
|
57
|
+
this.items = [];
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Moves an element up the heap to its correct position.
|
|
61
|
+
*/
|
|
62
|
+
heapifyUp(index) {
|
|
63
|
+
while (index > 0) {
|
|
64
|
+
const parentIndex = Math.floor((index - 1) / 2);
|
|
65
|
+
if (this.comparator(this.items[index], this.items[parentIndex])) {
|
|
66
|
+
[this.items[index], this.items[parentIndex]] =
|
|
67
|
+
[this.items[parentIndex], this.items[index]];
|
|
68
|
+
index = parentIndex;
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Moves an element down the heap to its correct position.
|
|
77
|
+
*/
|
|
78
|
+
heapifyDown(index) {
|
|
79
|
+
while (true) {
|
|
80
|
+
let smallestIndex = index;
|
|
81
|
+
const leftChild = 2 * index + 1;
|
|
82
|
+
const rightChild = 2 * index + 2;
|
|
83
|
+
if (leftChild < this.items.length &&
|
|
84
|
+
this.comparator(this.items[leftChild], this.items[smallestIndex])) {
|
|
85
|
+
smallestIndex = leftChild;
|
|
86
|
+
}
|
|
87
|
+
if (rightChild < this.items.length &&
|
|
88
|
+
this.comparator(this.items[rightChild], this.items[smallestIndex])) {
|
|
89
|
+
smallestIndex = rightChild;
|
|
90
|
+
}
|
|
91
|
+
if (smallestIndex === index) {
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
[this.items[index], this.items[smallestIndex]] =
|
|
95
|
+
[this.items[smallestIndex], this.items[index]];
|
|
96
|
+
index = smallestIndex;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
exports.Heap = Heap;
|
|
101
|
+
//# sourceMappingURL=heap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heap.js","sourceRoot":"","sources":["../../lib/heap.ts"],"names":[],"mappings":"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"}
|