yote
This commit is contained in:
		
							parent
							
								
									fa12687849
								
							
						
					
					
						commit
						ea2aa8d2a6
					
				
							
								
								
									
										1
									
								
								370/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								370/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | |||||||
|  | *swp | ||||||
							
								
								
									
										6
									
								
								370/notes/1.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								370/notes/1.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,6 @@ | |||||||
|  | # lec1 | ||||||
|  | > trees & tree heaps  | ||||||
|  | > also: ilearn still busted but theres a survey to fill out | ||||||
|  | 
 | ||||||
|  | bin search trees | ||||||
|  | max/min/heap trees | ||||||
							
								
								
									
										13
									
								
								370/notes/2.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								370/notes/2.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,13 @@ | |||||||
|  | # Divide and Conquer | ||||||
|  | 
 | ||||||
|  | Make big problem into smaller problems to solve | ||||||
|  | 
 | ||||||
|  | ## Merge Sort | ||||||
|  | 
 | ||||||
|  | _yote_ | ||||||
|  | 
 | ||||||
|  | 1. find midpoint of list | ||||||
|  | 2. split into two smaller lists | ||||||
|  | 3. keep splitting smaller lists until we have a bunch of 1/2 size lists | ||||||
|  | 4. sort each using the _smaller_ already sorted values against each other into a new sub-list | ||||||
|  | 5. combine and sort each thing | ||||||
							
								
								
									
										38
									
								
								370/notes/adj-list.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								370/notes/adj-list.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,38 @@ | |||||||
|  | # Adjacency list | ||||||
|  | 
 | ||||||
|  | Imagine 8 nodes with no connections | ||||||
|  | 
 | ||||||
|  | To store this data in an _adjacency list_ we need __n__ items to store them. | ||||||
|  | We'll have 0 __e__dges however so in total our space is (n+e) == (n) | ||||||
|  | 
 | ||||||
|  | # Adjacency matrix | ||||||
|  | 
 | ||||||
|  | space: O(n^2) | ||||||
|  | The convention for notation btw is [x,y] meaning: | ||||||
|  | 	* _from x to y_ | ||||||
|  | 
 | ||||||
|  | # Breadth first search | ||||||
|  | 
 | ||||||
|  | add neighbors of current to queue | ||||||
|  | go through current's neighbors and add their neighbors to queue | ||||||
|  | add neighbor's neighbors | ||||||
|  | 	keep going until there are no more neighbors to add | ||||||
|  | go through queue and start popping members out of the queue | ||||||
|  | 
 | ||||||
|  | # Depth first search  | ||||||
|  | 
 | ||||||
|  | Here we're going deeper into the neighbors | ||||||
|  | 
 | ||||||
|  | _once we have a starting point_  | ||||||
|  | 
 | ||||||
|  | _available just means that node has a non-visited neighbor_ | ||||||
|  | if available go to a neighbor | ||||||
|  | if no neighbors available visit | ||||||
|  | goto 1 | ||||||
|  | 
 | ||||||
|  | # Kahn Sort | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Graph Coloring | ||||||
|  | 
 | ||||||
|  | When figuring out how many colors we need for the graph, we should note the degree of the graph | ||||||
							
								
								
									
										32
									
								
								370/notes/avl-trees.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								370/notes/avl-trees.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,32 @@ | |||||||
|  | # Self balancing trees aka AVL trees | ||||||
|  | 
 | ||||||
|  | _time complexity will be in terms of height_ | ||||||
|  | 
 | ||||||
|  | > Height: | ||||||
|  | 	distance from nulls after leaves | ||||||
|  | 	* impl: _root will typically have the largest height value_ | ||||||
|  | 
 | ||||||
|  | > Balance: | ||||||
|  | 	| left_height - right_height | | ||||||
|  | 	we can discard the || if we want negative balance vals but it really shouldn't matter | ||||||
|  | 	basically: we want the balance for each node to be 1 or 0. | ||||||
|  | 
 | ||||||
|  | # Self balancing part | ||||||
|  | 
 | ||||||
|  | We maintain balance through the tree's lifetime as we insert/delete things into the tree | ||||||
|  | 
 | ||||||
|  | > Insertion/Deletion | ||||||
|  | 	* just like BST but we balance starting from the new node | ||||||
|  | 
 | ||||||
|  | # Restoring balance | ||||||
|  | 
 | ||||||
|  | There are 4 special cases when dealing with restoring balance: | ||||||
|  | 
 | ||||||
|  | 	1. left-left | ||||||
|  | 	2. left-right | ||||||
|  | 	3. right-left | ||||||
|  | 	4. right-right | ||||||
|  | 
 | ||||||
|  | # Tries | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
							
								
								
									
										60
									
								
								370/notes/big-o.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								370/notes/big-o.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,60 @@ | |||||||
|  | # Calculating Big O | ||||||
|  | 
 | ||||||
|  | Suppose we have the following function | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | func(x): | ||||||
|  | 	if cond1  | ||||||
|  | 		O(n^2) | ||||||
|  | 	elif cond2 | ||||||
|  | 		O(n) | ||||||
|  | 	else  | ||||||
|  | 		O(1) | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | How do we define the _average_ time complexity: | ||||||
|  | * any input which isn't setup to be _special_ | ||||||
|  | 	1. linear search which always finds the first elementO(1) | ||||||
|  | 	2. linear search that doen't find anything/last elementO(n) | ||||||
|  | 
 | ||||||
|  | With linear searches: finding an average item in the middle(somwhere) we have to cover:  | ||||||
|  | 	* x% of the n size list | ||||||
|  | 
 | ||||||
|  | Since we drop the constants in time complexity expressions we thus end up with O(n). | ||||||
|  | 
 | ||||||
|  | ## Heap Sort | ||||||
|  | 
 | ||||||
|  | Time Complexity Exercise | ||||||
|  | 
 | ||||||
|  | * Best:  | ||||||
|  | * Average: | ||||||
|  | * Worst: | ||||||
|  | * Space: | ||||||
|  | 
 | ||||||
|  | ## Insertion Sort | ||||||
|  | 
 | ||||||
|  | Time Complexity Exercise | ||||||
|  | 
 | ||||||
|  | * Best:  | ||||||
|  | 	* Already sorted meaning we go through the whole list once  | ||||||
|  | 	* O(n) - because we'll do the check into our left sub-list but we don't go into it leaving us as constant time spent per item ie c\*n | ||||||
|  | 
 | ||||||
|  | * Average: | ||||||
|  | 	* Pretty close to n^2 just for the sake of  | ||||||
|  | 	* O(n^2) | ||||||
|  | 
 | ||||||
|  | * Worst: | ||||||
|  | 	* Going through the whole list sorting everything(backwards) | ||||||
|  | 	* O(n^2) | ||||||
|  | 
 | ||||||
|  | 		* must go through N items for each item  | ||||||
|  | * Space: | ||||||
|  | 
 | ||||||
|  | # Notation | ||||||
|  | 
 | ||||||
|  | Time Complexity: O(n) | ||||||
|  | 
 | ||||||
|  | Space Complexity: OMEGA(n) | ||||||
|  | 
 | ||||||
|  | Both Complexity: THETA(n) | ||||||
|  | 	* such a complexity only exists if O(n) == OMEGA(n) | ||||||
							
								
								
									
										27
									
								
								370/notes/complex.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								370/notes/complex.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,27 @@ | |||||||
|  | # Complexities | ||||||
|  | 
 | ||||||
|  | yote we talkin about space and time complexity | ||||||
|  | 
 | ||||||
|  | * Space | ||||||
|  | 
 | ||||||
|  | How much space this shit takin up  | ||||||
|  | 
 | ||||||
|  | * Time  | ||||||
|  | 
 | ||||||
|  | How fast something it's gonna take | ||||||
|  | 
 | ||||||
|  | * Both time/space complexity notation | ||||||
|  | 
 | ||||||
|  | _O(?)_: this notation is used for both space and time complexity | ||||||
|  | 
 | ||||||
|  | # Scale of Complexity | ||||||
|  | 
 | ||||||
|  | O(n) we refer as a linear because the higheset order exponent is /1/ | ||||||
|  | 
 | ||||||
|  | The higher the max order of the expression the higher order the overall complexity(duh). | ||||||
|  | 
 | ||||||
|  | Non-polynomial expressions are just non-polynomial expressions(yote). | ||||||
|  | 
 | ||||||
|  | In other words the part most people care about is the highest order exponential value in the function/expression, since everything else _will_ be faster than that. | ||||||
|  | 
 | ||||||
|  | If you want to jam jargon in there go ahead but don't overthink this tbh famalamasham. | ||||||
							
								
								
									
										3
									
								
								370/notes/graphs.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								370/notes/graphs.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,3 @@ | |||||||
|  | # Graph | ||||||
|  | 
 | ||||||
|  | _First of a few pages on graphs_ | ||||||
							
								
								
									
										20
									
								
								370/notes/sorts.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								370/notes/sorts.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,20 @@ | |||||||
|  | # Cheatsheet for sorts | ||||||
|  | 
 | ||||||
|  | _using pythonic terminology for these cases_ | ||||||
|  | 
 | ||||||
|  | > Bubble | ||||||
|  | 	* take the largest value and buble it to the top/front of the list | ||||||
|  | 
 | ||||||
|  | > Insertion | ||||||
|  | 
 | ||||||
|  | > Selection | ||||||
|  | 	* take smallest value and drop it to the front | ||||||
|  | 
 | ||||||
|  | > Merge | ||||||
|  | 	* split the hell out of things and sort from the inside out | ||||||
|  | 	* goes from side to side | ||||||
|  | 
 | ||||||
|  | > Heap | ||||||
|  | 	* grab max item and append it to a heap  | ||||||
|  | 
 | ||||||
|  | > Quick | ||||||
							
								
								
									
										16
									
								
								370/notes/space.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								370/notes/space.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,16 @@ | |||||||
|  | # Space complexity | ||||||
|  | 
 | ||||||
|  | With function calls there is explicit space used. | ||||||
|  | 
 | ||||||
|  | Implicit space used is about how much work is done to take up space  | ||||||
|  | 
 | ||||||
|  | # Binary recursive search | ||||||
|  | 
 | ||||||
|  | > Explicit space: O(c) | ||||||
|  | 
 | ||||||
|  | This is the amount of space taken per call. | ||||||
|  | We know how much space has to be allocated every call so we can say it would likely be constant | ||||||
|  | 
 | ||||||
|  | > Implicit: O(log(n)) | ||||||
|  | 
 | ||||||
|  | Because again we will likely take up log(n) times to reach our destination an this comes from our rekked stackspace. | ||||||
							
								
								
									
										20
									
								
								370/notes/tries.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								370/notes/tries.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,20 @@ | |||||||
|  | # Tries - Prefix Trees(syntax trees in disguise) | ||||||
|  | 
 | ||||||
|  | We can build grammers from symbols where symbols follow a set of rules to build on each other. | ||||||
|  | Kinda like linguistic sytax trees but, exactly the same. | ||||||
|  | _Individual syntaxes are combined to build grammers combine to build phrases, etc. etc._ | ||||||
|  | 
 | ||||||
|  | Instead of symbols we use _prefixes_ as our terminology, to build _words_. | ||||||
|  | Terminally sequenced symbols are denoted by a _leaf_ flag.  | ||||||
|  | 
 | ||||||
|  | # Deletion | ||||||
|  | 
 | ||||||
|  | We don't actually remove things for trivial cases. | ||||||
|  | Instead we turn off the leaf flag in the end target node | ||||||
|  | 
 | ||||||
|  | if we have /bathe/ and /bathes/ as valid phrases and wanted to remaove /bathe/ from our language | ||||||
|  | 	* All we have to do is set the /e/ to off as a valid leaf. | ||||||
|  | 
 | ||||||
|  | If instead we wanted to remove /bathes/ instead we would go to /s/ and then set it to off like before. | ||||||
|  | 	* The problem now is that /s/ is hanging and it doesn't have any children so we can remove it entirely | ||||||
|  | 	* If a toggled off node has children it means that it necessarily is part of a valid prefix so it can not be removed | ||||||
							
								
								
									
										57
									
								
								370/past-midterms/m1.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								370/past-midterms/m1.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,57 @@ | |||||||
|  | # Practice things | ||||||
|  | _just going through the practice midterm problems_ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 1. Identifying sorting algorithms based on progression(_conceptual_) | ||||||
|  | 
 | ||||||
|  | _bubble sort_: the bigger the value = the bigger the bubble | ||||||
|  | 	* compare two values from the start always, bubble up the bigger value | ||||||
|  | 		keep compmaring two adjacent values till you get to the end of the list | ||||||
|  | 	* kinda like gladiator m&m's | ||||||
|  | 
 | ||||||
|  | _insertion sort_: we have the left sublist which maintains a ordered state always | ||||||
|  | 	* we walk along the unsorted list and try to drop our current value into the currently sorted left-hand sublist. | ||||||
|  | 	* Key points:  | ||||||
|  | 		left hand ordered sublist | ||||||
|  | 
 | ||||||
|  | _quick sort_: here we push things up to the top immediately where they are then sorted against the left hand sub-list | ||||||
|  | 
 | ||||||
|  | _heap sort_: make a giant heap(list) and just take the largest/smallest value and prepend/append to the """heap""" | ||||||
|  | 
 | ||||||
|  | __reponse__: insertion sort | ||||||
|  | Left side of progression is always sorted while the right isn't  | ||||||
|  | Left side also get progressively larger | ||||||
|  | 
 | ||||||
|  | 2. How you know if a graph is undirected given a matrix(_code_) | ||||||
|  | 
 | ||||||
|  | _empirically_: check the upper right half of the matrix and check if each coord pair is reflected across the main axis | ||||||
|  | 
 | ||||||
|  | 	1.	Take a coords pair value(_say True_) | ||||||
|  | 	2.	Flip the (x,y) so we have /x,y/ | ||||||
|  | 	3.	If the /x,y/ value is the same as (x,y) then those two nodes are bidrectional(i.e. undirected) | ||||||
|  | 
 | ||||||
|  | The _trick_ here is making sure we don't bother check the divisor axis or below by accident. | ||||||
|  | 
 | ||||||
|  | 3. Binary tree lookup(_code_) | ||||||
|  | 
 | ||||||
|  | Recursion is the smollest way of doing this so just go with that. | ||||||
|  | 
 | ||||||
|  | 4. Quick sort partition(_code_) | ||||||
|  | 
 | ||||||
|  | 	* Just splitting lists again | ||||||
|  | 	* Checking for partition results as well | ||||||
|  | 
 | ||||||
|  | 5. Graph traversal(_code_) | ||||||
|  | 
 | ||||||
|  | DFS/BFS is fair game | ||||||
|  | List/matrix meme allowed so don't even bother with other trash | ||||||
|  | 
 | ||||||
|  | 6. Emperical Graph Traversal(_conceptual_) | ||||||
|  | 
 | ||||||
|  | Time complexity of either dfs/bfs will be /v\*e/ or something like that | ||||||
|  | 
 | ||||||
|  | 7. Topological sort(_code_) | ||||||
|  | 
 | ||||||
|  | big meme matrix/list allowed | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
							
								
								
									
										
											BIN
										
									
								
								370/past-midterms/midterm1.pdf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								370/past-midterms/midterm1.pdf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										0
									
								
								370/samples/adj-matrix.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								370/samples/adj-matrix.py
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										53
									
								
								370/samples/graph.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										53
									
								
								370/samples/graph.py
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,53 @@ | |||||||
|  | #!/usr/bin/python3 | ||||||
|  | 
 | ||||||
|  | import random | ||||||
|  | class Node: | ||||||
|  |     def __init__(self, data:int): | ||||||
|  |         self.data = data | ||||||
|  |         # empty list o rama | ||||||
|  |         self.refs = [] | ||||||
|  | 
 | ||||||
|  |     def __str__(self): | ||||||
|  |         return f'{self.data}:{self.refs}' | ||||||
|  | 
 | ||||||
|  | def new_node(data): | ||||||
|  |     """ | ||||||
|  |     Provides a new node for a ref list or a basic s | ||||||
|  |     """ | ||||||
|  |     return Node(data) | ||||||
|  | 
 | ||||||
|  | def add_node(base, data): | ||||||
|  |     """ | ||||||
|  |     Creates a new node for the base node to hook onto | ||||||
|  |     """ | ||||||
|  |     base.refs.append(new_node(data)) | ||||||
|  | 
 | ||||||
|  | def show_children(node): | ||||||
|  |     """ | ||||||
|  |     LMAO @ your life | ||||||
|  |     """ | ||||||
|  |     print(node.refs) | ||||||
|  | 
 | ||||||
|  | def populate(node): | ||||||
|  |     """ | ||||||
|  |     Populate our node with some data | ||||||
|  |     """ | ||||||
|  |     for i in range(1,random.randint(2,10)): | ||||||
|  |         new_tmp = new_node(random.randint(0,100)) | ||||||
|  |         node.refs.append(new_tmp) | ||||||
|  | 
 | ||||||
|  | def child_count(node): | ||||||
|  |     print(f'{len(node.refs)}') | ||||||
|  | 
 | ||||||
|  | if __name__ == "__main__": | ||||||
|  |     root = Node(0) | ||||||
|  |     for i in 'ABCDE': | ||||||
|  |         add_node(root, i) | ||||||
|  | 
 | ||||||
|  |     print(f'Children count of root: {len(root.refs)}') | ||||||
|  |     for i in root.refs: | ||||||
|  |         populate(i) | ||||||
|  |         child_count(i) | ||||||
|  | 
 | ||||||
|  |     print('Root node:') | ||||||
|  |     show_children(root) | ||||||
							
								
								
									
										37
									
								
								370/samples/tree.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								370/samples/tree.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,37 @@ | |||||||
|  | #!/usr/bin/python3 | ||||||
|  | import random   # just for some basic population methods | ||||||
|  | 
 | ||||||
|  | class Node: | ||||||
|  |     def __init__(self,data): | ||||||
|  |         self.data   = data | ||||||
|  |         self.children = [] | ||||||
|  | 
 | ||||||
|  |     def __str__(self): | ||||||
|  |         return self.data | ||||||
|  | 
 | ||||||
|  |     def __repr__(self): | ||||||
|  |         return f'{self.__str()}:{self.children}' | ||||||
|  | 
 | ||||||
|  | def new_node(data): | ||||||
|  |     return Node(data) | ||||||
|  | 
 | ||||||
|  | def add_node(node, lr, val): | ||||||
|  |     node.children.append() | ||||||
|  |     return None | ||||||
|  | 
 | ||||||
|  | def lvr(root): | ||||||
|  |     """ | ||||||
|  |     Inorder traversal | ||||||
|  |     """ | ||||||
|  |     # left sequence | ||||||
|  |     if root.left is not None: | ||||||
|  |         lvr(root.left) | ||||||
|  | 
 | ||||||
|  |     # visit sequence | ||||||
|  |     print(root.data) | ||||||
|  | 
 | ||||||
|  |     # right sequence | ||||||
|  |     if root.right is not None: | ||||||
|  |         lvr(root.right) | ||||||
|  | 
 | ||||||
|  |     return  | ||||||
							
								
								
									
										32
									
								
								370/samples/trie.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								370/samples/trie.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,32 @@ | |||||||
|  | # Syntax tree in disguise | ||||||
|  | class Node: | ||||||
|  |     def __init__(self, symbol=None, leaf=False, children={}):         | ||||||
|  |         # root node doesn't need any actual data | ||||||
|  |         self.symbol     = None | ||||||
|  |         self.leaf       = leaf | ||||||
|  |         # {key=char : value=Node} | ||||||
|  |         self.children   = children | ||||||
|  | 
 | ||||||
|  | class Trie: | ||||||
|  |     def __init__(self): | ||||||
|  |         # root should contain every letter so that we can pick our thing | ||||||
|  |         root = Node() | ||||||
|  | 
 | ||||||
|  |     #wrapper func | ||||||
|  |     def traverse(self, func, phrase, _node): | ||||||
|  |         # wew lad | ||||||
|  |         def func(_phrase, _node): | ||||||
|  | 
 | ||||||
|  |         return func(phrase) | ||||||
|  | 
 | ||||||
|  |     @traverse | ||||||
|  |     def insert(self, phrase, node): | ||||||
|  |         pass | ||||||
|  | 
 | ||||||
|  |     @traverse | ||||||
|  |     def remove(self, phrase, node): | ||||||
|  |         pass | ||||||
|  | 
 | ||||||
|  |     @traverse | ||||||
|  |     def checkPhrase(self, phrase): | ||||||
|  |         pass | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Medium Fries
						Medium Fries