UNPKG

tree-multimap-typed

Version:
209 lines (208 loc) 9.74 kB
/** * data-structure-typed * * @author Pablo Zeng * @copyright Copyright (c) 2022 Pablo Zeng <zrwusa@gmail.com> * @license MIT License */ import type { BinaryTreeDeleteResult, BinaryTreeOptions, CRUD, EntryCallback, RBTNColor, RedBlackTreeOptions } from '../../types'; import { BST, BSTNode } from './bst'; import { IBinaryTree } from '../../interfaces'; export declare class RedBlackTreeNode<K = any, V = any> extends BSTNode<K, V> { parent?: RedBlackTreeNode<K, V>; /** * Create a Red-Black Tree and optionally bulk-insert items. * @remarks Time O(n log n), Space O(n) * @param key - See parameter type for details. * @param [value]- See parameter type for details. * @param color - See parameter type for details. * @returns New RedBlackTree instance. */ constructor(key: K, value?: V, color?: RBTNColor); _left?: RedBlackTreeNode<K, V> | null | undefined; /** * Get the left child pointer. * @remarks Time O(1), Space O(1) * @returns Left child node, or null/undefined. */ get left(): RedBlackTreeNode<K, V> | null | undefined; /** * Set the left child and update its parent pointer. * @remarks Time O(1), Space O(1) * @param v - New left node, or null/undefined. * @returns void */ set left(v: RedBlackTreeNode<K, V> | null | undefined); _right?: RedBlackTreeNode<K, V> | null | undefined; /** * Get the right child pointer. * @remarks Time O(1), Space O(1) * @returns Right child node, or null/undefined. */ get right(): RedBlackTreeNode<K, V> | null | undefined; /** * Set the right child and update its parent pointer. * @remarks Time O(1), Space O(1) * @param v - New right node, or null/undefined. * @returns void */ set right(v: RedBlackTreeNode<K, V> | null | undefined); } /** * RRRRed-Black Tree (self-balancing BST) supporting map-like mode and stable O(log n) updates. * @remarks Time O(1), Space O(1) * @template K * @template V * @template R * 1. Efficient self-balancing, but not completely balanced. Compared with AVLTree, the addition and deletion efficiency is high but the query efficiency is slightly lower. * 2. It is BST itself. Compared with Heap which is not completely ordered, RedBlackTree is completely ordered. * @example * // using Red-Black Tree as a price-based index for stock data * // Define the structure of individual stock records * interface StockRecord { * price: number; // Stock price (key for indexing) * symbol: string; // Stock ticker symbol * volume: number; // Trade volume * } * * // Simulate stock market data as it might come from an external feed * const marketStockData: StockRecord[] = [ * { price: 142.5, symbol: 'AAPL', volume: 1000000 }, * { price: 335.2, symbol: 'MSFT', volume: 800000 }, * { price: 3285.04, symbol: 'AMZN', volume: 500000 }, * { price: 267.98, symbol: 'META', volume: 750000 }, * { price: 234.57, symbol: 'GOOGL', volume: 900000 } * ]; * * // Extend the stock record type to include metadata for database usage * type StockTableRecord = StockRecord & { lastUpdated: Date }; * * // Create a Red-Black Tree to index stock records by price * // Simulates a database index with stock price as the key for quick lookups * const priceIndex = new RedBlackTree<number, StockTableRecord, StockRecord>(marketStockData, { * toEntryFn: stockRecord => [ * stockRecord.price, // Use stock price as the key * { * ...stockRecord, * lastUpdated: new Date() // Add a timestamp for when the record was indexed * } * ] * }); * * // Query the stock with the highest price * const highestPricedStock = priceIndex.getRightMost(); * console.log(priceIndex.get(highestPricedStock)?.symbol); // 'AMZN' // Amazon has the highest price * * // Query stocks within a specific price range (200 to 400) * const stocksInRange = priceIndex.rangeSearch( * [200, 400], // Price range * node => priceIndex.get(node)?.symbol // Extract stock symbols for the result * ); * console.log(stocksInRange); // ['GOOGL', 'META', 'MSFT'] */ export declare class RedBlackTree<K = any, V = any, R extends object = object> extends BST<K, V, R> implements IBinaryTree<K, V, R> { constructor(keysNodesEntriesOrRaws?: Iterable<K | RedBlackTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined | R>, options?: RedBlackTreeOptions<K, V, R>); protected _root: RedBlackTreeNode<K, V> | undefined; /** * Get the current root node. * @remarks Time O(1), Space O(1) * @returns Root node, or undefined. */ get root(): RedBlackTreeNode<K, V> | undefined; /** * Create a red-black node for the given key/value (value ignored in map mode). * @remarks Time O(1), Space O(1) * @param key - See parameter type for details. * @param [value] - See parameter type for details. * @param color - See parameter type for details. * @returns A new RedBlackTreeNode instance. */ _createNode(key: K, value?: V, color?: RBTNColor): RedBlackTreeNode<K, V>; /** * Type guard: check whether the input is a RedBlackTreeNode. * @remarks Time O(1), Space O(1) * @param keyNodeOrEntry - See parameter type for details. * @returns True if the value is a RedBlackTreeNode. */ isNode(keyNodeOrEntry: K | RedBlackTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined): keyNodeOrEntry is RedBlackTreeNode<K, V>; /** * Remove all nodes and clear the key→value store (if in map mode). * @remarks Time O(n), Space O(1) * @returns void */ clear(): void; /** * Insert or replace an entry using BST order and red-black fix-up. * @remarks Time O(log n), Space O(1) * @param keyNodeOrEntry - Key, node, or [key, value] entry to insert. * @param [value]- See parameter type for details. * @returns True if inserted or updated; false if ignored. */ add(keyNodeOrEntry: K | RedBlackTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined, value?: V): boolean; /** * Delete a node by key/node/entry and rebalance as needed. * @remarks Time O(log n), Space O(1) * @param keyNodeOrEntry - Key, node, or [key, value] entry identifying the node to delete. * @returns Array with deletion metadata (removed node, rebalancing hint if any). */ delete(keyNodeOrEntry: K | RedBlackTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined): BinaryTreeDeleteResult<RedBlackTreeNode<K, V>>[]; /** * Transform entries into a like-kind red-black tree with possibly different key/value types. * @remarks Time O(n), Space O(n) * @template MK * @template MV * @template MR * @param callback - Mapping function from (key, value, index, tree) to a new [key, value]. * @param [options] - See parameter type for details. * @param [thisArg] - See parameter type for details. * @returns A new RedBlackTree with mapped entries. */ map<MK = K, MV = V, MR extends object = object>(callback: EntryCallback<K, V | undefined, [MK, MV]>, options?: Partial<BinaryTreeOptions<MK, MV, MR>>, thisArg?: unknown): RedBlackTree<MK, MV, MR>; protected _createInstance<TK = K, TV = V, TR extends object = R>(options?: Partial<RedBlackTreeOptions<TK, TV, TR>>): this; protected _createLike<TK = K, TV = V, TR extends object = R>(iter?: Iterable<TK | RedBlackTreeNode<TK, TV> | [TK | null | undefined, TV | undefined] | null | undefined | TR>, options?: Partial<RedBlackTreeOptions<TK, TV, TR>>): RedBlackTree<TK, TV, TR>; protected _setRoot(v: RedBlackTreeNode<K, V> | undefined): void; protected _replaceNode(oldNode: RedBlackTreeNode<K, V>, newNode: RedBlackTreeNode<K, V>): RedBlackTreeNode<K, V>; /** * (Protected) Standard BST insert followed by red-black fix-up. * @remarks Time O(log n), Space O(1) * @param node - Node to insert. * @returns Status string: 'CREATED' or 'UPDATED'. */ protected _insert(node: RedBlackTreeNode<K, V>): CRUD; /** * (Protected) Transplant a subtree in place of another during deletion. * @remarks Time O(1), Space O(1) * @param u - Node to replace. * @param v - Replacement subtree root (may be undefined). * @returns void */ protected _transplant(u: RedBlackTreeNode<K, V>, v: RedBlackTreeNode<K, V> | undefined): void; /** * (Protected) Restore red-black properties after insertion (recolor/rotate). * @remarks Time O(log n), Space O(1) * @param z - Recently inserted node. * @returns void */ protected _insertFixup(z: RedBlackTreeNode<K, V> | undefined): void; /** * (Protected) Restore red-black properties after deletion (recolor/rotate). * @remarks Time O(log n), Space O(1) * @param node - Child that replaced the deleted node (may be undefined). * @returns void */ protected _deleteFixup(node: RedBlackTreeNode<K, V> | undefined): void; /** * (Protected) Perform a left rotation around x. * @remarks Time O(1), Space O(1) * @param x - Pivot node to rotate around. * @returns void */ protected _leftRotate(x: RedBlackTreeNode<K, V> | undefined): void; /** * (Protected) Perform a right rotation around y. * @remarks Time O(1), Space O(1) * @param y - Pivot node to rotate around. * @returns void */ protected _rightRotate(y: RedBlackTreeNode<K, V> | undefined): void; }