98
98
* Insert: ` O(log(n)) `
99
99
* Remove: ` O(log(n)) `
100
100
101
- <img src =" /Images /BST.png?raw=true " alt =" Binary Search Tree " width =" 400 " height =" 500 " >
101
+ <img src =" /images /BST.png?raw=true " alt =" Binary Search Tree " width =" 400 " height =" 500 " >
102
102
103
103
### Trie
104
104
* A trie, sometimes called a radix or prefix tree, is a kind of search tree that is used to store a dynamic set or associative
105
105
array where the keys are usually Strings. No node in the tree stores the key associated with that node; instead, its position
106
106
in the tree defines the key with which it is associated. All the descendants of a node have a common prefix of the String associated
107
107
with that node, and the root is associated with the empty String.
108
108
109
- ![ Alt text] ( /Images /trie.png?raw=true " Trie ")
109
+ ![ Alt text] ( /images /trie.png?raw=true " Trie ")
110
110
111
111
### Fenwick Tree
112
112
* A Fenwick tree, sometimes called a binary indexed tree, is a tree in concept, but in practice is implemented as an implicit data
118
118
* Range Sum: ` O(log(n)) `
119
119
* Update: ` O(log(n)) `
120
120
121
- ![ Alt text] ( /Images /fenwickTree.png?raw=true " Fenwick Tree ")
121
+ ![ Alt text] ( /images /fenwickTree.png?raw=true " Fenwick Tree ")
122
122
123
123
### Segment Tree
124
124
* A Segment tree, is a tree data structure for storing intervals, or segments. It allows querying which of the stored segments contain
127
127
* Range Query: ` O(log(n)) `
128
128
* Update: ` O(log(n)) `
129
129
130
- ![ Alt text] ( /Images /segmentTree.png?raw=true " Segment Tree ")
130
+ ![ Alt text] ( /images /segmentTree.png?raw=true " Segment Tree ")
131
131
132
132
### Heap
133
133
* A * Heap* is a specialized tree based structure data structure that satisfies the * heap* property: if A is a parent node of
@@ -140,7 +140,7 @@ or equal to those of the children and the lowest key is in the root node
140
140
* Insert: ` O(log(n)) `
141
141
* Remove Max / Min: ` O(log(n)) `
142
142
143
- <img src =" /Images /heap.png?raw=true " alt =" Max Heap " width =" 400 " height =" 500 " >
143
+ <img src =" /images /heap.png?raw=true " alt =" Max Heap " width =" 400 " height =" 500 " >
144
144
145
145
146
146
### Hashing
@@ -156,7 +156,7 @@ or equal to those of the children and the lowest key is in the root node
156
156
the fact that the location of an item is not always determined by its hash value
157
157
158
158
159
- ![ Alt text] ( /Images /hash.png?raw=true " Hashing ")
159
+ ![ Alt text] ( /images /hash.png?raw=true " Hashing ")
160
160
161
161
### Graph
162
162
* A * Graph* is an ordered pair of G = (V, E) comprising a set V of vertices or nodes together with a set E of edges or arcs,
@@ -168,7 +168,7 @@ or equal to those of the children and the lowest key is in the root node
168
168
(u -> v), this does * not* imply that there exists an edge from node v to node u (v -> u)
169
169
170
170
171
- <img src =" /Images /graph.png?raw=true " alt =" Graph " width =" 400 " height =" 500 " >
171
+ <img src =" /images /graph.png?raw=true " alt =" Graph " width =" 400 " height =" 500 " >
172
172
173
173
## Algorithms
174
174
@@ -181,7 +181,7 @@ or equal to those of the children and the lowest key is in the root node
181
181
* Worst Case: ` O(n^2) `
182
182
* Average Case: ` O(nlog(n)) `
183
183
184
- ![ Alt text] ( /Images /quicksort.gif?raw=true " Quicksort ")
184
+ ![ Alt text] ( /images /quicksort.gif?raw=true " Quicksort ")
185
185
186
186
#### Mergesort
187
187
* * Mergesort* is also a divide and conquer algorithm. It continuously divides an array into two halves, recurses on both the
@@ -192,7 +192,7 @@ or equal to those of the children and the lowest key is in the root node
192
192
* Worst Case: ` O(nlog(n)) `
193
193
* Average Case: ` O(nlog(n)) `
194
194
195
- ![ Alt text] ( /Images /mergesort.gif?raw=true " Mergesort ")
195
+ ![ Alt text] ( /images /mergesort.gif?raw=true " Mergesort ")
196
196
197
197
#### Bucket Sort
198
198
* * Bucket Sort* is a sorting algorithm that works by distributing the elements of an array into a number of buckets. Each bucket
@@ -202,7 +202,7 @@ or equal to those of the children and the lowest key is in the root node
202
202
* Worst Case: ` O(n^2) `
203
203
* Average Case:` Θ(n + k) `
204
204
205
- ![ Alt text] ( /Images /bucketsort.png?raw=true " Bucket Sort ")
205
+ ![ Alt text] ( /images /bucketsort.png?raw=true " Bucket Sort ")
206
206
207
207
#### Radix Sort
208
208
* * Radix Sort* is a sorting algorithm that like bucket sort, distributes elements of an array into a number of buckets. However, radix
@@ -218,14 +218,14 @@ or equal to those of the children and the lowest key is in the root node
218
218
* * Depth First Search* is a graph traversal algorithm which explores as far as possible along each branch before backtracking
219
219
* Time Complexity: ` O(|V| + |E|) `
220
220
221
- ![ Alt text] ( /Images /dfsbfs.gif?raw=true " DFS / BFS Traversal ")
221
+ ![ Alt text] ( /images /dfsbfs.gif?raw=true " DFS / BFS Traversal ")
222
222
223
223
#### Breadth First Search
224
224
* * Breadth First Search* is a graph traversal algorithm which explores the neighbor nodes first, before moving to the next
225
225
level neighbors
226
226
* Time Complexity: ` O(|V| + |E|) `
227
227
228
- ![ Alt text] ( /Images /dfsbfs.gif?raw=true " DFS / BFS Traversal ")
228
+ ![ Alt text] ( /images /dfsbfs.gif?raw=true " DFS / BFS Traversal ")
229
229
230
230
#### Topological Sort
231
231
* * Topological Sort* is the linear ordering of a directed graph's nodes such that for every edge from node u to node v, u
@@ -236,7 +236,7 @@ or equal to those of the children and the lowest key is in the root node
236
236
* * Dijkstra's Algorithm* is an algorithm for finding the shortest path between nodes in a graph
237
237
* Time Complexity: ` O(|V|^2) `
238
238
239
- ![ Alt text] ( /Images /dijkstra.gif?raw=true " Dijkstra's ")
239
+ ![ Alt text] ( /images /dijkstra.gif?raw=true " Dijkstra's ")
240
240
241
241
#### Bellman-Ford Algorithm
242
242
* * Bellman-Ford Algorithm* is an algorithm that computes the shortest paths from a single source node to all other nodes in a weighted graph
@@ -246,7 +246,7 @@ or equal to those of the children and the lowest key is in the root node
246
246
* Best Case: ` O(|E|) `
247
247
* Worst Case: ` O(|V||E|) `
248
248
249
- ![ Alt text] ( /Images /bellman-ford.gif?raw=true " Bellman-Ford ")
249
+ ![ Alt text] ( /images /bellman-ford.gif?raw=true " Bellman-Ford ")
250
250
251
251
#### Floyd-Warshall Algorithm
252
252
* * Floyd-Warshall Algorithm* is an algorithm for finding the shortest paths in a weighted graph with positive or negative edge weights, but
@@ -262,14 +262,14 @@ or equal to those of the children and the lowest key is in the root node
262
262
subset of edges that forms a tree that includes every node in the graph
263
263
* Time Complexity: ` O(|V|^2) `
264
264
265
- ![ Alt text] ( /Images /prim.gif?raw=true " Prim's Algorithm ")
265
+ ![ Alt text] ( /images /prim.gif?raw=true " Prim's Algorithm ")
266
266
267
267
#### Kruskal's Algorithm
268
268
* * Kruskal's Algorithm* is also a greedy algorithm that finds a minimum spanning tree in a graph. However, in Kruskal's, the graph does not
269
269
have to be connected
270
270
* Time Complexity: ` O(|E|log|V|) `
271
271
272
- ![ Alt text] ( /Images /kruskal.gif?raw=true " Kruskal's Algorithm ")
272
+ ![ Alt text] ( /images /kruskal.gif?raw=true " Kruskal's Algorithm ")
273
273
274
274
## Greedy Algorithms
275
275
* * Greedy Algorithms* are algorithms that make locally optimal choices at each step in the hope of eventually reaching the globally optimal solution
@@ -317,7 +317,7 @@ or equal to those of the children and the lowest key is in the root node
317
317
#### Big O Notation
318
318
* * Big O Notation* is used to describe the upper bound of a particular algorithm. Big O is used to describe worst case scenarios
319
319
320
- ![ Alt text] ( /Images /bigO.png?raw=true " Theta Notation ")
320
+ ![ Alt text] ( /images /bigO.png?raw=true " Theta Notation ")
321
321
322
322
#### Little O Notation
323
323
* * Little O Notation* is also used to describe an upper bound of a particular algorithm; however, Little O provides a bound
@@ -326,7 +326,7 @@ or equal to those of the children and the lowest key is in the root node
326
326
#### Big Ω Omega Notation
327
327
* * Big Omega Notation* is used to provide an asymptotic lower bound on a particular algorithm
328
328
329
- ![ Alt text] ( /Images /bigOmega.png?raw=true " Theta Notation ")
329
+ ![ Alt text] ( /images /bigOmega.png?raw=true " Theta Notation ")
330
330
331
331
#### Little ω Omega Notation
332
332
* * Little Omega Notation* is used to provide a lower bound on a particular algorithm that is not asymptotically tight
@@ -335,7 +335,7 @@ or equal to those of the children and the lowest key is in the root node
335
335
* * Theta Notation* is used to provide a bound on a particular algorithm such that it can be "sandwiched" between
336
336
two constants (one for an upper limit and one for a lower limit) for sufficiently large values
337
337
338
- ![ Alt text] ( /Images /theta.png?raw=true " Theta Notation ")
338
+ ![ Alt text] ( /images /theta.png?raw=true " Theta Notation ")
339
339
340
340
## Video Lectures
341
341
* Data Structures
0 commit comments