<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Eric Schwabe</title>
    <description>My thoughts, perspectives, and ideas on software and technology.</description>
    <link>https://www.ericschwabe.com/</link>
    <atom:link href="https://www.ericschwabe.com/feed.xml" rel="self" type="application/rss+xml" />
    <pubDate>Sat, 31 Oct 2026 23:53:03 +0000</pubDate>
    <lastBuildDate>Sat, 31 Oct 2026 23:53:03 +0000</lastBuildDate>
    <generator>Jekyll v3.10.0</generator>
    
      <item>
        <title>Experiments with WebGL</title>
        <description>&lt;p&gt;Coursera classes can be a great tool for learning new technologies or improving existing skills. Last year (Summer 2015), I took a course on WebGL to learn a bit more about web browser technology and refresh my knowledge of basic 3D rendering. The last time I worked with graphics APIs was a game development certificate course back in 2010 that used DirectX 9. I will discuss a bit about the assignments, the course content, and my overall impressions of the class.&lt;/p&gt;

&lt;h2 id=&quot;the-results&quot;&gt;The Results&lt;/h2&gt;

&lt;p&gt;Let’s start with the final product. Demos are always fun to show. :) The page renders a simple 3D scene with a grid and a set of objects (starting with a single sphere). The scene may be observed using the camera which starts out as automatically rotating around the grid. Additional objects may be added to the scene and their position, rotation, and scale controlled. Lastly, the environment has two simple spotlights whose position can be manipulated. Try it out!&lt;/p&gt;

&lt;h4 id=&quot;webgl-example&quot;&gt;&lt;strong&gt;&lt;a href=&quot;/graphics-webgl/assignment5/&quot;&gt;WebGL Example&lt;/a&gt;&lt;/strong&gt;&lt;/h4&gt;

&lt;p&gt;&lt;img src=&quot;/images/2016-05-01-webgl-example.png&quot; alt=&quot;Example&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The class had us implement several intermediate steps before the final assignment. The other assignments provided opportunities to learn more about the computations involved with 3D graphics and the WebGL API. You can also try out those here.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/graphics-webgl/&quot;&gt;WebGL Assignments&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Assignment 1: Tessellation and Twist&lt;/li&gt;
  &lt;li&gt;Assignment 2: Painting with the Mouse&lt;/li&gt;
  &lt;li&gt;Assignment 3: Geometric CAD&lt;/li&gt;
  &lt;li&gt;Assignment 4: Adding Lighting&lt;/li&gt;
  &lt;li&gt;Assignment 5: Texture Mapping&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;the-content&quot;&gt;The Content&lt;/h2&gt;

&lt;p&gt;The course itself covered the major topics required for 3D rendering and using WebGL. The class focuses on WebGL due to the fact that it is the primary platform independent implementation of a 3D graphics API. The high-level course outline is listed below. You can find out more on &lt;strong&gt;&lt;a href=&quot;https://www.coursera.org/&quot;&gt;Coursera&lt;/a&gt;&lt;/strong&gt; (course no longer offered).&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Week 1: Introduction and Background&lt;/li&gt;
  &lt;li&gt;Week 2: WebGL&lt;/li&gt;
  &lt;li&gt;Week 3: The Open GL Shading Language and Interaction&lt;/li&gt;
  &lt;li&gt;Week 4: Displaying Geometry in WebGL&lt;/li&gt;
  &lt;li&gt;Week 5: Transformations&lt;/li&gt;
  &lt;li&gt;Week 6: Viewing in WebGL&lt;/li&gt;
  &lt;li&gt;Week 7: Lighting, Shading and Texture Mapping&lt;/li&gt;
  &lt;li&gt;Week 8: WebGL Texture Mapping&lt;/li&gt;
  &lt;li&gt;Week 9: Using the GPU&lt;/li&gt;
  &lt;li&gt;Week: 10: Render-to-Texture Applications&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;course-review&quot;&gt;Course Review&lt;/h2&gt;

&lt;p&gt;Overall, I felt the class was a decent review of 3D graphics programming. The assignments and topics covered the most important aspects of using WebGL and turned out to be a great refresher for my knowledge. My main issue with the course would be the lectures. The audio and video quality was poor and the instructor did not explain topics thoroughly. I generally had to go back through the slides or lookup information through other sources to understand the topic. With that said, I would still recommend the course if you have an interest in WebGL.&lt;/p&gt;

&lt;p&gt;I may expand on this post in the future to use as reference. Some of the intricacies of 3D programming (such as the model, view, and projection matrices) are easy to forget.&lt;/p&gt;
</description>
        <pubDate>Mon, 02 May 2016 02:00:00 +0000</pubDate>
        <link>https://www.ericschwabe.com/classes/2016/05/02/coursera-webgl.html</link>
        <guid isPermaLink="true">https://www.ericschwabe.com/classes/2016/05/02/coursera-webgl.html</guid>
        
        <category>coursera</category>
        
        <category>classes</category>
        
        <category>webgl</category>
        
        
        <category>classes</category>
        
      </item>
    
      <item>
        <title>Interviews: Concepts</title>
        <description>&lt;p&gt;This series contains review materials for software engineer interview questions. This guide provides a high-level overview of common concepts in computer science.&lt;/p&gt;

&lt;h3 id=&quot;recursion&quot;&gt;&lt;strong&gt;Recursion&lt;/strong&gt;&lt;/h3&gt;

&lt;h4 id=&quot;overview&quot;&gt;Overview:&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;An algorithm that calls itself within its definition.
    &lt;ul&gt;
      &lt;li&gt;&lt;strong&gt;Recursive case&lt;/strong&gt; a conditional statement that triggers the recursion.&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Base case&lt;/strong&gt; a conditional statement that breaks the recursion.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Stack level too deep&lt;/strong&gt; and &lt;strong&gt;stack overflow&lt;/strong&gt;.
    &lt;ul&gt;
      &lt;li&gt;Recursion places calls on the execution stack.&lt;/li&gt;
      &lt;li&gt;Typically limited by the runtime or operating system.&lt;/li&gt;
      &lt;li&gt;Must be aware of potential exploits (i.e. input data cannot be too large).&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Often seen in algorithms such as depth-first search.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;dynamic-programming&quot;&gt;&lt;strong&gt;Dynamic Programming&lt;/strong&gt;&lt;/h3&gt;

&lt;h4 id=&quot;overview-1&quot;&gt;Overview:&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;An algorithm that &lt;strong&gt;memoizes&lt;/strong&gt; or &lt;strong&gt;caches&lt;/strong&gt; intermediate results or return values from methods.&lt;/li&gt;
  &lt;li&gt;Problem must have two key attributes for dynamic programming to apply.
    &lt;ul&gt;
      &lt;li&gt;Optimal substructure.&lt;/li&gt;
      &lt;li&gt;Overlapping sub-problems.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Often seen in problems such as computing a fibonacci number.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;permutations&quot;&gt;&lt;strong&gt;Permutations&lt;/strong&gt;&lt;/h3&gt;

&lt;h4 id=&quot;overview-2&quot;&gt;Overview:&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;A unique list of items where &lt;strong&gt;order matters&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;A given set of items has &lt;em&gt;n!&lt;/em&gt; number of permutations.&lt;/li&gt;
  &lt;li&gt;If ordering a subset of the items, divide by the remaining permutations.
    &lt;ul&gt;
      &lt;li&gt;&lt;em&gt;P(n,k) = n! / (n - k)!&lt;/em&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Typical implementation requires swapping each item into each position in the list.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;combinations&quot;&gt;&lt;strong&gt;Combinations&lt;/strong&gt;&lt;/h3&gt;

&lt;h4 id=&quot;overview-3&quot;&gt;Overview:&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;A unique group of items where &lt;strong&gt;order does not matter&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;e.g. Pick n items from a set&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Computing the number of combinations starts with the number of permutations and divides by the number of redundancies.
    &lt;ul&gt;
      &lt;li&gt;&lt;em&gt;C(n,k) = n! / (n - k)! k!&lt;/em&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;sets-and-subsets&quot;&gt;&lt;strong&gt;Sets and Subsets&lt;/strong&gt;&lt;/h3&gt;

&lt;h4 id=&quot;overview-4&quot;&gt;Overview:&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;A collection of distinct objects (elements or members of the set)&lt;/li&gt;
  &lt;li&gt;A set has &lt;em&gt;2^n&lt;/em&gt; subsets (including the empty set)&lt;/li&gt;
  &lt;li&gt;Subsets may be generated by starting with the empty set&lt;/li&gt;
  &lt;li&gt;Add elements to each previous subset to generate new subsets&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;bit-manipulation&quot;&gt;&lt;strong&gt;Bit Manipulation&lt;/strong&gt;&lt;/h3&gt;

&lt;h4 id=&quot;overview-5&quot;&gt;Overview:&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;Commonly used to optimize base 2 calculations.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;operations&quot;&gt;Operations:&lt;/h4&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;Name&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;C Language&lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;Result&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Negation&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;~&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Invert all bits&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;And&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&amp;amp;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;True when both input bits true&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Or&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;|&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;True when either input bits are true&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Exclusive Or&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;^&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;True when input bits differ&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Left Shift&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;«&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Shift bits left by specified amount and pad with zeroes&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Right Shift&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;»&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Shift bits right by specified amount and pad with zeroes&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h4 id=&quot;facts-and-tricks&quot;&gt;Facts and Tricks:&lt;/h4&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;And&lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;Or&lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;Xor&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;x &amp;amp; 0s = 0&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;x | 0s = x&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;x ^ 0s = x&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;x &amp;amp; 1s = x&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;x | 1s = 1s&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;x ^ 1s = ~x&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;x &amp;amp; x = x&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;x | x = x&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;x ^ x = 0&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h4 id=&quot;powers-of-2&quot;&gt;Powers Of 2:&lt;/h4&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;2^N&lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;Exact Value&lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;Approx. Value&lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;Human Readable&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;7&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;128&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt; &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;8&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;256&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt; &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;10&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;1024&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;1 thousand	1K&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt; &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;16&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;65536&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;64K&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt; &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;20&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;1048576&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;1 million&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;1MB&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;30&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;1073741824&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;1 billion&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;1GB&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;32&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;4294967296&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;1 trillion&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;4GB&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;40&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;1099511627776&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;1TB&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt; &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;sources&quot;&gt;Sources&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.coursera.org/course/algs4partI&quot;&gt;https://www.coursera.org/course/algs4partI&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://gist.github.com/TSiege/cbb0507082bb18ff7e4b#file-the-technical-interview-cheat-sheet-md&quot;&gt;https://gist.github.com/TSiege/cbb0507082bb18ff7e4b#file-the-technical-interview-cheat-sheet-md&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Mon, 18 Apr 2016 02:00:00 +0000</pubDate>
        <link>https://www.ericschwabe.com/interviews/2016/04/18/concepts.html</link>
        <guid isPermaLink="true">https://www.ericschwabe.com/interviews/2016/04/18/concepts.html</guid>
        
        <category>interview</category>
        
        <category>concepts</category>
        
        
        <category>interviews</category>
        
      </item>
    
      <item>
        <title>Interviews: Algorithms</title>
        <description>&lt;p&gt;This series contains review materials for software engineer interview questions. This guide provides a high-level overview of basic algorithms including their implementations, applications and efficiency.&lt;/p&gt;

&lt;h3 id=&quot;depth-first-search&quot;&gt;&lt;strong&gt;Depth-First Search&lt;/strong&gt;&lt;/h3&gt;

&lt;h4 id=&quot;overview&quot;&gt;Overview:&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;Systematically search through a tree or graph, start at the root.
    &lt;ul&gt;
      &lt;li&gt;E is number of edges.&lt;/li&gt;
      &lt;li&gt;V is number of vertices.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Analyzes paths by searching depth of the tree or graph first (nodes farthest away).&lt;/li&gt;
  &lt;li&gt;Algorithm implemented using a stack (LIFO).
    &lt;ul&gt;
      &lt;li&gt;Unvisited vertices added to stack.&lt;/li&gt;
      &lt;li&gt;Visited vertices are marked to deal with cycles in graph (not required for a tree).&lt;/li&gt;
      &lt;li&gt;Retrace steps when no unvisited options.&lt;/li&gt;
      &lt;li&gt;Typically implemented using recursion.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Optimal for searching graphs and tress that are deeper than they are wide.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;applications&quot;&gt;Applications:&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;Find all vertices connected to a given source vertex.&lt;/li&gt;
  &lt;li&gt;Find a path between two vertices.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;efficiency&quot;&gt;Efficiency:&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;Search: O(|E| + |V|)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;breadth-first-search&quot;&gt;&lt;strong&gt;Breadth First Search&lt;/strong&gt;&lt;/h3&gt;

&lt;h4 id=&quot;overview-1&quot;&gt;Overview:&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;Systematically search through a tree or graph, start at the root.
    &lt;ul&gt;
      &lt;li&gt;E is number of edges.&lt;/li&gt;
      &lt;li&gt;V is number of vertices.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Analyzes paths by searching closest nodes first.&lt;/li&gt;
  &lt;li&gt;Algorithm implemented using queue (FIFO).
    &lt;ul&gt;
      &lt;li&gt;Put unvisited vertices in the queue.&lt;/li&gt;
      &lt;li&gt;Repeat until queue is empty.
        &lt;ul&gt;
          &lt;li&gt;Remove vertex v from queue.&lt;/li&gt;
          &lt;li&gt;Add to queue all unmarked vertices adjacent to v and mark them as visited.&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Examines vertices in increasing distance from root.&lt;/li&gt;
  &lt;li&gt;Optimal for searching graphs and trees that are wider than they are deep.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;applications-1&quot;&gt;Applications:&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Shortest path:&lt;/strong&gt; Find path from s to t that uses fewest number of edges.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;efficiency-1&quot;&gt;Efficiency:&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;Search: O(|E| + |V|)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;binary-search&quot;&gt;&lt;strong&gt;Binary Search&lt;/strong&gt;&lt;/h3&gt;

&lt;h4 id=&quot;overview-2&quot;&gt;Overview:&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;Search through an array to locate a specific element.&lt;/li&gt;
  &lt;li&gt;Algorithm typically implemented recursively.
    &lt;ul&gt;
      &lt;li&gt;Compare element x to the midpoint of the sorted array.&lt;/li&gt;
      &lt;li&gt;If x less than the midpoint, then search the left half of the array.&lt;/li&gt;
      &lt;li&gt;If x greater than the midpoint, then search the right half of the array.&lt;/li&gt;
      &lt;li&gt;Repeat the process treating the halves as subarrays until finding x or subarray is size 0.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;applications-2&quot;&gt;Applications:&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;Find element in sorted array.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;efficiency-2&quot;&gt;Efficiency:&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;Search: O(log N)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;quick-sort&quot;&gt;&lt;strong&gt;Quick Sort&lt;/strong&gt;&lt;/h3&gt;

&lt;h4 id=&quot;overview-3&quot;&gt;Overview:&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;Comparison based sorting algorithm.&lt;/li&gt;
  &lt;li&gt;Algorithm typically implemented recursively.
    &lt;ul&gt;
      &lt;li&gt;Shuffle the array (to ensure average element selected).&lt;/li&gt;
      &lt;li&gt;Partition array so that for some element x (typically first element of subarray).
        &lt;ul&gt;
          &lt;li&gt;Entry a[x] is in place.&lt;/li&gt;
          &lt;li&gt;No larger entry to the left of x.&lt;/li&gt;
          &lt;li&gt;No smaller entry to the right of x.&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;Sort each subarray.&lt;/li&gt;
      &lt;li&gt;Requires special handling for duplicate keys, otherwise quadratic performance.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Quicksort is generally faster than mergesort.&lt;/li&gt;
  &lt;li&gt;In-place sorting algorithm (constant extra space).&lt;/li&gt;
  &lt;li&gt;Not a stable sorting algorithm (long range exchanges of elements).&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;applications-3&quot;&gt;Applications:&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;Sort an array of elements.&lt;/li&gt;
  &lt;li&gt;Java primitive type sorting uses quick sort.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;efficiency-3&quot;&gt;Efficiency:&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;Best Case Sort: O(N log N)&lt;/li&gt;
  &lt;li&gt;Average Case Sort: O(N log N)&lt;/li&gt;
  &lt;li&gt;Worst Case Sort: O(N^2)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;merge-sort&quot;&gt;&lt;strong&gt;Merge Sort&lt;/strong&gt;&lt;/h3&gt;

&lt;h4 id=&quot;overview-4&quot;&gt;Overview:&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;Comparison based sorting algorithm.&lt;/li&gt;
  &lt;li&gt;Algorithm typically implemented recursively.
    &lt;ul&gt;
      &lt;li&gt;Divide array into two (recursively).&lt;/li&gt;
      &lt;li&gt;Sort each subarray.&lt;/li&gt;
      &lt;li&gt;Merge the two subarrays.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Merging algorithm.
    &lt;ul&gt;
      &lt;li&gt;Create a temporary array that is the same size as the two halves.&lt;/li&gt;
      &lt;li&gt;Keep track of three indices: output, first half, and second half.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Not an in-place sorting algorithm (linear extra space).&lt;/li&gt;
  &lt;li&gt;Stable sorting algorithm (maintains relative order of equal keys).&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;applications-4&quot;&gt;Applications:&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;Sort an array of elements.&lt;/li&gt;
  &lt;li&gt;Java generic object type sorting uses merge sort.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;efficiency-4&quot;&gt;Efficiency:&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;Best Case Sort: O(N log N)&lt;/li&gt;
  &lt;li&gt;Average Case Sort: O(N log N)&lt;/li&gt;
  &lt;li&gt;Worst Case Sort: O(N log N)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;sources&quot;&gt;Sources&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://bigocheatsheet.com&quot;&gt;http://bigocheatsheet.com&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.coursera.org/course/algs4partI&quot;&gt;https://www.coursera.org/course/algs4partI&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://gist.github.com/TSiege/cbb0507082bb18ff7e4b#file-the-technical-interview-cheat-sheet-md&quot;&gt;https://gist.github.com/TSiege/cbb0507082bb18ff7e4b#file-the-technical-interview-cheat-sheet-md&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Mon, 04 Apr 2016 04:00:00 +0000</pubDate>
        <link>https://www.ericschwabe.com/interviews/2016/04/04/algorithms.html</link>
        <guid isPermaLink="true">https://www.ericschwabe.com/interviews/2016/04/04/algorithms.html</guid>
        
        <category>interview</category>
        
        <category>algorithms</category>
        
        
        <category>interviews</category>
        
      </item>
    
      <item>
        <title>Interviews: Data Structures</title>
        <description>&lt;p&gt;This series contains review materials for software engineer interview questions. This guide provides a high-level overview on basic data structures including their implementations, related algorithms, and efficiency.&lt;/p&gt;

&lt;h3 id=&quot;arraysstrings&quot;&gt;&lt;strong&gt;Arrays/Strings&lt;/strong&gt;&lt;/h3&gt;

&lt;h4 id=&quot;overview&quot;&gt;Overview:&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;Stores data elements based on an sequential, most commonly 0 based, index.&lt;/li&gt;
  &lt;li&gt;Based on &lt;a href=&quot;http://en.wikipedia.org/wiki/Tuple&quot;&gt;tuples&lt;/a&gt; from set theory.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;types&quot;&gt;Types:&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;Optimal for indexing; bad at searching, inserting, and deleting (except at the end).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Linear arrays&lt;/strong&gt;, or one dimensional arrays, are the most basic.
    &lt;ul&gt;
      &lt;li&gt;Are static in size, meaning that they are declared with a fixed size.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Dynamic arrays&lt;/strong&gt; are like one dimensional arrays, but have reserved space for additional elements.
    &lt;ul&gt;
      &lt;li&gt;If a dynamic array is full, it copies it’s contents to a larger array.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Two dimensional arrays&lt;/strong&gt; have x and y indices like a grid or nested arrays.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;efficiency&quot;&gt;Efficiency:&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;Access:         O(1)&lt;/li&gt;
  &lt;li&gt;Search:         O(n)&lt;/li&gt;
  &lt;li&gt;Sorted Search:  O(log n)&lt;/li&gt;
  &lt;li&gt;Insertion:      O(1)&lt;/li&gt;
  &lt;li&gt;Deletion:       O(n)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;stacks&quot;&gt;&lt;strong&gt;Stacks&lt;/strong&gt;&lt;/h3&gt;

&lt;h4 id=&quot;overview-1&quot;&gt;Overview:&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;Collection of objects, typically supports &lt;em&gt;push&lt;/em&gt; and &lt;em&gt;pop&lt;/em&gt; operations&lt;/li&gt;
  &lt;li&gt;Examines the item most recently added, &lt;strong&gt;last in, first out&lt;/strong&gt; (LIFO) data structures.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;types-1&quot;&gt;Types:&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;Commonly implemented with linked lists but can be made from arrays too.&lt;/li&gt;
  &lt;li&gt;Made with a linked list by having the head be the only place for insertion and removal.&lt;/li&gt;
  &lt;li&gt;Made with array by automatically resizing, &lt;strong&gt;repeated doubling&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;efficiency-1&quot;&gt;Efficiency:&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;Access:     O(n)&lt;/li&gt;
  &lt;li&gt;Search:     O(n)&lt;/li&gt;
  &lt;li&gt;Insertion:  O(1)&lt;/li&gt;
  &lt;li&gt;Deletion:   O(1)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;queue&quot;&gt;&lt;strong&gt;Queue&lt;/strong&gt;&lt;/h3&gt;

&lt;h4 id=&quot;overview-2&quot;&gt;Overview:&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;Collection of objects, typically supports &lt;em&gt;enqueue&lt;/em&gt; and &lt;em&gt;dequeue&lt;/em&gt; operations&lt;/li&gt;
  &lt;li&gt;Examines the oldest item, &lt;strong&gt;first in, first out&lt;/strong&gt; (FIFO) data structures.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;types-2&quot;&gt;Types:&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;Commonly implemented with linked lists but can be made from arrays too.&lt;/li&gt;
  &lt;li&gt;Made with a linked list by having the head be the only place for insertion and tail the only place for removal.&lt;/li&gt;
  &lt;li&gt;Made with array by automatically resizing, &lt;strong&gt;repeated doubling&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;Head and tail indexes are incremented and decremented modulo the capacity&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;efficiency-2&quot;&gt;Efficiency:&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;Access:     O(n)&lt;/li&gt;
  &lt;li&gt;Search:     O(n)&lt;/li&gt;
  &lt;li&gt;Insertion:  O(1)&lt;/li&gt;
  &lt;li&gt;Deletion:   O(1)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;hash-table&quot;&gt;&lt;strong&gt;Hash Table&lt;/strong&gt;&lt;/h3&gt;

&lt;h4 id=&quot;overview-3&quot;&gt;Overview:&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;Stores data with key value pairs.&lt;/li&gt;
  &lt;li&gt;Designed to optimize searching, insertion, and deletion.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Hash functions&lt;/strong&gt; accept a key and return an output value unique to that specific key.
    &lt;ul&gt;
      &lt;li&gt;Method for computing array index from key.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Hash collisions&lt;/strong&gt; are when a hash function returns the same output for two distinct inputs.
    &lt;ul&gt;
      &lt;li&gt;All hash functions have this problem.&lt;/li&gt;
      &lt;li&gt;This is often accommodated by creating large hash tables (arrays).&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;types-3&quot;&gt;Types:&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;There are a few different techniques for dealing with collision resolution.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Separate chaining&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;Use array of linked lists. When searching for key, check each entry of list associated with hash value.&lt;/li&gt;
      &lt;li&gt;Array size M must consider number of key-value pairs N. Typical choice M ~ N/5.
        &lt;ul&gt;
          &lt;li&gt;The constant is equal to average number of constant time operations.&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Open addressing&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;When a new key collides, find next empty slot, and store it there.&lt;/li&gt;
      &lt;li&gt;Array size M must be larger than number of key-value pairs N. Typically N/M ~ 1/2.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;efficiency-3&quot;&gt;Efficiency:&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;Search:    O(1)&lt;/li&gt;
  &lt;li&gt;Insertion: O(1)&lt;/li&gt;
  &lt;li&gt;Deletion:  O(1)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;linked-list&quot;&gt;&lt;strong&gt;Linked List&lt;/strong&gt;&lt;/h3&gt;

&lt;h4 id=&quot;overview-4&quot;&gt;Overview:&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;Stores data with &lt;strong&gt;nodes&lt;/strong&gt; that point to other nodes.
    &lt;ul&gt;
      &lt;li&gt;Nodes, at their most basic have one datum and one reference (another node).&lt;/li&gt;
      &lt;li&gt;A linked list &lt;em&gt;chains&lt;/em&gt; nodes together by pointing one node’s reference towards another node.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;List requires maintaining a reference to the head and/or tail node.&lt;/li&gt;
  &lt;li&gt;Designed to optimize insertion and deletion, slow at indexing and searching.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;types-4&quot;&gt;Types:&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Singly linked list&lt;/strong&gt; has nodes that reference next node.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Doubly linked list&lt;/strong&gt; has nodes that reference the previous and next nodes.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Circularly linked list&lt;/strong&gt; is simple linked list whose &lt;strong&gt;tail&lt;/strong&gt;, the last node, references the &lt;strong&gt;head&lt;/strong&gt;, the first node.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;algorithms&quot;&gt;Algorithms:&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Runner&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;Use two pointers to iterate through list.&lt;/li&gt;
      &lt;li&gt;Increment at different rates to search for middle of list.&lt;/li&gt;
      &lt;li&gt;P1 at 1x, P2 at 2x, P1 ends up in middle.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;efficiency-4&quot;&gt;Efficiency:&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;Access:     O(n)&lt;/li&gt;
  &lt;li&gt;Search:     O(n)&lt;/li&gt;
  &lt;li&gt;Insertion:  O(1)&lt;/li&gt;
  &lt;li&gt;Deletion:   O(1)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;binary-tree&quot;&gt;&lt;strong&gt;Binary Tree&lt;/strong&gt;&lt;/h3&gt;

&lt;h4 id=&quot;overview-5&quot;&gt;Overview:&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;Is a tree like data structure where every node has at most two children (left and right).&lt;/li&gt;
  &lt;li&gt;Designed to optimize searching and sorting.&lt;/li&gt;
  &lt;li&gt;They are comparably simple to implement than other data structures.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;types-5&quot;&gt;Types:&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Balanced tree&lt;/strong&gt; is a tree with minimum possible maximum height for all the leaf nodes.
    &lt;ul&gt;
      &lt;li&gt;Red-Black and AVL Trees are common implementations of balanced trees.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Degenerate tree&lt;/strong&gt; is an unbalanced tree, which if entirely one-sided is a essentially a linked list.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Complete tree&lt;/strong&gt; is a tree with all levels filled except possibly the last and all nodes are as far left as possible.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Binary search tree&lt;/strong&gt; is a tree that uses comparable keys to assign which direction a child is.
    &lt;ul&gt;
      &lt;li&gt;Left children have keys smaller than the parent node.&lt;/li&gt;
      &lt;li&gt;Right children have keys greater than the parent node.&lt;/li&gt;
      &lt;li&gt;There can be no duplicate nodes.&lt;/li&gt;
      &lt;li&gt;Because of the above it is more likely to be used as a data structure than a binary tree.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;algorithms-1&quot;&gt;Algorithms:&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Depth-First Search&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;The search tree is deepened as much as possible on each child before going to the next sibling.&lt;/li&gt;
      &lt;li&gt;Typically implemented recursively using the stack.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Depth-First Search Traversal Order&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;Pre-Order: Root, Left, Right&lt;/li&gt;
      &lt;li&gt;In-Order: Left, Root, Right&lt;/li&gt;
      &lt;li&gt;Post-Order: Left, Right, Root&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Breadth-First Search&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;The search tree is broadened as much as possible on each depth before going to the next depth. (a.k.a level-order)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;efficiency-5&quot;&gt;Efficiency:&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;Access:     O(log n)&lt;/li&gt;
  &lt;li&gt;Search:     O(log n)&lt;/li&gt;
  &lt;li&gt;Insertion:  O(log n)&lt;/li&gt;
  &lt;li&gt;Deletion:   O(log n)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;tries&quot;&gt;&lt;strong&gt;Tries&lt;/strong&gt;&lt;/h3&gt;

&lt;h4 id=&quot;overview-6&quot;&gt;Overview:&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;Variant of an n-ary tree in which characters are stored at each node.&lt;/li&gt;
  &lt;li&gt;Each path down the tree may represent a word (or at least a prefix to a word).&lt;/li&gt;
  &lt;li&gt;Useful for algorithms that do not require looking at entire key.&lt;/li&gt;
  &lt;li&gt;Performance based on height of trie, which is equal to maximum length of key/word (m).&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;types-6&quot;&gt;Types:&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;R-Way Trie&lt;/strong&gt;: Characters stored in each node with children up to the number of characters in the set.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Ternary Search Trie&lt;/strong&gt;: Characters stored in each node with 3 children. Smaller (left), equal (middle), larger (right). More space efficient than R-way trie.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;algorithms-2&quot;&gt;Algorithms:&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Prefix match&lt;/strong&gt; searches for all keys with a given prefix&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Wildcard match&lt;/strong&gt; searches each branch in node when wildcard specified for a character&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Longest prefix&lt;/strong&gt; searches for keys that match the longest prefix of a word&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;efficiency-6&quot;&gt;Efficiency:&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;Search:     O(m)&lt;/li&gt;
  &lt;li&gt;Insertion:  O(m)&lt;/li&gt;
  &lt;li&gt;Deletion:   O(m)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;sources&quot;&gt;&lt;strong&gt;Sources&lt;/strong&gt;&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://bigocheatsheet.com&quot;&gt;http://bigocheatsheet.com&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.coursera.org/course/algs4partI&quot;&gt;https://www.coursera.org/course/algs4partI&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://gist.github.com/TSiege/cbb0507082bb18ff7e4b#file-the-technical-interview-cheat-sheet-md&quot;&gt;https://gist.github.com/TSiege/cbb0507082bb18ff7e4b#file-the-technical-interview-cheat-sheet-md&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Sun, 27 Mar 2016 09:00:00 +0000</pubDate>
        <link>https://www.ericschwabe.com/interviews/2016/03/27/data-structures.html</link>
        <guid isPermaLink="true">https://www.ericschwabe.com/interviews/2016/03/27/data-structures.html</guid>
        
        <category>interview</category>
        
        <category>data-structures</category>
        
        
        <category>interviews</category>
        
      </item>
    
      <item>
        <title>Starting Something New</title>
        <description>&lt;p&gt;I figured it would be best to start the blog with a bit about myself.&lt;/p&gt;

&lt;h1 id=&quot;introduction&quot;&gt;Introduction&lt;/h1&gt;

&lt;p&gt;My name is Eric Schwabe. I work as a software engineer, currently in commericial aerospace test systems. I am always looking to expand my interests and expertise, so I decided to try writing a blog. I have always been fascinated with personal computers and electronic devices growing up. I grew up during the time when the Internet became common in every household.&lt;/p&gt;

&lt;h1 id=&quot;why-a-blog&quot;&gt;Why A Blog&lt;/h1&gt;

&lt;p&gt;A blog seems like a useful place to keep track of my thoughts and things I’ve learned. Information tends to be difficult to organize, so creating my own personal reference guide should be useful. Google and other companies do a decent job :), but it’s certainly not a collection of only my interests or recent work. It’s easy to lose track of your own “progress” over time, so I hope this will be a useful source to reflect upon in the future.&lt;/p&gt;

&lt;p&gt;The difficult part about starting some new is committing to the time investment. Writing blog posts certaining takes time and expect it will be a bit of hurdle to actually sit down occassionaly and write down my recent experiences. For now, I plan on adding posts for significant accomplishments or useful tidbits, but I may commit to a more regular schedule in the future.&lt;/p&gt;

&lt;h1 id=&quot;sources&quot;&gt;Sources&lt;/h1&gt;

&lt;p&gt;As for topics, I plan on primarily focusing on areas related to software engineering, programming, and technology. Like most professional software engineerings, I have a few news sources that I tend to read often and expect that I will post my own thoughts on the issues at times.&lt;/p&gt;

&lt;p&gt;Here are a few of my current news sources:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.codinghorror.com&quot;&gt;http://www.codinghorror.com&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://news.ycombinator.com/news&quot;&gt;https://news.ycombinator.com/news&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://arstechnica.com&quot;&gt;http://arstechnica.com&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.reddit.com/r/programming/&quot;&gt;https://www.reddit.com/r/programming/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Sat, 05 Mar 2016 06:51:00 +0000</pubDate>
        <link>https://www.ericschwabe.com/self/2016/03/05/starting-something-new.html</link>
        <guid isPermaLink="true">https://www.ericschwabe.com/self/2016/03/05/starting-something-new.html</guid>
        
        <category>profile</category>
        
        <category>about</category>
        
        
        <category>self</category>
        
      </item>
    
  </channel>
</rss>
