Data Structures: Difference between revisions
(9 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
Common data structures you should know | |||
==Lists== | ==Lists== | ||
Line 39: | Line 39: | ||
If the left child has <math>m</math> levels then at most the right child can have <math>2m</math> levels. | If the left child has <math>m</math> levels then at most the right child can have <math>2m</math> levels. | ||
Intuitively, this is more relaxed than AVL trees so they will have fewer operations for insert/delete but will be less balanced.<br> | Intuitively, this is more relaxed than AVL trees so they will have fewer operations for insert/delete but will be less balanced (i.e. longer search).<br> | ||
Red-black trees are used in in C++ (ordered_map, ordered_set) and Java (TreeMap, TreeSet). | Red-black trees are used in in C++ (ordered_map, ordered_set) and Java (TreeMap, TreeSet). | ||
====Complexity=== | ====Complexity==== | ||
<math>2\log (n+1)</math> height.<br> | <math>2\log (n+1)</math> height.<br> | ||
<math>O(\log n)</math> insert, delete | <math>O(\log n)</math> search, insert, delete | ||
===B-tree=== | |||
[[Wikipedia: B-tree]]<br> | |||
[https://www.cs.usfca.edu/~galles/visualization/BTree.html B-tree visualization]<br> | |||
A very popular data structure for filesystems and memory indexes since the maximum size of a node in the B-tree can be configured to the size of a page of memory. | |||
====2-3==== | |||
A B-tree of order 3 | |||
====B+ Tree==== | |||
====B* Tree==== | |||
===Treap=== | ===Treap=== | ||
A tree and a heap. O(logn) with high probability. | A tree and a heap. O(logn) with high probability. | ||
The main benefits are that it is very easy to implement. | |||
====Insertion==== | ====Insertion==== | ||
Insert using BST insert and then heapify using AVL rotations. | Insert using BST insert and then heapify using AVL rotations. | ||
===Splay Tree=== | ===Splay Tree=== | ||
===Segment Trees=== | |||
[[Wikipedia: Segment tree]]<br> | |||
[https://www.geeksforgeeks.org/segment-tree-set-1-sum-of-given-range/ Geeksforgeeks 1 sum of range] | |||
* This is a binary tree for holding segments.<br> | |||
* Leaves hold something called "elementary intervals" and internal nodes hold the union of elementary intervals of its children. | |||
* In addition, each leaf or node v also holds intervals which span their segment, i.e. <math>\{X \mid Int(v) \in X\}</math> | |||
==Spatial Data Structures== | ==Spatial Data Structures== |
Latest revision as of 20:38, 2 March 2020
Common data structures you should know
Lists
XOR Linked List
Skip List
Technically a linked-list but looks like a tree if you squint.
Hash
Use this all the time if you don't need to iterate through the data structure in order.
Probabilistic O(1) insertion.
Linear Probing
One way to handle collisions.
Double hashing
Another way to handle collisions.
Separate chaining
Another way to handle collisions. Each bucket is a pointer to a linked-list of values.
Trees
Heap
AVL
Red-Black
Wikipedia: Red–black tree
Geeks for geeks introduction
Geeks for geeks insertion
Geeks for geeks deletion
A red-black tree follows the following rules
- Each node is either red or black.
- The root is black. This rule is sometimes omitted. Since the root can always be changed from red to black, but not necessarily vice versa, this rule has little effect on analysis.
- All leaves (NIL) are black.
- If a node is red, then both its children are black.
- Every path from a given node to any of its descendant NIL nodes contains the same number of black nodes.
Intuition
Consider any tree with a left and right child. From rule 4, we see that at most n/2 nodes are red. At least half will be black. Red nodes or levels are those interspersed between black levels. If the left child has \(\displaystyle m\) levels then at most the right child can have \(\displaystyle 2m\) levels.
Intuitively, this is more relaxed than AVL trees so they will have fewer operations for insert/delete but will be less balanced (i.e. longer search).
Red-black trees are used in in C++ (ordered_map, ordered_set) and Java (TreeMap, TreeSet).
Complexity
\(\displaystyle 2\log (n+1)\) height.
\(\displaystyle O(\log n)\) search, insert, delete
B-tree
Wikipedia: B-tree
B-tree visualization
A very popular data structure for filesystems and memory indexes since the maximum size of a node in the B-tree can be configured to the size of a page of memory.
2-3
A B-tree of order 3
B+ Tree
B* Tree
Treap
A tree and a heap. O(logn) with high probability. The main benefits are that it is very easy to implement.
Insertion
Insert using BST insert and then heapify using AVL rotations.
Splay Tree
Segment Trees
Wikipedia: Segment tree
Geeksforgeeks 1 sum of range
- This is a binary tree for holding segments.
- Leaves hold something called "elementary intervals" and internal nodes hold the union of elementary intervals of its children.
- In addition, each leaf or node v also holds intervals which span their segment, i.e. \(\displaystyle \{X \mid Int(v) \in X\}\)
Spatial Data Structures
Point Quadtree
Extension of BST.
PM Quadtree
Polygonal Map Quadtree
Simple to implement. See my implementation here.
Requires a known range (region) of values.
O(log k) where k is the region divided by the distance between the two closest points (i.e. your grid is \(\displaystyle k \times k\)).
PR Quadtree
Point Region Quadtree
MX Quadtree
K-d Tree
Restricted Quadtree
Reference
Extension of AVL quadtree where the depth differs by at most one between your 4 children.