From a63f6add94ed80f48957197e978e6897ec032073 Mon Sep 17 00:00:00 2001 From: askiiart Date: Mon, 11 Mar 2024 17:44:38 -0500 Subject: [PATCH] Add trees and hash table stuff --- labs/excel-thing | Bin 65726 -> 0 bytes notes/fund-prog-3/2024-01-24.md | 0 notes/fund-prog-3/chapter-5/notes.md | 126 ++++++++++++++++++ .../chapter-5/programs/mult_str_hashing.py | 20 +++ .../chapter-5/programs/num_hashing.py | 24 ++++ notes/fund-prog-3/some-sorts-2024-01-31.md | 8 +- notes/fund-prog-3/trees.md | 82 ++++++++++++ 7 files changed, 257 insertions(+), 3 deletions(-) delete mode 100644 labs/excel-thing delete mode 100644 notes/fund-prog-3/2024-01-24.md create mode 100644 notes/fund-prog-3/chapter-5/notes.md create mode 100644 notes/fund-prog-3/chapter-5/programs/mult_str_hashing.py create mode 100644 notes/fund-prog-3/chapter-5/programs/num_hashing.py create mode 100644 notes/fund-prog-3/trees.md diff --git a/labs/excel-thing b/labs/excel-thing deleted file mode 100644 index b3c908ce42f7d55196f445a401b0666a5c02190e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65726 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 $(0 + 2 + 4) \bmod 5 = 1$ +- $i = 2$ - retrying because there's already a value at 1 +- $(0 + (2 * 2) + (4 * 2^2)) \bmod 5$ -> $(0 + 4 + 16) \bmod 5 = 0$ +- $i = 3$ - retrying because there's already a value at 0 +- $(0 + (2 * 3) + (4 * 3^2)) \bmod 5$ -> $(0 + 6 + 36) \bmod 5 = 2$ +- There is no value at 2, so we can insert 40 there. + +| Index | Value | +|-------|-------| +| 0 | 20 | +| 1 | 41 | +| 2 | 40 | +| 3 | null | +| 4 | null | + +And a script to do it automatically: + +```python +import sys + +size = int(sys.argv[-5]) # size of the table +num = int(sys.argv[-4]) # number to hash +c1 = int(sys.argv[-3]) # c1 +c2 = int(sys.argv[-2]) # c2 +i = int(sys.argv[-1]) # number of times we've probed + +h = num % size # hash value + +print((h + (c1 * i) + (c2 * i * i)) % size) +``` + +## Double Hashing + +Another collision resolution thing, where we use a second hash function to find the next available slot. The formula is: + +$(h1(key) + i * h2(key)) \bmod (table size)$ + +Where $h1$ is the first hash function, $h2$ is the second hash function, and $i$ is the number of times we've probed. + +For instance: + +| Index | Value | +|-------|-------| +| 0 | 20 | +| 1 | 41 | +| 2 | null | +| 3 | null | +| 4 | null | + +Assuming: + +- $h1() = h \bmod 5$ +- $h2() = (i * h \bmod 3)$ - idk if there's any logic to this, but it's just an example + +So running `insert(40)` would result in: + +- $h1(40) = 40 \bmod 5 = 0$ - using the second function because there's already a value at 0 +- $h2(40) = (1 * 40) \bmod 3 = 1$;  $i = 0 + (1 * 1) = 1$ - there's already a value at 1 +- $h2(40) = (2 * 40) \bmod 3 = 2$;  $i = 0 + (2 * 2) = 4$ - there's no value at 4, so we can insert 40 there. + +## Common Hash Functions + +### Mid-Square hashing + +1. Square the key +2. Take the middle $R$ digits - $R$ must be greater than or equal to $log_{10}(\text{table size})$ +3. Use that as the hash value - if it's above the number of slots, we can use the modulo of the table size. e.g., if the table size is 100, and the hash value is 123, we can use 23. + +#### Binary + +Usually mid-square hashing is done using binary, since that's what computers work with and is faster. It works the same, but using base 2: + +1. Square the key +2. Take the middle $R$ bits - $R$ must be greater than or equal to $log_2(\text{table size})$ +3. Use that as the hash value - if it's above the number of slots, we can use the modulo of the table size. + +### Multiplicative string hashing + +Multiplicative string hashing in Python-like pseudocode: + +```py +multiplicativeStringHash(string key) { + string_hash = initial_value # using Bernstein's hash, initial_value is 5381 + hash_multiplier = 33 # using Bernstein's hash, hash_multiplier is 33 + + for character in key { + string_hash *= hash_multiplier + strChar += ascii(character) # returns the ASCII number for the character + } + + return string_hash % table_size +} +``` + +Bernstein's hash uses an initial value of 5381 and a hash multiplier of 33, and works well for hashing short English strings. diff --git a/notes/fund-prog-3/chapter-5/programs/mult_str_hashing.py b/notes/fund-prog-3/chapter-5/programs/mult_str_hashing.py new file mode 100644 index 0000000..030f6f5 --- /dev/null +++ b/notes/fund-prog-3/chapter-5/programs/mult_str_hashing.py @@ -0,0 +1,20 @@ +import sys + +initial = int(sys.argv[-4]) +multiplier = int(sys.argv[-3]) +size = int(sys.argv[-2]) +string = sys.argv[-1] + + +def multiplicative_string_hash(string): + string_hash = initial + hash_multiplier = multiplier + + for character in string: + string_hash *= hash_multiplier + string_hash += ord(character) + + return string_hash % size + + +print(multiplicative_string_hash(string)) diff --git a/notes/fund-prog-3/chapter-5/programs/num_hashing.py b/notes/fund-prog-3/chapter-5/programs/num_hashing.py new file mode 100644 index 0000000..883e969 --- /dev/null +++ b/notes/fund-prog-3/chapter-5/programs/num_hashing.py @@ -0,0 +1,24 @@ +import sys + +size = int(sys.argv[-5]) +num = int(sys.argv[-4]) +var_1 = int(sys.argv[-3]) +var_2 = int(sys.argv[-2]) +i = int(sys.argv[-1]) + +def quadratic(): + h = num % size + return (h + (var_1 * i) + (var_2 * i * i)) % size + +def mod_size(): + return num % size + +def h2(): + return var_2 - (num % var_2) + +def combined(): + return (mod_size() + (i * h2())) % size + +func = combined + +print(func()) diff --git a/notes/fund-prog-3/some-sorts-2024-01-31.md b/notes/fund-prog-3/some-sorts-2024-01-31.md index 7b3a285..2022a15 100644 --- a/notes/fund-prog-3/some-sorts-2024-01-31.md +++ b/notes/fund-prog-3/some-sorts-2024-01-31.md @@ -24,11 +24,13 @@ ShellSort(array, gapList) ## Hibbard -2k - 1 where k is 1 to p where └ kp ┐ = N +$2^k - 1$ where $k$ is 1 to $p$ where $└ k^p ┐$ = N + +editor's (now-future me) note: idk why those weird bracket things are there lol, but they were written on the board for some reason and i just don't remember it ## Pratt -For a Z-tuples for (0, 0) -> (k, k) create all the cartesian pairs +For a Z-tuples for $(0, 0) -> (k, k)$ create all the cartesian pairs ```txt (0, 0), (0, 1), (0, 2), ..., (0, k) @@ -40,7 +42,7 @@ For a Z-tuples for (0, 0) -> (k, k) create all the cartesian pairs ## Naive gap values -N/2k, k = 1 to p where N/2p => 1 +$N/2^k$, $k = 1$ to $p$ where $N/2^p=> 1$ ```py for i, j in S diff --git a/notes/fund-prog-3/trees.md b/notes/fund-prog-3/trees.md new file mode 100644 index 0000000..a828986 --- /dev/null +++ b/notes/fund-prog-3/trees.md @@ -0,0 +1,82 @@ +# Trees + +A general tree is a data structure where each node can have zero or more children. Each node has exactly one parent except for the root that has no parent. + +```cpp +std::vector stack; +``` + +## Definition + +A tree T is defined by a root r and a (possibly empty) list of subtrees $T^1, T^2, ..., T^n$ where $n \geq 0$. Each subtree is itself a general tree according to the same definition. + +## Diagram + +`TreeNode` + +```text + |------------------| + | Data | + | l1 l2 | + |------------------| + / \ + / \ + |--------------| |----------------------------| + | Data | | Data | + | l1 l2 | | l1 l2 l3 | + |--------------| |----------------------------| + / \ / / \ + / |--------| |------| |------| |----------| + |------| | Data | | Data | | Data | | Data | + | Data | | l1 | |------| |------| | l1 l2 | + |------| |--------| |----------| + / / \ + |------| / \ + | Data | |------| |------| + |------| | Data | | Data | + |------| | l1 | + |------| + / + / + |------| + | Data | + |------| +``` + +--- + +Trees are traversed starting at the root. Traversals are often recursive because of the recursive nature of trees. It is **bad** practice to expose a reference of any node externally. However, in this lab you have the following publicly exposed: + +- `TreeNode* root` +- `void add Child()` +- `TreeNode* getRoot()` +- `TreeNode* findNode()` +- `collection(TreeNode*) getChildren()` + +--- + +Python-like pseudocode for Level-Order Traversal: + +```py +LOT(root): + # q is a queue of TreeNode references + q; + while q is not empty: + node = q.dequeue() + visit node + for each child of ode: + q.enqueue(child) +``` + +```py +LOT_ReportLevels(root): + # result is a list of lists of TreeNode references + result; + # q is a queue of TreeNode refs + q; + while q is not empty: + # level is a list of TreeNode references + level; + # levelSize is q.size(?) + # incomplete +```