pull/2/head
Oliver Kennedy 2022-10-25 23:40:04 -04:00
parent 8f8388db8a
commit b032366751
Signed by: okennedy
GPG Key ID: 3E5F9B3ABD3FDB60
1 changed files with 57 additions and 51 deletions

View File

@ -137,11 +137,15 @@ cat: graphics/23b/cat.png
<p>An <u>unordered</u> collection of <u>unique</u> elements.</p>
<ul>
<li>Order doesn't matter</li>
<li>At most one copy of each item <span class="fragment">(key)</span>.</li>
<li>At most one copy of each item <span class="fragment">(key)</span></li>
</ul>
</div>
</section>
<div class="fragment" style="text-align: left">
<section>
<h4 class="slide_title">Set</h4>
<div style="text-align: left">
<tt>mutable.Set[T]</tt>
<dl>
<dt style="font-family: courier, monospace;">add(element: T): Unit</dt>
@ -167,7 +171,11 @@ cat: graphics/23b/cat.png
<li>Multiple copies of a key allowed.</li>
</ul>
</div>
</section>
<section>
<h4 class="slide_title">Bag</h4>
<div style="text-align: left">
<tt>mutable.Bag[T]</tt>
<dl>
@ -221,12 +229,12 @@ cat: graphics/23b/cat.png
<section>
<h4 class="slide_title">Tree Terminology</h4>
<dl>
<dl style="font-size: 80%">
<dt>Rooted, Directed Tree</dt>
<dd><b>Root</b> is the source node</dd>
<dt><u>Parent</u> of node X</dt>
<dd>A node with an out-edge to X (Note: Max in-degree of 1)</dd>
<dd>A node with an out-edge to X (Max 1)</dd>
<dt><u>Child</u> of node X</dt>
<dd>A node with an in-edge from X</dd>
@ -249,7 +257,7 @@ cat: graphics/23b/cat.png
<dt><u>Size</u> of a tree ($n$)</dt>
<dd>The number of nodes in the tree</dd>
<dt>Height/Depth of a tree< ($d$)/dt>
<dt>Height/Depth of a tree ($d$)</dt>
<dd>The height of the root / depth of the deepest leaf.</dd>
</dl>
</section>
@ -259,15 +267,15 @@ cat: graphics/23b/cat.png
<dl>
<dt><u>Binary Tree</u></dt>
<dt>Every vertex has at most 2 children</dt>
<dd>Every vertex has at most 2 children</dd>
<dt><u>Complete Binary Tree</u></dt>
<dt>All leaf vertices at the deepest 2 levels.</dt>
<dd>All leaf vertices at the deepest 2 levels.</dd>
<dt><u>Full Binary Tree</u></dt>
<dt>All leaf vertices at the deepest level.</dt>
<dt>(Every vertex has exactly 0 or 2 children)</dt>
<dt>$$d = \log(n)$$</dt>
<dd>All leaf vertices at the deepest level.</dd>
<dd>(Every vertex has exactly 0 or 2 children)</dd>
<dd>$$d = \log(n)$$</dd>
</dl>
</section>
@ -311,11 +319,15 @@ cat: graphics/23b/cat.png
<h4 class="slide_title">Case Classes/Objects</h4>
<dl>
<dt>Feature 1: Inline constructors (no <tt>new</tt>)</dt>
<dd><tt>TreeNode(10, EmptyTree, EmptyTree)</tt></dd>
<dt>Feature 2: Match deconstructors</dt>
<dd><tt>foo match { case TreeNode(v, l, r) => ... }</tt></dd>
<div class="fragment">
<dt>Feature 1: Inline constructors (no <tt>new</tt>)</dt>
<dd><tt>TreeNode(10, EmptyTree, EmptyTree)</tt></dd>
</div>
<div class="fragment">
<dt>Feature 2: Match deconstructors</dt>
<dd><tt>foo match { case TreeNode(v, l, r) => ... }</tt></dd>
</div>
</dl>
</section>
@ -343,9 +355,9 @@ cat: graphics/23b/cat.png
<p>The height of a tree is the height of the root.</p>
<div class="fragment">
<div class="fragment" style="font-size: 70%">
$$h(root) = \begin{cases}
0 & \textbf{if the tree is empty}
0 & \textbf{if the tree is empty}\\
1 + max(h(\texttt{root.left}), h(\texttt{root.right})) & \textbf{otherwise}
\end{cases}$$
</div>
@ -354,11 +366,12 @@ cat: graphics/23b/cat.png
<section>
<h4 class="slide_title">Computing Tree Height</h4>
$$h(root) = \begin{cases}
0 & \textbf{if the tree is empty}
1 + max(h(\texttt{root.left}), h(\texttt{root.right})) & \textbf{otherwise}
\end{cases}$$
<div style="font-size: 70%">
$$h(root) = \begin{cases}
0 & \textbf{if the tree is empty}\\
1 + max(h(\texttt{root.left}), h(\texttt{root.right})) & \textbf{otherwise}
\end{cases}$$
</div>
<pre><code class="scala">
def height[T](root: Tree[T]): Int =
{
@ -378,16 +391,16 @@ cat: graphics/23b/cat.png
<p>A <b>Binary Tree</b> over where each node stores a unique key, and a value's keys are ordered.</p>
<div style="text-align: left" class="fragment">
<div style="text-align: left; font-size: 80%;" class="fragment">
<h5>Enforce Constraints</h5>
<ul>
<li class="fragment">No duplicate keys</li>
<li class="fragment">For every node $X_L$ in the left sub-tree of a node $X_1$: $X_L\texttt{.key} < X_1\texttt{.key}</li>
<li class="fragment">For every node $X_R$ in the left sub-tree of a node $X_1$: $X_R\texttt{.key} > X_1\texttt{.key}</li>
<li class="fragment">For every node $X_L$ in the left sub-tree of a node $X_1$: $X_L\texttt{.key} < X_1\texttt{.key}$</li>
<li class="fragment">For every node $X_R$ in the left sub-tree of a node $X_1$: $X_R\texttt{.key} > X_1\texttt{.key}$</li>
</ul>
</div>
<p class="fragment">$X_1$ partitions its children.</p>
<p class="fragment">$X_1$ <u>partitions</u> its children.</p>
</section>
<section>
@ -400,8 +413,8 @@ cat: graphics/23b/cat.png
<ul>
<li class="fragment">Is root empty? <span class="fragment">(if so, not present)</span></li>
<li class="fragment">Does <tt>root.value</tt> have key $k$? <span class="fragment">(If so, done!)</span></li>
<li class="fragment">Is <tt>root.value</tt>'s key greater than $k$? <span class="fragment">(Must be down left subtree)</span></li>
<li class="fragment">Is <tt>root.value</tt>'s key lesser than $k$? <span class="fragment">(Must be down right subtree)</span></li>
<li class="fragment">Is $k$ lesser than <tt>root.value</tt>'s key? <span class="fragment">(Try left subtree)</span></li>
<li class="fragment">Is $k$ greater than <tt>root.value</tt>'s key? <span class="fragment">(Try right subtree)</span></li>
</ul>
</section>
@ -409,21 +422,15 @@ cat: graphics/23b/cat.png
<h4 class="slide_title">Find</h4>
<pre><code class="scala">
def find[V: Ordering](root: BST[V], target: V): Option[V] =
{
root match {
case TreeNode(v, left, right) =>
if(Ordering[V].lt( target, v ) ){
return find(left, target)
} else if(Ordering[V].lt( v, target ) ){
return find(right, target)
} else {
return Some(v)
}
def find[V: Ordering](root: BST[V], target: V): Option[V] =
root match {
case TreeNode(v, left, right) =>
if(Ordering[V].lt( target, v )){ return find(left, target) }
else if(Ordering[V].lt( v, target )){ return find(right, target) }
else { return Some(v) }
case EmptyTree =>
return None
}
case EmptyTree =>
return None
}
</code></pre>
<p class="fragment">What's the complexity? <span class="fragment">(how many times do we call 'find'?)</span> <span class="fragment">$O(d)$</span></p>
@ -439,17 +446,15 @@ cat: graphics/23b/cat.png
<ul>
<li class="fragment">Is root empty? <span class="fragment">(if so, insert here)</span></li>
<li class="fragment">Does <tt>root.value</tt> have key $k$? <span class="fragment">(If so, already present!)</span></li>
<li class="fragment">Is <tt>root.value</tt>'s key greater than $k$? <span class="fragment">(Insert down left subtree)</span></li>
<li class="fragment">Is <tt>root.value</tt>'s key lesser than $k$? <span class="fragment">(Insert down right subtree)</span></li>
<li class="fragment">Is <tt>root.value</tt>'s key greater than $k$? <span class="fragment">(Left subtree)</span></li>
<li class="fragment">Is <tt>root.value</tt>'s key lesser than $k$? <span class="fragment">(Right subtree)</span></li>
</ul>
</section>
<section>
<h4 class="slide_title">Insert</h4>
<pre><code class="scala">
def insert[V: Ordering](root: BST[V], value: V): BST[V] =
{
<pre><code class="scala"> def insert[V: Ordering](root: BST[V], value: V): BST[V] =
node match {
case TreeNode(v, left, right) =>
if(Ordering[V].lt( target, v ) ){
@ -462,9 +467,7 @@ cat: graphics/23b/cat.png
case EmptyTree =>
return TreeNode(value, EmptyTree, EmptyTree)
}
}
</code></pre>
}</code></pre>
<p class="fragment">What's the complexity? <span class="fragment">$O(d)$</span></p>
</section>
@ -508,6 +511,9 @@ cat: graphics/23b/cat.png
</tr>
</table>
<p class="fragment">What's that in terms of $n$? <span class="fragment">$O(n)$</span></p>
<p class="fragment">Does it need to be that bad?</p>
</section>
<section>
@ -521,7 +527,7 @@ cat: graphics/23b/cat.png
</section>
<section>
<h4 class="slide_title">Distinct Key/Value</h4>
<h4 class="slide_title">BSTs with Distinct Key/Value Pairs</h4>
<pre><code class="scala">
trait Tree[+K, +V]