From eecaab61fc2e74c93c9ca0275e90d4c0910fbfcd Mon Sep 17 00:00:00 2001 From: Janis Hutz Date: Fri, 26 Sep 2025 12:31:55 +0200 Subject: [PATCH] [AD] Update summary to new version of helpers --- .../ad-janishutz.pdf | Bin 448058 -> 448112 bytes .../parts/datatypes/avl-tree.tex | 8 +- .../parts/datatypes/binary-tree.tex | 6 +- .../parts/datatypes/lists-dictionaries.tex | 36 ++++----- .../parts/dp.tex | 17 +++-- .../parts/graphs/all-pairs-sp.tex | 8 +- .../parts/graphs/bfs-dfs.tex | 4 +- .../parts/graphs/matrix.tex | 4 +- .../parts/graphs/mst/boruvka.tex | 4 +- .../parts/graphs/mst/kruskal.tex | 12 +-- .../parts/graphs/mst/prim.tex | 6 +- .../parts/graphs/shortest-path.tex | 8 +- .../parts/intro.tex | 6 +- .../parts/search/comparison-based-sort.tex | 70 +++++++++--------- .../parts/search/heap-sort.tex | 22 +++--- .../parts/search/quick-sort.tex | 8 +- 16 files changed, 110 insertions(+), 109 deletions(-) diff --git a/semester1/algorithms-and-datastructures/ad-janishutz.pdf b/semester1/algorithms-and-datastructures/ad-janishutz.pdf index 615c9ef6e3df7b61527866738f418e54a5744df5..f0b1903f8984259d7ccdfb6cda97b668df262ee4 100644 GIT binary patch delta 24134 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 delta 24161 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 Ur5nzH2(bnEa9CIrHI;Dw2O67DMF0Q* diff --git a/semester1/algorithms-and-datastructures/parts/datatypes/avl-tree.tex b/semester1/algorithms-and-datastructures/parts/datatypes/avl-tree.tex index 8359df6..0621fb9 100644 --- a/semester1/algorithms-and-datastructures/parts/datatypes/avl-tree.tex +++ b/semester1/algorithms-and-datastructures/parts/datatypes/avl-tree.tex @@ -14,11 +14,11 @@ \end{itemize} \item \textbf{Time Complexity:} \begin{itemize} - \item Search: \tct{\log n}. - \item Insert: \tct{\log n}. - \item Delete: \tct{\log n}. + \item Search: $\tct{\log n}$. + \item Insert: $\tct{\log n}$. + \item Delete: $\tct{\log n}$. \end{itemize} - \item \textbf{Height:} The height of an AVL Tree with $n$ nodes is \tct{\log n}. + \item \textbf{Height:} The height of an AVL Tree with $n$ nodes is $\tct{\log n}$. \end{itemize} \end{properties} diff --git a/semester1/algorithms-and-datastructures/parts/datatypes/binary-tree.tex b/semester1/algorithms-and-datastructures/parts/datatypes/binary-tree.tex index 0500676..550cb68 100644 --- a/semester1/algorithms-and-datastructures/parts/datatypes/binary-tree.tex +++ b/semester1/algorithms-and-datastructures/parts/datatypes/binary-tree.tex @@ -16,9 +16,9 @@ \end{itemize} \item \textbf{Time Complexity (basic operations):} \begin{itemize} - \item Search: \tct{h}, where $h$ is the height of the tree. - \item Insert: \tct{h}. - \item Delete: \tct{h}. + \item Search: $\tct{h}$, where $h$ is the height of the tree. + \item Insert: $\tct{h}$. + \item Delete: $\tct{h}$. \end{itemize} \item \textbf{Height:} The height of a binary tree is the longest path from the root to a leaf node. \end{itemize} diff --git a/semester1/algorithms-and-datastructures/parts/datatypes/lists-dictionaries.tex b/semester1/algorithms-and-datastructures/parts/datatypes/lists-dictionaries.tex index 520e551..a0cd9ce 100644 --- a/semester1/algorithms-and-datastructures/parts/datatypes/lists-dictionaries.tex +++ b/semester1/algorithms-and-datastructures/parts/datatypes/lists-dictionaries.tex @@ -55,10 +55,10 @@ The same disadvantages as for single linked lists apply here as well \toprule \textbf{Operation} & \textbf{Array} & \textbf{Single Linked List} & \textbf{Double Linked List} \\ \midrule - $\textsc{insert}(k, L)$ & \tco{1} & \tco{1} & \tco{1} \\ - $\textsc{get}(i, L)$ & \tco{1} & \tco{l} & \tco{l} \\ - $\textsc{insertAfter}(k, k', L)$ & \tco{l} & \tco{1} & \tco{1} \\ - $\textsc{delete}(k, L)$ & \tco{l} & \tco{l} & \tco{1} \\ + $\textsc{insert}(k, L)$ & $\tco{1}$ & $\tco{1}$ & $\tco{1}$ \\ + $\textsc{get}(i, L)$ & $\tco{1}$ & $\tco{l}$ & $\tco{l}$ \\ + $\textsc{insertAfter}(k, k', L)$ & $\tco{l}$ & $\tco{1}$ & $\tco{1}$ \\ + $\textsc{delete}(k, L)$ & $\tco{l}$ & $\tco{l}$ & $\tco{1}$ \\ \bottomrule \end{tabular} \smallskip @@ -107,7 +107,7 @@ They are most commonly implemented using some kind of heap, whilst a fibonacci h \newpage \subsection{Dictionaries} -A \textbf{dictionary} stores a collection of key-value pairs. +A \textbf{dictionary} stores a collection of key-value pairs. \subsubsection{Operations:} @@ -115,32 +115,32 @@ A \textbf{dictionary} stores a collection of key-value pairs. \item \textbf{Insertion (\texttt{insert(key,\ value)})}: \begin{itemize} \item Adds a new key-value pair to the dictionary. If the key already exists, it may update the existing value. - \item Time Complexity: Average case \tct{1} (with hashing), worst case \tcl{n} (when all keys hash to the same bucket). + \item Time Complexity: Average case $\tct{1}$ (with hashing), worst case $\tcl{n}$ (when all keys hash to the same bucket). \end{itemize} \item \textbf{Deletion (\texttt{remove(key)})}: \begin{itemize} \item Removes a key-value pair from the dictionary by key. - \item Time Complexity: Average case \tct{1}, worst case \tco{n}. + \item Time Complexity: Average case $\tct{1}$, worst case $\tco{n}$. \end{itemize} \item \textbf{Search/Access (\texttt{get(key)} or \texttt{find(key)})}: \begin{itemize} \item Retrieves the value associated with a given key. - \item Time Complexity: Average case \tct{1}, worst case \tco{n}. + \item Time Complexity: Average case $\tct{1}$, worst case $\tco{n}$. \end{itemize} \item \textbf{Contains (\texttt{containsKey(key)})}: \begin{itemize} \item Checks if a key is present in the dictionary. - \item Time Complexity: Average case \tct{1}, worst case \tco{n}. + \item Time Complexity: Average case $\tct{1}$, worst case $\tco{n}$. \end{itemize} \item \textbf{Size/Length}: \begin{itemize} \item Returns the number of key-value pairs in the dictionary. - \item Time Complexity: \tco{1} (stored separately). + \item Time Complexity: $\tco{1}$ (stored separately). \end{itemize} \item \textbf{Clear}: \begin{itemize} \item Removes all key-value pairs from the dictionary. - \item Time Complexity: \tco{n} (depends on implementation, some implementations might be faster). + \item Time Complexity: $\tco{n}$ (depends on implementation, some implementations might be faster). \end{itemize} \end{enumerate} @@ -152,19 +152,19 @@ to implement the dictionary. \begin{enumerate} \item \textbf{Hash Table:} \begin{itemize} - \item Average case: \tct{n}, where $n$ is the number of key-value pairs. + \item Average case: $\tct{n}$, where $n$ is the number of key-value pairs. \item Additional space can be used for maintaining hash table buckets, which may lead to higher constant factors but not asymptotic growth in complexity. \end{itemize} \item \textbf{Balanced Binary Search Tree (e.g., AVL tree or Red-Black Tree):} \begin{itemize} - \item Space Complexity: \tco{n}. + \item Space Complexity: $\tco{n}$. \item This structure uses more space compared to a hash table due to the need for storing balance information at each node. \end{itemize} \item \textbf{Dynamic Array:} \begin{itemize} \item This is not a common implementation for dictionaries due to inefficiencies in search and insertion operations compared to hash tables or balanced trees. - \item Space Complexity: \tco{n}. - \item Time complexity for insertion, deletion, and access can degrade significantly to \tco{n} without additional optimizations. + \item Space Complexity: $\tco{n}$. + \item Time complexity for insertion, deletion, and access can degrade significantly to $\tco{n}$ without additional optimizations. \end{itemize} \end{enumerate} @@ -177,9 +177,9 @@ to implement the dictionary. \toprule \textbf{Operation} & \textbf{Unsorted Arrays} & \textbf{Sorted Arrays} & \textbf{Doubly Linked Lists} & \textbf{Binary Trees} & \textbf{AVL Trees} \\ \midrule - Insertion & \tco{1} & \tco{n} & \tco{1} & \tco{h} & \tco{\log n} \\ - Deletion & \tco{n} & \tco{(n)} & \tco{n} & \tco{h} & \tco{\log n} \\ - Search & \tco{n} & \tco{\log n} & \tco{n} & \tco{h} & \tco{\log n} \\ + Insertion & $\tco{1}$ & $\tco{n}$ & $\tco{1}$ & $\tco{h}$ & $\tco{\log n}$ \\ + Deletion & $\tco{n}$ & $\tco{(n)}$ & $\tco{n}$ & $\tco{h}$ & $\tco{\log n}$ \\ + Search & $\tco{n}$ & $\tco{\log n}$ & $\tco{n}$ & $\tco{h}$ & $\tco{\log n}$ \\ \bottomrule \end{tabular} \caption{Time Complexities of Dictionary Operations for Various Data Structures} diff --git a/semester1/algorithms-and-datastructures/parts/dp.tex b/semester1/algorithms-and-datastructures/parts/dp.tex index 7b1341c..62a9b40 100644 --- a/semester1/algorithms-and-datastructures/parts/dp.tex +++ b/semester1/algorithms-and-datastructures/parts/dp.tex @@ -43,13 +43,13 @@ Here, the concept is to either choose an element or not to do so, i.e. the recur The same algorithm can also be adapted for minimum subarray sum, or other problems using the same idea. -\timecomplexity \tct{n} (Polynomial) +\timecomplexity $\tct{n}$ (Polynomial) \subsubsection{Jump Game} We want to return the minimum number of jumps to get to a position $n$. Each field at an index $i$ has a number $A[i]$ that tells us how far we can jump at most. -A somewhat efficient way to solve this problem is the recurrence relation $M[k] = \max\{i + A[i] | 1 \leq i \leq M[k - 1]\}$, but an even more efficient one is based on $M[k] = \max \{i + A[i] | M[k - 2] < i \leq M[k - 1]\}$, which essentially uses the fact that we only need to look at all $i$ that can be reached with \textit{exactly} $l - 1$ jumps, since $i \leq M[k - 2]$ can already be reached with $k - 2$ jumps. While the first one has time complexity \tco{n^2}, the new one has \tco{n} +A somewhat efficient way to solve this problem is the recurrence relation $M[k] = \max\{i + A[i] | 1 \leq i \leq M[k - 1]\}$, but an even more efficient one is based on $M[k] = \max \{i + A[i] | M[k - 2] < i \leq M[k - 1]\}$, which essentially uses the fact that we only need to look at all $i$ that can be reached with \textit{exactly} $l - 1$ jumps, since $i \leq M[k - 2]$ can already be reached with $k - 2$ jumps. While the first one has time complexity $\tco{n^2}$, the new one has $\tco{n}$ \newpage @@ -80,7 +80,7 @@ A somewhat efficient way to solve this problem is the recurrence relation $M[k] To find the actual solution (in the sense of which letters are in the longest common subsequence), we need to use backtracking, i.e. finding which letters we picked. -\timecomplexity \tct{n \cdot m} (Polynomial) +\timecomplexity $\tct{n \cdot m}$ (Polynomial) \subsubsection{Editing distance} @@ -95,12 +95,12 @@ The recurrence relation is $ED(i, j) = \min \begin{cases} \end{cases} \end{cases}$ -\timecomplexity \tct{n \cdot m} (Polynomial) +\timecomplexity $\tct{n \cdot m}$ (Polynomial) \subsubsection{Subset sum} We want to find a subset of a set $A[1], \ldots, A[n]$ such that the sum of them equals a number $b$. Its recurrence relation is $T(i, s) = T(i - 1, s) \lor T(i - 1, s - A[i])$, where $i$ is the $i$-th entry in the array and $s$ the current sum. Base cases are $T(0, s) = false$ and $T(0, 0) = true$. In our DP-Table, we store if the subset sum can be constructed up to this element. Therefore, the DP table is a boolean table and the value $T(n, b)$ only tells us if we have a solution or not. To find the solution, we need to backtrack again. -\timecomplexity \tct{n \cdot b} (Pseudopolynomial) +\timecomplexity $\tct{n \cdot b}$ (Pseudopolynomial) \subsubsection{Knapsack problem} @@ -111,7 +111,7 @@ The recurrence relation is $DP(i, w) = \begin{cases} \max\{DP(i - 1, w), P[i] + DP(i - 1, w - W[i])\} & \text{else} \end{cases}$. The solution can be found in $P(n, W)$, where $W$ is the weight limit. -\timecomplexity \tct{n \cdot W} (Pseudopolynomial) +\timecomplexity $\tct{n \cdot W}$ (Pseudopolynomial) \newpage @@ -144,7 +144,7 @@ We can use approximation to solve the Knapsack problem in polynomial time. For t \end{spacing} \end{algorithm} -\timecomplexity \tco{n \cdot \log(n)} +\timecomplexity $\tco{n \cdot \log(n)}$ \subsection{Matrix chain multiplication} @@ -156,4 +156,5 @@ The recurrence relation for this problem is $M(i, j) = \begin{cases} \end{cases}$ -\timecomplexity \tco{n^3} +\timecomplexity $\tco{n^3}$ + diff --git a/semester1/algorithms-and-datastructures/parts/graphs/all-pairs-sp.tex b/semester1/algorithms-and-datastructures/parts/graphs/all-pairs-sp.tex index f1df7be..c543a87 100644 --- a/semester1/algorithms-and-datastructures/parts/graphs/all-pairs-sp.tex +++ b/semester1/algorithms-and-datastructures/parts/graphs/all-pairs-sp.tex @@ -27,7 +27,7 @@ We can also use $n$-times dijkstra or any other shortest path algorithm, or any \begin{properties}[]{Characteristics of Floyd-Warshall Algorithm} \begin{itemize} - \item \textbf{Time Complexity:} \tco{|V|^3}. + \item \textbf{Time Complexity:} $\tco{|V|^3}$. \item Works for graphs with negative edge weights but no negative weight cycles. \item Computes shortest paths for all pairs in one execution. \end{itemize} @@ -82,7 +82,7 @@ We can also use $n$-times dijkstra or any other shortest path algorithm, or any \item Reweight edges to remove negative weights. \item Use Dijkstra's algorithm for each vertex to find shortest paths. \end{enumerate} - \item \textbf{Time Complexity:} \tco{|V| \cdot (|E| + |V| \log |V|)}. + \item \textbf{Time Complexity:} $\tco{|V| \cdot (|E| + |V| \log |V|)}$. \item Efficient for sparse graphs compared to Floyd-Warshall. \end{itemize} \end{properties} @@ -140,8 +140,8 @@ We can also use $n$-times dijkstra or any other shortest path algorithm, or any \toprule \textbf{Algorithm} & \textbf{Primary Use} & \textbf{Time Complexity} & \textbf{Remarks} \\ \midrule - Floyd-Warshall & AP-SP & \tco{|V|^3} & Handles negative weights \\ - Johnson’s Algorithm & AP-SP (sparse graphs) & \tco{|V|(|E| + |V| \log |V|)} & Requires reweighting \\ + Floyd-Warshall & AP-SP & $\tco{|V|^3}$ & Handles negative weights \\ + Johnson’s Algorithm & AP-SP (sparse graphs) & $\tco{|V|(|E| + |V| \log |V|)}$ & Requires reweighting \\ \bottomrule \end{tabular} \caption{Comparison of the All-Pair Shortest path (AP-SP) algorithms discussed in the lecture} diff --git a/semester1/algorithms-and-datastructures/parts/graphs/bfs-dfs.tex b/semester1/algorithms-and-datastructures/parts/graphs/bfs-dfs.tex index 73efa6a..2d01687 100644 --- a/semester1/algorithms-and-datastructures/parts/graphs/bfs-dfs.tex +++ b/semester1/algorithms-and-datastructures/parts/graphs/bfs-dfs.tex @@ -43,7 +43,7 @@ \begin{properties}[]{Depth-First Search} \begin{itemize} \item Can be implemented recursively or iteratively (using a stack). - \item Time complexity: \tco{|V| + |E|}, where $|V|$ is the number of vertices and $|E|$ is the number of edges. + \item Time complexity: $\tco{|V| + |E|}$, where $|V|$ is the number of vertices and $|E|$ is the number of edges. \item Used for: \begin{itemize} \item Detecting cycles in directed and undirected graphs. @@ -81,7 +81,7 @@ \begin{properties}[]{Breadth-First Search} \begin{itemize} \item Implements a queue-based approach for level-order traversal. - \item Time complexity: \tco{|V| + |E|}. + \item Time complexity: $\tco{|V| + |E|}$. \item Used for: \begin{itemize} \item Finding shortest paths in unweighted graphs. diff --git a/semester1/algorithms-and-datastructures/parts/graphs/matrix.tex b/semester1/algorithms-and-datastructures/parts/graphs/matrix.tex index 6bc9673..1c75804 100644 --- a/semester1/algorithms-and-datastructures/parts/graphs/matrix.tex +++ b/semester1/algorithms-and-datastructures/parts/graphs/matrix.tex @@ -7,8 +7,8 @@ \begin{properties}[]{Characteristics of Strassen’s Algorithm} \begin{itemize} - \item \textbf{Standard Multiplication:} Requires \tco{n^3} time for two $n \times n$ matrices. - \item \textbf{Strassen’s Approach:} Reduces the complexity to \tco{n^{\log_2 7}} (approximately \tco{n^{2.81}}). + \item \textbf{Standard Multiplication:} Requires $\tco{n^3}$ time for two $n \times n$ matrices. + \item \textbf{Strassen’s Approach:} Reduces the complexity to $\tco{n^{\log_2 7}}$ (approximately $\tco{n^{2.81}}$). \item \textbf{Idea:} Uses divide-and-conquer to reduce the number of scalar multiplications from $8$ to $7$ in each recursive step. \item Useful for applications involving large matrix multiplications. \end{itemize} diff --git a/semester1/algorithms-and-datastructures/parts/graphs/mst/boruvka.tex b/semester1/algorithms-and-datastructures/parts/graphs/mst/boruvka.tex index 6225e60..23e13a6 100644 --- a/semester1/algorithms-and-datastructures/parts/graphs/mst/boruvka.tex +++ b/semester1/algorithms-and-datastructures/parts/graphs/mst/boruvka.tex @@ -8,8 +8,8 @@ \begin{itemize} \item \textbf{Graph Type:} Works on undirected, weighted graphs. \item \textbf{Approach:} Greedy, component-centric. - \item \textbf{Time Complexity:} \tct{(|V| + |E|) \log(|V|)}. - \item \textbf{Space Complexity:} Depends on the graph representation, typically \tct{E + V}. + \item \textbf{Time Complexity:} $\tct{(|V| + |E|) \log(|V|)}$. + \item \textbf{Space Complexity:} Depends on the graph representation, typically $\tct{E + V}$. \item \textbf{Limitations:} Efficient for parallel implementations but less commonly used in practice compared to Kruskal's and Prim's. \end{itemize} \end{properties} diff --git a/semester1/algorithms-and-datastructures/parts/graphs/mst/kruskal.tex b/semester1/algorithms-and-datastructures/parts/graphs/mst/kruskal.tex index 4263290..7fe1992 100644 --- a/semester1/algorithms-and-datastructures/parts/graphs/mst/kruskal.tex +++ b/semester1/algorithms-and-datastructures/parts/graphs/mst/kruskal.tex @@ -8,9 +8,9 @@ \begin{itemize} \item \textbf{Graph Type:} Works on undirected, weighted graphs. \item \textbf{Approach:} Greedy, edge-centric. - \item \textbf{Time Complexity:} \tco{|E| \log (|E|)} (for sort), \tco{|V| \log(|V|)} (for union find data structure).\\ - \timecomplexity \tco{|E| \log(|E|) + |V| \log(|V|)} - \item \textbf{Space Complexity:} Depends on the graph representation, typically \tct{E + V}. + \item \textbf{Time Complexity:} $\tco{|E| \log (|E|)}$ (for sort), $\tco{|V| \log(|V|)}$ (for union find data structure).\\ + \timecomplexity $\tco{|E| \log(|E|) + |V| \log(|V|)}$ + \item \textbf{Space Complexity:} Depends on the graph representation, typically $\tct{E + V}$. \item \textbf{Limitations:} Requires sorting of edges, which can dominate runtime. \end{itemize} \end{properties} @@ -127,8 +127,8 @@ \begin{properties}[]{Performance} \begin{itemize} - \item \textsc{make}$(V)$: Initialize data structure \tco{n} - \item \textsc{same}$(u, v)$: Check if two components belong to the same set \tco{1} or \tco{n}, depending on if the representant is stored in an array or not - \item \textsc{union}$(u, v)$: Combine two sets, \tco{\log(n)}, in Kruskal we call this \tco{n} times, so total number (amortised) is \tco{n \log(n)} + \item \textsc{make}$(V)$: Initialize data structure $\tco{n}$ + \item \textsc{same}$(u, v)$: Check if two components belong to the same set $\tco{1}$ or $\tco{n}$, depending on if the representant is stored in an array or not + \item \textsc{union}$(u, v)$: Combine two sets, $\tco{\log(n)}$, in Kruskal we call this $\tco{n}$ times, so total number (amortised) is $\tco{n \log(n)}$ \end{itemize} \end{properties} diff --git a/semester1/algorithms-and-datastructures/parts/graphs/mst/prim.tex b/semester1/algorithms-and-datastructures/parts/graphs/mst/prim.tex index 398d9df..9312b95 100644 --- a/semester1/algorithms-and-datastructures/parts/graphs/mst/prim.tex +++ b/semester1/algorithms-and-datastructures/parts/graphs/mst/prim.tex @@ -12,10 +12,10 @@ \item \textbf{Approach:} Greedy, vertex-centric. \item \textbf{Time Complexity:} \begin{itemize} - \item With an adjacency matrix: \tct{V^2}. - \item With a priority queue and adjacency list: \tct{(|V| + |E|) \log(|V|)}. + \item With an adjacency matrix: $\tct{V^2}$. + \item With a priority queue and adjacency list: $\tct{(|V| + |E|) \log(|V|)}$. \end{itemize} - \item \textbf{Space Complexity:} Depends on the graph representation, typically \tct{E + V}. + \item \textbf{Space Complexity:} Depends on the graph representation, typically $\tct{E + V}$. \item \textbf{Limitations:} Less efficient than Kruskal's for sparse graphs using adjacency matrices. \end{itemize} \end{properties} diff --git a/semester1/algorithms-and-datastructures/parts/graphs/shortest-path.tex b/semester1/algorithms-and-datastructures/parts/graphs/shortest-path.tex index 5e9b29c..71b9d6a 100644 --- a/semester1/algorithms-and-datastructures/parts/graphs/shortest-path.tex +++ b/semester1/algorithms-and-datastructures/parts/graphs/shortest-path.tex @@ -29,8 +29,8 @@ \begin{itemize} \item \textbf{Time Complexity:} \begin{itemize} - \item \tco{|V|^2} for a simple implementation. - \item \tco{(|V| + |E|) \log |V|} using a priority queue. + \item $\tco{|V|^2}$ for a simple implementation. + \item $\tco{(|V| + |E|) \log |V|}$ using a priority queue. \end{itemize} \item Only works with non-negative edge weights. \item Greedy algorithm that processes vertices in increasing order of distance. @@ -112,7 +112,7 @@ \begin{properties}[]{Characteristics of Bellman-Ford Algorithm} \begin{itemize} - \item \textbf{Time Complexity:} \tco{|V| \cdot |E|}. + \item \textbf{Time Complexity:} $\tco{|V| \cdot |E|}$. \item Can handle graphs with negative edge weights but not graphs with negative weight cycles. \item Used for: \begin{itemize} @@ -161,7 +161,7 @@ \midrule Handles Negative Weights & No & Yes \\ Detects Negative Cycles & No & Yes \\ - Time Complexity & \tco{(|V| + |E|) \log |V|} & \tco{|V| \cdot |E|} \\ + Time Complexity & $\tco{(|V| + |E|) \log |V|}$ & $\tco{|V| \cdot |E|}$ \\ Algorithm Type & Greedy & Dynamic Programming \\ \bottomrule \end{tabular} diff --git a/semester1/algorithms-and-datastructures/parts/intro.tex b/semester1/algorithms-and-datastructures/parts/intro.tex index f0c68d1..087ecb9 100644 --- a/semester1/algorithms-and-datastructures/parts/intro.tex +++ b/semester1/algorithms-and-datastructures/parts/intro.tex @@ -16,8 +16,8 @@ \subsection{Asymptotic Growth} $f$ grows asymptotically slower than $g$ if $\displaystyle\lim_{m \rightarrow \infty} \frac{f(m)}{g(m)} = 0$. -We can remark that $f$ is upper-bounded by $g$, thus $f \leq$\tco{g} and we can say $g$ is lower bounded by $f$, thus $g \geq$ \tcl{f}. -If two functions grow equally fast asymptotically, \tct{f} $= g$ +We can remark that $f$ is upper-bounded by $g$, thus $f \leq \tco{g}$ and we can say $g$ is lower bounded by $f$, thus $g \geq \tcl{f}$. +If two functions grow equally fast asymptotically, $\tct{f} = g$ \subsection{Runtime evaluation} @@ -89,5 +89,5 @@ Therefore, the summation evaluates to $15$. \subsection{Specific examples} \begin{align*} - \frac{n}{\log(n)} \geq \Omega(\sqrt{n}) \Leftrightarrow \sqrt{n} \leq \text{\tco{\frac{n}{\log(n)}}} + \frac{n}{\log(n)} \geq \Omega(\sqrt{n}) \Leftrightarrow \sqrt{n} \leq \tco{\frac{n}{\log(n)}} \end{align*} diff --git a/semester1/algorithms-and-datastructures/parts/search/comparison-based-sort.tex b/semester1/algorithms-and-datastructures/parts/search/comparison-based-sort.tex index 383cb80..b17cb0a 100644 --- a/semester1/algorithms-and-datastructures/parts/search/comparison-based-sort.tex +++ b/semester1/algorithms-and-datastructures/parts/search/comparison-based-sort.tex @@ -26,7 +26,7 @@ First, how to check if an array is sorted. This can be done in linear time: \begin{algorithmic}[1] \For{$i \gets 1, 2, \ldots, n$} \For{$j \gets 1, 2, \ldots, n$} - \If{$A[j] > A[j + 1]$} + \If{$A[j] > A[j + 1]$} \State exchange $A[j]$ and $A[j + 1]$ \Comment{Causes the element to ``bubble up''} \EndIf \EndFor @@ -54,7 +54,7 @@ The concept for this algorithm is selecting an element (that being the largest o \end{spacing} \end{algorithm} -\tc{n^2} because we have runtime \tco{n} for the search of the maximal entry and run through the loop \tco{n} times, but we have saved some runtime elsewhere, which is not visible in the asymptotic time complexity compared to bubble sort. +\tc{n^2} because we have runtime $\tco{n}$ for the search of the maximal entry and run through the loop $\tco{n}$ times, but we have saved some runtime elsewhere, which is not visible in the asymptotic time complexity compared to bubble sort. @@ -66,16 +66,16 @@ The concept for this algorithm is selecting an element (that being the largest o \end{definition} \begin{properties}[]{Characteristics and Performance} -\begin{itemize} - \item \textbf{Efficiency:} Works well for small datasets or nearly sorted arrays. - \item \textbf{Time Complexity:} \begin{itemize} - \item Best case (already sorted): \tcl{n\log(n)} - \item Worst case (reversed order): \tco{n^2} - \item Average case: \tct{n^2} + \item \textbf{Efficiency:} Works well for small datasets or nearly sorted arrays. + \item \textbf{Time Complexity:} + \begin{itemize} + \item Best case (already sorted): $\tcl{n\log(n)}$ + \item Worst case (reversed order): $\tco{n^2}$ + \item Average case: $\tct{n^2}$ + \end{itemize} + \item \textbf{Limitations:} Inefficient on large datasets due to its $\tct{n^2}$ time complexity and requires additional effort for linked list implementations. \end{itemize} - \item \textbf{Limitations:} Inefficient on large datasets due to its \tct{n^2} time complexity and requires additional effort for linked list implementations. -\end{itemize} \end{properties} \begin{algorithm} @@ -83,15 +83,15 @@ The concept for this algorithm is selecting an element (that being the largest o \caption{\textsc{insertionSort(A)}} \begin{algorithmic}[1] \Procedure{InsertionSort}{$A$} - \For{$i \gets 2$ to $n$} \Comment{Iterate over the array} - \State $key \gets A[i]$ \Comment{Element to be inserted} - \State $j \gets i - 1$ - \While{$j > 0$ and $A[j] > key$} - \State $A[j+1] \gets A[j]$ \Comment{Shift elements} - \State $j \gets j - 1$ - \EndWhile - \State $A[j+1] \gets key$ \Comment{Insert element} - \EndFor + \For{$i \gets 2$ to $n$} \Comment{Iterate over the array} + \State $key \gets A[i]$ \Comment{Element to be inserted} + \State $j \gets i - 1$ + \While{$j > 0$ and $A[j] > key$} + \State $A[j+1] \gets A[j]$ \Comment{Shift elements} + \State $j \gets j - 1$ + \EndWhile + \State $A[j+1] \gets key$ \Comment{Insert element} + \EndFor \EndProcedure \end{algorithmic} \end{spacing} @@ -104,21 +104,21 @@ The concept for this algorithm is selecting an element (that being the largest o \newpage \subsubsection{Merge Sort} \begin{definition}[]{Definition of Merge Sort} -Merge Sort is a divide-and-conquer algorithm that splits the input array into two halves, recursively sorts each half, and then merges the two sorted halves into a single sorted array. This process continues until the base case of a single element or an empty array is reached, as these are inherently sorted. + Merge Sort is a divide-and-conquer algorithm that splits the input array into two halves, recursively sorts each half, and then merges the two sorted halves into a single sorted array. This process continues until the base case of a single element or an empty array is reached, as these are inherently sorted. \end{definition} \begin{properties}[]{Characteristics and Performance of Merge Sort} -\begin{itemize} - \item \textbf{Efficiency:} Suitable for large datasets due to its predictable time complexity. - \item \textbf{Time Complexity:} \begin{itemize} - \item Best case: \tcl{n \log n} - \item Worst case: \tco{n \log n} - \item Average case: \tct{n \log n} + \item \textbf{Efficiency:} Suitable for large datasets due to its predictable time complexity. + \item \textbf{Time Complexity:} + \begin{itemize} + \item Best case: $\tcl{n \log n}$ + \item Worst case: $\tco{n \log n}$ + \item Average case: $\tct{n \log n}$ + \end{itemize} + \item \textbf{Space Complexity:} Requires additional memory for temporary arrays, typically $\tct{n}$. + \item \textbf{Limitations:} Not in-place, and memory overhead can be significant for large datasets. \end{itemize} - \item \textbf{Space Complexity:} Requires additional memory for temporary arrays, typically \tct{n}. - \item \textbf{Limitations:} Not in-place, and memory overhead can be significant for large datasets. -\end{itemize} \end{properties} \begin{algorithm} @@ -135,7 +135,7 @@ Merge Sort is a divide-and-conquer algorithm that splits the input array into tw \State \Call{Merge}{$A, l, m, r$} \EndProcedure - \Procedure{Merge}{$A[1..n], l, m, r$} \Comment{Runtime: \tco{n}} + \Procedure{Merge}{$A[1..n], l, m, r$} \Comment{Runtime: $\tco{n}$} \State $result \gets$ new array of size $r - l + 1$ \State $i \gets l$ \State $j \gets m + 1$ @@ -161,12 +161,12 @@ Merge Sort is a divide-and-conquer algorithm that splits the input array into tw \centering \begin{tabular}{lccccc} \toprule - \textbf{Algorithm} & \textbf{Comparisons} & \textbf{Operations} & \textbf{Space Complexity} & \textbf{Locality} & \textbf{Time complexity}\\ + \textbf{Algorithm} & \textbf{Comparisons} & \textbf{Operations} & \textbf{Space Complexity} & \textbf{Locality} & \textbf{Time complexity} \\ \midrule - \textit{Bubble-Sort} & \tco{n^2} & \tco{n^2} & \tco{1} & good & \tco{n^2}\\ - \textit{Selection-Sort} & \tco{n^2} & \tco{n} & \tco{1} & good & \tco{n^2}\\ - \textit{Insertion-Sort} & \tco{n \cdot \log(n)} & \tco{n^2} & \tco{1} & good & \tco{n^2}\\ - \textit{Merge-Sort} & \tco{n\cdot \log(n)} & \tco{n \cdot \log(n)} & \tco{n} & good & \tco{n \cdot \log(n)}\\ + \textit{Bubble-Sort} & $\tco{n^2}$ & $\tco{n^2}$ & $\tco{1}$ & good & $\tco{n^2}$ \\ + \textit{Selection-Sort} & $\tco{n^2}$ & $\tco{n}$ & $\tco{1}$ & good & $\tco{n^2}$ \\ + \textit{Insertion-Sort} & $\tco{n \cdot \log(n)}$ & $\tco{n^2}$ & $\tco{1}$ & good & $\tco{n^2}$ \\ + \textit{Merge-Sort} & $\tco{n\cdot \log(n)}$ & $\tco{n \cdot \log(n)}$ & $\tco{n}$ & good & $\tco{n \cdot \log(n)}$ \\ \bottomrule \end{tabular} \caption{Comparison of four comparison-based sorting algorithms discussed in the lecture. Operations designates the number of write operations in RAM} diff --git a/semester1/algorithms-and-datastructures/parts/search/heap-sort.tex b/semester1/algorithms-and-datastructures/parts/search/heap-sort.tex index a6ed404..1a2e139 100644 --- a/semester1/algorithms-and-datastructures/parts/search/heap-sort.tex +++ b/semester1/algorithms-and-datastructures/parts/search/heap-sort.tex @@ -9,11 +9,11 @@ \item \textbf{Efficiency:} Excellent for in-place sorting with predictable performance. \item \textbf{Time Complexity:} \begin{itemize} - \item Best case: \tcl{n \log n} - \item Worst case: \tco{n \log n} - \item Average case: \tct{n \log n} + \item Best case: $\tcl{n \log n}$ + \item Worst case: $\tco{n \log n}$ + \item Average case: $\tct{n \log n}$ \end{itemize} - \item \textbf{Space Complexity:} In-place sorting requires \tct{1} additional space. + \item \textbf{Space Complexity:} In-place sorting requires $\tct{1}$ additional space. \item \textbf{Limitations:} Inefficient compared to Quick Sort for most practical datasets. \end{itemize} \end{properties} @@ -46,11 +46,11 @@ The lecture does not cover the implementation of a heap tree. See the specific s \item \textbf{Efficiency:} Performs well for uniformly distributed datasets. \item \textbf{Time Complexity:} \begin{itemize} - \item Best case: \tcl{n + k} (for uniform distribution and $k$ buckets) - \item Worst case: \tco{n^2} (when all elements fall into a single bucket) - \item Average case: \tct{n + k} + \item Best case: $\tcl{n + k}$ (for uniform distribution and $k$ buckets) + \item Worst case: $\tco{n^2}$ (when all elements fall into a single bucket) + \item Average case: $\tct{n + k}$ \end{itemize} - \item \textbf{Space Complexity:} Requires \tct{n + k} additional space. + \item \textbf{Space Complexity:} Requires $\tct{n + k}$ additional space. \item \textbf{Limitations:} Performance depends on the choice of bucket size and distribution of input elements. \end{itemize} \end{properties} @@ -99,9 +99,9 @@ The lecture does not cover the implementation of a heap tree. See the specific s \end{itemize} \item \textbf{Time Complexity:} \begin{itemize} - \item Insert: \tct{\log n}. - \item Extract Min/Max: \tct{\log n}. - \item Build Heap: \tct{n}. + \item Insert: $\tct{\log n}$. + \item Extract Min/Max: $\tct{\log n}$. + \item Build Heap: $\tct{n}$. \end{itemize} \end{itemize} \end{properties} diff --git a/semester1/algorithms-and-datastructures/parts/search/quick-sort.tex b/semester1/algorithms-and-datastructures/parts/search/quick-sort.tex index 137c143..35cdec0 100644 --- a/semester1/algorithms-and-datastructures/parts/search/quick-sort.tex +++ b/semester1/algorithms-and-datastructures/parts/search/quick-sort.tex @@ -9,11 +9,11 @@ \item \textbf{Efficiency:} Performs well on average and for in-place sorting but can degrade on specific inputs. \item \textbf{Time Complexity:} \begin{itemize} - \item Best case: \tcl{n \log n} - \item Worst case: \tco{n^2} (when the pivot is poorly chosen) - \item Average case: \tct{n \log n} + \item Best case: $\tcl{n \log n}$ + \item Worst case: $\tco{n^2}$ (when the pivot is poorly chosen) + \item Average case: $\tct{n \log n}$ \end{itemize} - \item \textbf{Space Complexity:} In-place sorting typically requires \tct{\log n} additional space for recursion. + \item \textbf{Space Complexity:} In-place sorting typically requires $\tct{\log n}$ additional space for recursion. \item \textbf{Limitations:} Performance depends heavily on pivot selection. \end{itemize} \end{properties}