This repository contains implementations of popular data structures and interview questions implemented in Python.
Each data structure has its own separate README with related explanations and links for further reading (including ones to YouTube videos).
This project is my attempt to document the materials I have studied on my journey to understand data structures and also prepare for interviews.
A data structure is a particular way of organizing and storing data in a computer so that it can be accessed and modified efficiently. More precisely, a data structure is a collection of data values, the relationships among them, and the functions or operations that can be applied to the data.
The explanations of the data structures below are from Oleksii Trekhleb's Project
B - Beginner, A - Advanced
BLinked ListBCircular Linked ListBDoubly Linked ListBCircular Doubly Linked ListBQueueBStackAHeapATree
This section categorizes coding interview problems into a set of 16 patterns. Under each pattern there will be a specific category of problems to solve. The goal is to develop an understanding of the underlying pattern, so that, we can apply that pattern to solve other problems.
- Sliding Window
- Two Pointers
- Fast & Slow Pointers
- Merge Intervals
- Cyclic Sort
- In-Place Reversal of Linkedlist
- Breath First Search
- Depth First Search
- Two Heaps
- Subsets
- Modified Binary Search
- Top K Elements
- K Way Merge
- Topological Sort
- Dynamic Programming Patterns
EPI is an invaluable book textbook presents a comprehensive introduction to modern competitive programming.
Below are solutions & questions found under various topics in the book.
-
- Binary Tree Traversal
- Is Binary Tree Height Balanced
- Is Binary Tree Symmetric
- Lowest Common Ancestor
- Lowest Common Ancestor With Parent Pointers
- Sum root to leaf
- Root to leaf path with specified sum
- Inorder Traversal Without Recursion
- Preorder Traversal Without Recursion
- Kth Node in Inorder Traversal
- Compute Successor
- Inorder Traversal in Constant Space
- Reconstruct Binary Tree
- Reconstruct Binary Tree
- Form a LinkedList From Leaves Of Binary Tree
- Compute Exterior of Binary Tree
- Compute Right Sibling Tree
-
- Search Binary Tree
- Check If Binary Search Tree Satisfies BST Property
- Find the First Key Greater Than A Given Value In A BST
- Find The K Largest Elements In A BST
- Compute The LCA In A BST
- Reconstruct A BST From Preorder Traversal Data
- Find The Closest Entries In Three Sorted Arrays
- Reconstruct A BST From Inorder Traversal Data
- Enumerate Numbers Of The Form a + b sqrt2
- Build A Minimum Height BST From A Sorted Array
- Test If Three BST Nodes Are Totally Ordered
- The Range Lookup Problem
- Add Credits
-
- Merge Two Sorted Lists
- Merge Two Sorted Doubly LinkedList
- Reverse A Sublist
- Reverse Every K Sublist
- Test For Cyclicity
- Find The Start Of A Cycle In A LInkedList
- Test For Overlapping List - Lists Are Cycle Free
- Test For Overlapping List - Lists May Have Cycles
- Delete Node From Singly Linkedlist
- Remove Kth Last Element From List
- Remove Duplicates From Sorted Lists
- Implement Cyclic Right Shift For Singly LinkedList
- Even Odd Merge
- Test If Singly LinkedList Is Palindromic
- Implement List Pivoting
- Add Two LinkedLists
- Two Sum
- Best Time To Buy And Sell Stock
- Contains Duplicate
- Product of Array Except Self
- Maximum Subarray
E - Easy, M - Medium , H - Hard,
- Binary Trees
EBinary Tree Inorder TraversalESame TreeESymmetric TreeEMaximum Depth of Binary TreeEConvert Sorted Array to Binary Search TreeEBalanced Binary TreeEMinimum Depth of Binary TreeEPath SumEBinary Tree Preorder TraversalEBinary Tree Postorder TraversalEInvert Binary TreeELowest Common Ancestor of a Binary Search TreeEBinary Tree PathsESum of Left LeavesEFind Mode in Binary Search TreeEMinimum Absolute Difference in BSTEDiameter of Binary TreeEBinary Tree TiltESubtree of Another TreeEConstruct String from Binary TreeEMerge Two Binary TreesEAverage of Levels in Binary TreeETwo Sum IV - Input is a BSTESecond Minimum Node In a Binary TreeEMinimum Distance Between BST Nodes
A list of popular algorithms asked during Interviews
A simple crash course to get you up and started with recursion
▶ Data Structures and Algorithms on YouTube
Big O notation is used to classify algorithms according to how their running time or space requirements grow as the input size grows. On the chart below you may find most common orders of growth of algorithms specified in Big O notation.
Source: Big O Cheat Sheet.
Below is the list of some of the most used Big O notations and their performance comparisons against different sizes of the input data.
| Big O Notation | Computations for 10 elements | Computations for 100 elements | Computations for 1000 elements |
|---|---|---|---|
| O(1) | 1 | 1 | 1 |
| O(log N) | 3 | 6 | 9 |
| O(N) | 10 | 100 | 1000 |
| O(N log N) | 30 | 600 | 9000 |
| O(N^2) | 100 | 10000 | 1000000 |
| O(2^N) | 1024 | 1.26e+29 | 1.07e+301 |
| O(N!) | 3628800 | 9.3e+157 | 4.02e+2567 |
| Data Structure | Access | Search | Insertion | Deletion | Comments |
|---|---|---|---|---|---|
| Array | 1 | n | n | n | |
| Stack | n | n | 1 | 1 | |
| Queue | n | n | 1 | 1 | |
| Linked List | n | n | 1 | n | |
| Hash Table | - | n | n | n | In case of perfect hash function costs would be O(1) |
| Binary Search Tree | n | n | n | n | In case of balanced tree costs would be O(log(n)) |
| B-Tree | log(n) | log(n) | log(n) | log(n) | |
| Red-Black Tree | log(n) | log(n) | log(n) | log(n) | |
| AVL Tree | log(n) | log(n) | log(n) | log(n) | |
| Bloom Filter | - | 1 | 1 | - | False positives are possible while searching |
| Name | Best | Average | Worst | Memory | Stable | Comments |
|---|---|---|---|---|---|---|
| Bubble sort | n | n2 | n2 | 1 | Yes | |
| Insertion sort | n | n2 | n2 | 1 | Yes | |
| Selection sort | n2 | n2 | n2 | 1 | No | |
| Heap sort | n log(n) | n log(n) | n log(n) | 1 | No | |
| Merge sort | n log(n) | n log(n) | n log(n) | n | Yes | |
| Quick sort | n log(n) | n log(n) | n2 | log(n) | No | Quicksort is usually done in-place with O(log(n)) stack space |
| Shell sort | n log(n) | depends on gap sequence | n (log(n))2 | 1 | No | |
| Counting sort | n + r | n + r | n + r | n + r | Yes | r - biggest number in array |
| Radix sort | n * k | n * k | n * k | n + k | Yes | k - length of longest key |
