# Data Structures

Data structures are a way of organizing and storing data so that they can be accessed and worked with efficiently. They define the relationship between the data, and the operations that can be performed on the data. There are many different types of data structures, generally built upon simpler primitive data types.

These notes are meant to be a quick reference for the most common data structures and their use cases. They are not meant to be a comprehensive guide, but rather a starting point for further exploration.

It is recommended to go through the notes in the order they are presented, as the concepts build on each other, even if you are already familiar with them.

### Arrays

Arrays are the simplest and most widely used data structure. They are used to store a collection of data, but they are not suitable for storing large amounts of data. Arrays are best used for small collections of data, or when the number of items is known in advance.

### Strings

Strings are a collection of characters, and are used to represent text. They are a special type of array, and are used to store and manipulate text data. Strings are immutable, meaning that once they are created, they cannot be changed. They are best used for storing and manipulating small amounts of text data.

### Linked Lists

Linked lists are a collection of nodes, where each node contains a value and a reference to the next node in the list. They are used to store and manipulate data, and are best used for storing and manipulating large amounts of data.

### Stacks

Stacks are a collection of elements, where elements are added and removed from the top of the stack. They are used to store and manipulate data, and are best used for storing and manipulating data in a last-in, first-out (LIFO) manner.

### Queues

Queues are a collection of elements, where elements are added to the back of the queue and removed from the front of the queue. They are used to store and manipulate data, and are best used for storing and manipulating data in a first-in, first-out (FIFO) manner.

### Trees

Trees are a collection of nodes, where each node contains a value and a reference to its children. They are used to store and manipulate data, and are best used for storing and manipulating hierarchical data.

### Graphs

Graphs are a collection of nodes, where each node contains a value and a reference to its neighbors. They are used to store and manipulate data, and are best used for storing and manipulating data with complex relationships.

### Hash Tables

Hash tables are a collection of key-value pairs, where each key is unique. They are used to store and manipulate data, and are best used for storing and manipulating data with fast lookups.

### Sets and Maps

Sets and maps are collections of elements, where each element is unique. They are used to store and manipulate data, and are best used for storing and manipulating data with unique elements.

## Cheatsheet

Data Structure | Type | Access | Features | Use Cases | Use in Algorithms | Typical Problems |
---|---|---|---|---|---|---|

Arrays |
Linear | O(1) access, O(n) search | Fixed size, contiguous memory | Fast access, known number of elements | Efficient access by index, static datasets, sorting, simple lookups | Binary search, array rotation, prefix sum |

Linked Lists |
Linear | O(n) access and search | Dynamic size, non-contiguous memory | Frequent insertions/deletions | Dynamic insertion/deletion, implementing stacks/queues | Reverse linked list, merge sorted lists, cycle detection |

Strings |
Linear (array of characters) | O(1) access, O(n) search/modify | Immutable (in some languages) | Text manipulation | String manipulation, pattern matching, substrings | Palindromes, anagrams, string transformations |

Stacks |
LIFO (Last-In-First-Out) | O(1) for push/pop | Top accessible only | Undo operations, recursion | Last-in-first-out operations, backtracking, depth-first search, syntax parsing | Valid parentheses, reverse Polish notation, next greater element |

Queues |
FIFO (First-In-First-Out) | O(1) for enqueue/dequeue | Front and rear operations | Order processing, breadth-first search | First-in-first-out operations, breadth-first search, caching, buffering | Level order traversal in trees, sliding window problems, queue reconstruction by height |

Trees |
Hierarchical | O(log n) for BST, O(n) otherwise | Branching structure, parent-children relationship | Hierarchical data, efficient searches | Hierarchical data, sorted data, recursive solutions | Tree traversal, BST operations, segment trees |

Heaps |
Tree-based (Min/Max) | O(1) find min/max, O(log n) insert/delete | Complete binary tree, heap property | Priority queues, scheduling | Priority queuing, efficient extraction of min/max elements, heap sort | Kth largest element, merge k sorted lists, median finder |

Graphs |
Network | O(V) or O(V^2) (depending on representation) | Nodes (vertices), edges (connections) | Network routing, social networks | Network modeling, pathfinding, relational problems | Graph traversal (DFS, BFS), shortest path, cycle detection |

Hash Tables |
Key-Value pairs | O(1) average access/search/insert/delete | Hash function, collision handling | Quick lookups, unique data representation | Fast lookups, data indexing, frequency counting, unique item tracking | Two sum, group anagrams, substring concatenation |

Sets and Maps |
Collection of unique elements (Set) and key-value pairs (Map) | O(1) average for most operations | Based on hash tables or trees | Checking membership (Set), associative data storage (Map) | Checking for item uniqueness, mapping relationships, count-based problems | Duplicate detection, longest substring without repeating characters, map-based grouping |