<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Data-Structures on maladroit.dev</title><link>https://maladroit-dev-398201.gitlab.io/tags/data-structures/</link><description>Recent content in Data-Structures on maladroit.dev</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://maladroit-dev-398201.gitlab.io/tags/data-structures/index.xml" rel="self" type="application/rss+xml"/><item><title>Array</title><link>https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/array/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/array/</guid><description>&lt;h1 id="array"&gt;Array&lt;/h1&gt;
&lt;p&gt;An array is a collection of items that are held in order at a specific index.
They are useful for storing objects of the same type in a single variable and it
is very quick to access elements if you have the index. It should also be said
that adding or removing objects to the middle of an array can be a slow process.&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Operation&lt;/th&gt;
 &lt;th&gt;Big-O&lt;/th&gt;
 &lt;th&gt;Note&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Access&lt;/td&gt;
 &lt;td&gt;O(1)&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Search&lt;/td&gt;
 &lt;td&gt;O(n)&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Search (sorted)&lt;/td&gt;
 &lt;td&gt;O(log(n))&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Insert/Remove&lt;/td&gt;
 &lt;td&gt;O(n)&lt;/td&gt;
 &lt;td&gt;requires shifting elements by 1&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Insert/Remove (at end)&lt;/td&gt;
 &lt;td&gt;O(1)&lt;/td&gt;
 &lt;td&gt;special case where no shifting is required&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="common-edge-cases"&gt;Common edge cases&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Empty sequence&lt;/li&gt;
&lt;li&gt;Sequence with 1 or 2 elements&lt;/li&gt;
&lt;li&gt;Sequence with repeated elements&lt;/li&gt;
&lt;li&gt;Duplicate values in sequence&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="techniques"&gt;Techniques&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/sliding-window"&gt;Sliding window&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/two-pointers"&gt;Two pointers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/traverse-from-right"&gt;Traverse from right&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/sorting-and-searching"&gt;Sorting-and-searching&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/pre-computation"&gt;Pre-computation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/index-as-hash-key"&gt;Index as hash key&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/traverse-from-right"&gt;Traversing multiple times&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Binary search tree</title><link>https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/binary-search-tree/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/binary-search-tree/</guid><description>&lt;h1 id="binary-search-tree"&gt;Binary-search-tree&lt;/h1&gt;
&lt;p&gt;A binary-search tree (BST) is a &lt;a href="https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/binary-tree"&gt;Binary-tree&lt;/a&gt; that
gives all the elements in order when it is traversed in order. In-order
traversal being:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Left -&amp;gt; Root -&amp;gt; Right&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;BSTs are useful because of their time complexity.&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Operation&lt;/th&gt;
 &lt;th&gt;Big-O&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Access&lt;/td&gt;
 &lt;td&gt;O(log(n))&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Search&lt;/td&gt;
 &lt;td&gt;O(log(n))&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Insert&lt;/td&gt;
 &lt;td&gt;O(log(n))&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Remove&lt;/td&gt;
 &lt;td&gt;O(log(n))&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The space complexity of traversing balanced trees is O(h) where h is the height
of the tree.&lt;/p&gt;
&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit-dev-398201.gitlab.io/kb/reference/tech-interview-handbook"&gt;Tech-Interview-Handbook&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Binary Tree</title><link>https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/binary-tree/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/binary-tree/</guid><description>&lt;h1 id="binary-tree"&gt;Binary tree&lt;/h1&gt;
&lt;p&gt;A binary tree is a tree where each node has a max of two children. A complete
binary tree is a binary tree where every level is completely filled. A balance
binary tree is a binary tree where the right and left sub-trees of every node
differ by no more than 1 level.&lt;/p&gt;
&lt;h2 id="traversals"&gt;Traversals&lt;/h2&gt;
&lt;p&gt;Given the following binary tree:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-mermaid" data-lang="mermaid"&gt;flowchart TD
	1([1])
	2([2])
	7([7])
	6([6])
	5([5])
	11([11])
	9([9])
	9a([9])
	5a([5])
	1 --&amp;gt; 7
	7 --&amp;gt; 2
	7 --&amp;gt; 6
	6 --&amp;gt; 5
	6 --&amp;gt; 11
	1 --&amp;gt; 9
	9 --&amp;gt; 9a
	9a --&amp;gt; 5a
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;In-order traversal:&lt;/strong&gt; Left -&amp;gt; Root -&amp;gt; Right
&lt;ul&gt;
&lt;li&gt;2, 7, 5, 6, 11, 1, 9, 5, 9&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pre-order traversal:&lt;/strong&gt; Root -&amp;gt; Left -&amp;gt; Right
&lt;ul&gt;
&lt;li&gt;1, 7, 2, 6, 5, 11, 9, 9, 5&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Post-order traversal:&lt;/strong&gt; Left -&amp;gt; Right -&amp;gt; Root
&lt;ul&gt;
&lt;li&gt;2, 5, 11, 6, 7, 5, 9, 9, 1&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit-dev-398201.gitlab.io/kb/reference/tech-interview-handbook"&gt;Tech-Interview-Handbook&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Data Structures</title><link>https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/data-structures/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/data-structures/</guid><description>&lt;h1 id="data-structures"&gt;Data Structures&lt;/h1&gt;</description></item><item><title>Graph</title><link>https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/graph/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/graph/</guid><description>&lt;h1 id="graph"&gt;Graph&lt;/h1&gt;
&lt;p&gt;A graph is a collection of nodes that are connected to each other by edges.
Edges can be either directed (one-way) or undirected and they can also have
weights (values). A tree can be considered an undirected graph with no cycles.&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Operation&lt;/th&gt;
 &lt;th&gt;Big-O&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Depth-first search&lt;/td&gt;
 &lt;td&gt;O(N + E)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Breadth-first search&lt;/td&gt;
 &lt;td&gt;O(N + E)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Topological sort&lt;/td&gt;
 &lt;td&gt;O(N + E)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;N being number of nodes and E being number of edges&lt;/p&gt;</description></item><item><title>Hash table</title><link>https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/hash-table/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/hash-table/</guid><description>&lt;h1 id="hash-table"&gt;Hash table&lt;/h1&gt;
&lt;p&gt;A hash table is a data structure that can map keys to values using a hash
function. It does this by computing an index using the hash function and stores
the value in an array.&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Operation&lt;/th&gt;
 &lt;th&gt;Big-O&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Access&lt;/td&gt;
 &lt;td&gt;N/A&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Search&lt;/td&gt;
 &lt;td&gt;O(1)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Insert&lt;/td&gt;
 &lt;td&gt;O(1)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Remove&lt;/td&gt;
 &lt;td&gt;O(1)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;To be clear, the &lt;code&gt;O(1)&lt;/code&gt; is average case as it depends on the underlying hash
function, but in most instances it is safe to assume average case.&lt;/p&gt;</description></item><item><title>Heap</title><link>https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/heap/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/heap/</guid><description>&lt;h1 id="heap"&gt;Heap&lt;/h1&gt;
&lt;p&gt;A heap is a &lt;a href="https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/tree"&gt;Tree&lt;/a&gt; data structure that is complete,
or every level is full.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Max heap&lt;/strong&gt;: A heap where the value of the node is the greatest value in that
node&amp;rsquo;s sub-tree. This must be true for all nodes in the heap&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Min heap&lt;/strong&gt;: A heap where the value of the node in the smallest value in that
node&amp;rsquo;s sub-tree. This must be true for all nodes in the heap&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Heaps can be valuable when it is necessary to remove nodes with either the
highest or lowest priority or when inserts are mixed with removals of the root
node.&lt;/p&gt;</description></item><item><title>Interval</title><link>https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/interval/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/interval/</guid><description>&lt;h1 id="interval"&gt;Interval&lt;/h1&gt;
&lt;p&gt;An interval is a subset of an array where the array consists of two element
arrays. The two elements represent a start and end value.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;interval&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; [][&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;]&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;{}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It is important when considering intervals to figure out if they should be
inclusive or exclusive when it comes to overlapping and if the starting value
will always be smaller than the ending value.&lt;/p&gt;
&lt;h2 id="corner-cases"&gt;Corner cases&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;No intervals&lt;/li&gt;
&lt;li&gt;Single interval&lt;/li&gt;
&lt;li&gt;Two intervals&lt;/li&gt;
&lt;li&gt;Non-overlapping intervals&lt;/li&gt;
&lt;li&gt;Interval that completely overlaps another interval&lt;/li&gt;
&lt;li&gt;Duplicates&lt;/li&gt;
&lt;li&gt;Intervals that start where other intervals end&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="techniques"&gt;Techniques&lt;/h2&gt;
&lt;h3 id="sort-the-array-by-starting-point"&gt;Sort the array by starting point&lt;/h3&gt;
&lt;p&gt;This is a crucial strategy when handling interval merging&lt;/p&gt;</description></item><item><title>Linked list</title><link>https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/linked-list/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/linked-list/</guid><description>&lt;h1 id="linked-list"&gt;Linked list&lt;/h1&gt;
&lt;p&gt;Similar to an &lt;a href="https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/array"&gt;Array&lt;/a&gt;, the linked list is a
sequential data structure that stores elements linearly. Unlike arrays, the
order is not determined by it&amp;rsquo;s position in memory, but instead it keeps an
address of the next element.&lt;/p&gt;
&lt;p&gt;This has the advantage of it being an O(1) operation to insert and delete
elements in the linked list. The draw back, however, is that accessing is an
O(n) operation as the linked list needs to be traveled to find the element.&lt;/p&gt;</description></item><item><title>Matrix</title><link>https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/matrix/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/matrix/</guid><description>&lt;h1 id="matrix"&gt;Matrix&lt;/h1&gt;
&lt;p&gt;A matrix is a 2-d array data structure that could be considered a type of
&lt;a href="https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/graph"&gt;graph&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="edge-cases"&gt;Edge cases&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Empty matrices&lt;/li&gt;
&lt;li&gt;1 x 1 matrix&lt;/li&gt;
&lt;li&gt;Matrix with only 1 row or column&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="techniques"&gt;Techniques&lt;/h2&gt;
&lt;h3 id="creating-an-empty-n-x-m-matrix"&gt;Creating an empty N x M matrix&lt;/h3&gt;
&lt;p&gt;For graph traversal it can be incredibly helpful to start with an empty matrix.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;n&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;9&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;m&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;9&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;emptyMatrix&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; make([][]&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;n&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;i&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;range&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;emptyMatrix&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;emptyMatrix&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;i&lt;/span&gt;] = make([]&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;m&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="copy-a-matrix"&gt;Copy a matrix&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;duplicate&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; make([][]&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;, len(&lt;span style="color:#a6e22e"&gt;matrix&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;i&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;range&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;duplicate&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;duplicate&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;i&lt;/span&gt;] = make([]&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;, len(&lt;span style="color:#a6e22e"&gt;matrix&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;i&lt;/span&gt;]))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	copy(&lt;span style="color:#a6e22e"&gt;duplicate&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;i&lt;/span&gt;], &lt;span style="color:#a6e22e"&gt;matrix&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;i&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="transposing-a-matrix"&gt;Transposing a matrix&lt;/h3&gt;
&lt;p&gt;Transposing a matrix is change the columns into rows and the rows into columns.&lt;/p&gt;</description></item><item><title>Prefix Tree</title><link>https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/prefix-tree/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/prefix-tree/</guid><description>&lt;h1 id="prefix-tree"&gt;Prefix tree&lt;/h1&gt;
&lt;p&gt;An implementation of a &lt;a href="https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/trie"&gt;Trie&lt;/a&gt; but instead of holding
characters on the edges, we instead hold sub-strings of the inserted string
going from left to right.&lt;/p&gt;
&lt;h2 id="examples"&gt;Examples&lt;/h2&gt;
&lt;h3 id="go"&gt;go&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;type&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;TrieNode&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;children&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;map&lt;/span&gt;[&lt;span style="color:#66d9ef"&gt;rune&lt;/span&gt;]&lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;TrieNode&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;isLeaf&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;bool&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;NewTrieNode&lt;/span&gt;() &lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;TrieNode&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;tn&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;TrieNode&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#a6e22e"&gt;children&lt;/span&gt;: make(&lt;span style="color:#66d9ef"&gt;map&lt;/span&gt;[&lt;span style="color:#66d9ef"&gt;rune&lt;/span&gt;]&lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;TrieNode&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#a6e22e"&gt;isLeaf&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;tn&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;type&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Trie&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;root&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;TrieNode&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;NewTrie&lt;/span&gt;() &lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;Trie&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;t&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;Trie&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#a6e22e"&gt;root&lt;/span&gt;: &lt;span style="color:#a6e22e"&gt;NewTrieNode&lt;/span&gt;(),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;t&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;t&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;Trie&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;Insert&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;key&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;string&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;current&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;t&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;root&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;_&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;index&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;range&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;key&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#a6e22e"&gt;_&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;ok&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;current&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;children&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;index&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; !&lt;span style="color:#a6e22e"&gt;ok&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			&lt;span style="color:#a6e22e"&gt;current&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;children&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;index&lt;/span&gt;] = &lt;span style="color:#a6e22e"&gt;NewTrieNode&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#a6e22e"&gt;current&lt;/span&gt; = &lt;span style="color:#a6e22e"&gt;current&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;children&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;index&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;current&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;isLeaf&lt;/span&gt; = &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;t&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;Trie&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;Search&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;key&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;string&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;bool&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;current&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;t&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;root&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;_&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;index&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;range&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;key&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#a6e22e"&gt;_&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;ok&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;current&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;children&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;index&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; !&lt;span style="color:#a6e22e"&gt;ok&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#a6e22e"&gt;current&lt;/span&gt; = &lt;span style="color:#a6e22e"&gt;current&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;children&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;index&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;current&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;isLeaf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;t&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;Trie&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;Prefix&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;key&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;string&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;bool&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;current&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;t&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;root&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;_&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;index&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;range&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;key&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#a6e22e"&gt;_&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;ok&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;current&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;children&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;index&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; !&lt;span style="color:#a6e22e"&gt;ok&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#a6e22e"&gt;current&lt;/span&gt; = &lt;span style="color:#a6e22e"&gt;current&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;children&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;index&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Queue</title><link>https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/queue/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/queue/</guid><description>&lt;h1 id="queue"&gt;Queue&lt;/h1&gt;
&lt;p&gt;A linear data structure that is modified by adding elements to one end and
removing them from the other.&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Operation&lt;/th&gt;
 &lt;th&gt;Big-O&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Enqueue&lt;/td&gt;
 &lt;td&gt;O(1)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Dequeue&lt;/td&gt;
 &lt;td&gt;O(1)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Front&lt;/td&gt;
 &lt;td&gt;O(1)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Back&lt;/td&gt;
 &lt;td&gt;O(1)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;isEmpty&lt;/td&gt;
 &lt;td&gt;O(1)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="examples"&gt;Examples&lt;/h2&gt;
&lt;h3 id="go"&gt;go&lt;/h3&gt;
&lt;p&gt;For short lived queues, the following approach can be taken. Since the memory
for the slice is never returned, memory leaks may occur in long living queues.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;queue&lt;/span&gt; []&lt;span style="color:#66d9ef"&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Enqueue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;queue&lt;/span&gt; = append(&lt;span style="color:#a6e22e"&gt;queue&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;Hello&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Dequeue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;queue&lt;/span&gt; = &lt;span style="color:#a6e22e"&gt;queue&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;:]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Front&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;fmt&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Print&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;queue&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Back&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;fmt&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Print&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;queue&lt;/span&gt;[len(&lt;span style="color:#a6e22e"&gt;queue&lt;/span&gt;)&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For long lived queues, a linked list is more appropriate. The &lt;code&gt;container/list&lt;/code&gt;
package provides a doubly linked list.&lt;/p&gt;</description></item><item><title>Slice</title><link>https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/slice/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/slice/</guid><description>&lt;h1 id="slice"&gt;Slice&lt;/h1&gt;
&lt;p&gt;A slice is an array that can grow or shrink in size. In Go, a slice is backed by
an array, and handles the logic of adding new elements if the backing array is
full or shrinking it if it is almost empty.&lt;/p&gt;
&lt;p&gt;Internally, a slice holds a pointer to the backing array and keeps track of a
length and capacity. The length is the number of elements the slice contains,
while the capacity is the number of elements in the backing array.&lt;/p&gt;</description></item><item><title>Stack</title><link>https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/stack/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/stack/</guid><description>&lt;h1 id="stack"&gt;Stack&lt;/h1&gt;
&lt;p&gt;A stack is a linear data structure that supports adding elements to one end and
removing elements from that same end.&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Operation&lt;/th&gt;
 &lt;th&gt;Big-O&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Top/Peek&lt;/td&gt;
 &lt;td&gt;O(1)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Push&lt;/td&gt;
 &lt;td&gt;O(1)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Pop&lt;/td&gt;
 &lt;td&gt;O(1)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Search&lt;/td&gt;
 &lt;td&gt;O(n)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;isEmpty&lt;/td&gt;
 &lt;td&gt;O(1)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="examples"&gt;Examples&lt;/h2&gt;
&lt;h3 id="go"&gt;go&lt;/h3&gt;
&lt;p&gt;For short lived stacks&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;stack&lt;/span&gt; []&lt;span style="color:#66d9ef"&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Push&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;stack&lt;/span&gt; = append(&lt;span style="color:#a6e22e"&gt;stack&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;Hello&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Peek&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;fmt&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Print&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;stack&lt;/span&gt;[len(&lt;span style="color:#a6e22e"&gt;stack&lt;/span&gt;)&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Pop&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;stack&lt;/span&gt; = &lt;span style="color:#a6e22e"&gt;stack&lt;/span&gt;[:len(&lt;span style="color:#a6e22e"&gt;stack&lt;/span&gt;)&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For long lived stacks&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;stack&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;list&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;New&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Push&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;stack&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;PushBack&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Hello&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Peek&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;stack&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Back&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Pop&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;stack&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Remove&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;stack&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Back&lt;/span&gt;())
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit-dev-398201.gitlab.io/kb/reference/tech-interview-handbook"&gt;Tech-Interview-Handbook&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>String</title><link>https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/string/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/string/</guid><description>&lt;h1 id="string"&gt;String&lt;/h1&gt;
&lt;p&gt;Strings are character arrays and share a lot of similarities with
&lt;a href="https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/array"&gt;arrays&lt;/a&gt; as shown in their relative time
complexity.&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Operation&lt;/th&gt;
 &lt;th&gt;Big-O&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Access&lt;/td&gt;
 &lt;td&gt;O(1)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Search&lt;/td&gt;
 &lt;td&gt;O(n)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Insert&lt;/td&gt;
 &lt;td&gt;O(n)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Remove&lt;/td&gt;
 &lt;td&gt;O(n)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="common-data-structures-for-looking-up-strings"&gt;Common data-structures for looking up strings&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/prefix-tree"&gt;Prefix Tree&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/suffix-tree"&gt;Suffix Tree&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="common-string-algorithms"&gt;Common string algorithms&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/rabin-karp"&gt;Rabin Karp&lt;/a&gt; for sub-string searching&lt;/li&gt;
&lt;li&gt;&lt;a href="https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/kmp"&gt;KMP&lt;/a&gt; for sub-string searching&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="multi-string-operations"&gt;Multi-string operations&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Operation&lt;/th&gt;
 &lt;th&gt;Big-O&lt;/th&gt;
 &lt;th&gt;Note&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Find sub-string&lt;/td&gt;
 &lt;td&gt;O(n * m)&lt;/td&gt;
 &lt;td&gt;Most naive case. KMP and Rabin Karp are more efficient&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Concatenate&lt;/td&gt;
 &lt;td&gt;O(n + m)&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Slice&lt;/td&gt;
 &lt;td&gt;O(m)&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Split&lt;/td&gt;
 &lt;td&gt;O(n + m)&lt;/td&gt;
 &lt;td&gt;Split by using some character token&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Strip&lt;/td&gt;
 &lt;td&gt;O(n)&lt;/td&gt;
 &lt;td&gt;Remove leading and trailing whitespace&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="common-edge-cases"&gt;Common edge cases&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Empty string&lt;/li&gt;
&lt;li&gt;String with 1 or 2 characters&lt;/li&gt;
&lt;li&gt;String with repeated characters or sub-strings&lt;/li&gt;
&lt;li&gt;Strings with only distinct or no repeating characters&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="techniques"&gt;Techniques&lt;/h2&gt;
&lt;h3 id="counting-characters"&gt;Counting Characters&lt;/h3&gt;
&lt;p&gt;When counting the frequency of characters or a pattern in a string, use a hash
map.&lt;/p&gt;</description></item><item><title>Suffix tree</title><link>https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/suffix-tree/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/suffix-tree/</guid><description>&lt;h1 id="suffix-tree"&gt;Suffix tree&lt;/h1&gt;
&lt;p&gt;An implementation of a &lt;a href="https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/trie"&gt;Trie&lt;/a&gt; but instead of holding
characters on the edges, we instead hold sub-strings of the inserted string
going from right to left.&lt;/p&gt;
&lt;h2 id="construction"&gt;Construction&lt;/h2&gt;
&lt;p&gt;A naive approach to construction a suffix tree has a complexity of
&lt;a href="https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/quadratic-functions"&gt;O(m^2)&lt;/a&gt; where m is the length of the
input string. This can be improved to
&lt;a href="https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/linear-functions"&gt;O(m)&lt;/a&gt; using Ukkonen’s Suffix Tree
Construction Algorithm.&lt;/p&gt;</description></item><item><title>Tree</title><link>https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/tree/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/tree/</guid><description>&lt;h1 id="tree"&gt;Tree&lt;/h1&gt;
&lt;p&gt;Trees are hierarchical data structures that are made up of a series of nodes.
Each node can have many children but needs to have one parent. If a node does
not have a parent, it is considered to be a root node.&lt;/p&gt;
&lt;p&gt;Trees can also be considered as a undirected, connect, acyclic
&lt;a href="https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/graph"&gt;Graph&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="common-terms"&gt;Common terms&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Neighbor&lt;/strong&gt;: The parent or child nodes of the current node&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ancestor&lt;/strong&gt;: Any node from the current node to the root node&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Descendant&lt;/strong&gt;: Any node in the current node&amp;rsquo;s subtree&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Degree&lt;/strong&gt;: Number of children at current node&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Degree of a tree&lt;/strong&gt;: Max degree of nodes in the tree&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Distance&lt;/strong&gt;: Number of edges between two nodes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Level/Depth&lt;/strong&gt;: Number of edges between root and node&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Width&lt;/strong&gt;: Number of nodes in a level&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Skewed&lt;/strong&gt;: Nodes have very few children, like a linked list&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="types-of-trees"&gt;Types of trees&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/trie"&gt;Trie&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/binary-tree"&gt;Binary-tree&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/binary-search-tree"&gt;Binary-search-tree&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="common-routines"&gt;Common routines&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Insert&lt;/li&gt;
&lt;li&gt;Delete&lt;/li&gt;
&lt;li&gt;Count number of nodes&lt;/li&gt;
&lt;li&gt;Search&lt;/li&gt;
&lt;li&gt;Height&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit-dev-398201.gitlab.io/kb/reference/tech-interview-handbook"&gt;Tech-Interview-Handbook&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Trie</title><link>https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/trie/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/trie/</guid><description>&lt;h1 id="trie"&gt;Trie&lt;/h1&gt;
&lt;p&gt;A trie is a &lt;a href="https://maladroit-dev-398201.gitlab.io/kb/computer-engineering/tree"&gt;Tree&lt;/a&gt; structure where each edge represents one character
and the root is null. Each path from the root represents a string, described by
the characters labeling the traversed edges.&lt;/p&gt;
&lt;h2 id="time-complexity"&gt;Time complexity&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Operation&lt;/th&gt;
 &lt;th&gt;Big-O&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Insert&lt;/td&gt;
 &lt;td&gt;O(n)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Search&lt;/td&gt;
 &lt;td&gt;O(n)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="auxiliary-space"&gt;Auxiliary space&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Operation&lt;/th&gt;
 &lt;th&gt;Big-O&lt;/th&gt;
 &lt;th&gt;Notes&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Insert&lt;/td&gt;
 &lt;td&gt;O(m * n)&lt;/td&gt;
 &lt;td&gt;m is the Alphabet size * key length&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Search&lt;/td&gt;
 &lt;td&gt;O(1)&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;This is a trie of &amp;ldquo;there&amp;rdquo;, &amp;ldquo;their&amp;rdquo;, &amp;ldquo;when&amp;rdquo; and &amp;ldquo;was&amp;rdquo;&lt;/p&gt;</description></item></channel></rss>