read more
Studying for Algorithms: 
 
Dynamic programming
Greedy algorithms
Time complexities and invariants for basic graph algorithms. 
Old stuff
Will use graphs as a basis for dynamic programming or greedy algorithms. 


Basic Graph Algorithms: 

	If vertex is connected, there is a path between every pair of vertices. |E| \geq |V| -1. 
	
	If |E| = |V| -1, then it’s a tree. 

	A forrest is a collection of trees. 
		
	Adjacency lists just stores a linked list of all vertices connected to a given vertex. So max size would be V^2. 
	Adjacency list requires O(V+E) storage for directed and undirected. 
	Adjacency is best for sparse, matrix is best for dense. 
	
	•	Breath first: 
	⁃	Run-time: O(V+E).
	⁃	Essentially, you start at some position and go uniformly out, in a layered fashion.
	•	Invariant: Queue contains all (discovered) adjacent vertices in discovered/increasing distance order from source
	⁃	Depth first: 
	⁃	Run-time: O(V+E). 
	⁃	Invariant: Vertex’s discovered time is > that of all previously discovered vertices and finishing time> all finishing times of vertices adjacent. 

		
	Minimum Spanning Trees: 

		Kruskals: look at every edge, from smallest weight to greatest, and add them to the minimal spanning tree and if you hit a cycle, don’t add that 		edge, and continue until you have all of the vertices. Runtime O(E log V). 

		Primm’s: start with a node, look at all connected nodes and chooses the one that has the smallest edge. Runtime O(|E| log |V|). 


	Finding shortest past between two nodes:

		Dijikstra: O(V^2). It picks the unvisited vertex with the lowest-distance, calculates the distance through it to each unvisited 		neighbor, and updates the neighbor's distance if smaller. Mark visited (set to red) when done with neighbors.

		Bellman Ford: time complexity O(V*E). Space: O(V). The Bellman-Ford algorithm is one of the classic solutions to this problem. It calculates 		the shortest path to all nodes in the graph from a single source.
	


Sorting time complexities: 
		 
Quicksort: n^2
Mergesort: nlog(n)
Heapsort: nlog(n)
Insertionsort: n^2
Bubblesort: n^2


Write Big-oh definitions. 


Proof by induction: 

	1. State what you want to prove. 

	2. For which variable. 

	3. Base cases. 

	4. “I want to prove for greater than base” 

	5. Induction Hypothesis (for greater than base < k < n). 

	6. Want to prove for n. 

	7. Work —> break n into smaller cases.