Merge 2024-02-02 (#2)
Insertion sort and `awk`. Reviewed-on: #2 Co-authored-by: Joshua Potter <jrpotter2112@gmail.com> Co-committed-by: Joshua Potter <jrpotter2112@gmail.com>daily
parent
7e28ba2efd
commit
5425627df1
|
@ -64,15 +64,20 @@
|
|||
"daily/2024-01-31.md": "72e343cef8d56e169cac7b360a88fcf0",
|
||||
"posix/index.md": "f7b1ae55f8f5e8f50f89738b1aca9111",
|
||||
"posix/signals.md": "2120ddd933fc0d57abb93c33f639afd8",
|
||||
"gawk.md": "4517acfbf4e186e8cc66a9002fbad73f",
|
||||
"gawk.md": "c79a09e1772da1d4f2cd296b7370ecab",
|
||||
"bash/index.md": "3b5296277f095acdf16655adcdf524af",
|
||||
"bash/shebang.md": "ad178efeb4a05190b80b5df108c175c7",
|
||||
"bash/shebang.md": "9006547710f9a079a3666169fbeda7aa",
|
||||
"bash/robustness.md": "de97cd77aae047b5eea27440b43c9c42",
|
||||
"journal/2024-02-01.md": "f4cc061bfc8e41ce15ae9a354c65ffe9",
|
||||
"journal/2024-02-01.md": "3aa232387d2dc662384976fd116888eb",
|
||||
"journal/2024-01-31.md": "7c7fbfccabc316f9e676826bf8dfe970",
|
||||
"bash/quoting.md": "b1d8869a91001f8b22f0cdc54d806f61",
|
||||
"nix/callPackage.md": "5ef6bc5d1a549c55d43ebb4d48c64427",
|
||||
"nix/index.md": "dd5ddd19e95d9bdbe020c68974d77a33"
|
||||
"nix/index.md": "dd5ddd19e95d9bdbe020c68974d77a33",
|
||||
"journal/2024-02-02.md": "e2acbe75752d9c39875553223e34fb0d",
|
||||
"bash/prompts.md": "64bd3cd3c2feb9edb68ad8dc5ba65a35",
|
||||
"algorithms/sorting/index.md": "cd189e1a2cf32b5656b16aaf9f488874",
|
||||
"algorithms/sorting/insertion-sort.md": "c78c9983f87cdc4198f82803d418967f",
|
||||
"algorithms/index.md": "1583c07edea4736db27c38fe2b6c4c31"
|
||||
},
|
||||
"fields_dict": {
|
||||
"Basic": [
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
---
|
||||
title: Algorithms
|
||||
---
|
|
@ -0,0 +1,69 @@
|
|||
---
|
||||
title: Sorting
|
||||
TARGET DECK: Obsidian::STEM
|
||||
FILE TAGS: algorithm sorting
|
||||
tags:
|
||||
- algorithm
|
||||
- sorting
|
||||
---
|
||||
|
||||
## Overview
|
||||
|
||||
Let $n \geq 0$ and $S = \langle a_1, a_2, \ldots, a_n \rangle$ be a sequence. The **sorting problem** refers to permuting **keys** $a_1, a_2, \ldots, a_n$ into a new sequence $\langle a_1', a_2', \ldots, a_n' \rangle$ such that $a_1' \leq a_2' \leq \cdots \leq a_n'$.
|
||||
|
||||
%%ANKI
|
||||
Basic
|
||||
What makes a sorting algorithm stable?
|
||||
Back: "Equal" values are ordered the same in the output as they are in the input.
|
||||
Reference: Thomas H. Cormen et al., _Introduction to Algorithms_, 3rd ed (Cambridge, Mass: MIT Press, 2009).
|
||||
<!--ID: 1706925787139-->
|
||||
END%%
|
||||
|
||||
%%ANKI
|
||||
Basic
|
||||
What is an in place sorting algorithm?
|
||||
Back: One in which only a constant number of input values are ever stored outside the array.
|
||||
Reference: Thomas H. Cormen et al., _Introduction to Algorithms_, 3rd ed (Cambridge, Mass: MIT Press, 2009).
|
||||
<!--ID: 1706925787146-->
|
||||
END%%
|
||||
## Structural Comparison
|
||||
|
||||
The #Elixir documentation makes a point that there exist two types of comparisons between data types.[^structural] The first is **structural** in which comparisons are made on the underlying data structures used to describe the data types. The second is **semantic** which focuses on making the comparison with respect to what the data types represent.
|
||||
|
||||
```elixir
|
||||
iex> 1 < :atom # structural
|
||||
true
|
||||
iex> Date.compare(~D[2017-03-31], ~D[2017-04-01]) # semantic
|
||||
:lt
|
||||
```
|
||||
|
||||
%%ANKI
|
||||
Basic
|
||||
What are the two types of comparisons made between data types?
|
||||
Back: Structural and semantic.
|
||||
Reference: “Kernel — Elixir v1.16.1,” accessed February 2, 2024, [https://hexdocs.pm/elixir/1.16/Kernel.html#module-structural-comparison](https://hexdocs.pm/elixir/1.16/Kernel.html#module-structural-comparison).
|
||||
<!--ID: 1706913303147-->
|
||||
END%%
|
||||
|
||||
%%ANKI
|
||||
Basic
|
||||
What is structural comparison of two data types?
|
||||
Back: Comparison of the underlying data structures making up data types.
|
||||
Reference: “Kernel — Elixir v1.16.1,” accessed February 2, 2024, [https://hexdocs.pm/elixir/1.16/Kernel.html#module-structural-comparison](https://hexdocs.pm/elixir/1.16/Kernel.html#module-structural-comparison).
|
||||
<!--ID: 1706913303155-->
|
||||
END%%
|
||||
|
||||
%%ANKI
|
||||
Basic
|
||||
What is semantic comparison of two data types?
|
||||
Back: Comparison made with respect to what the data types represent.
|
||||
Reference: “Kernel — Elixir v1.16.1,” accessed February 2, 2024, [https://hexdocs.pm/elixir/1.16/Kernel.html#module-structural-comparison](https://hexdocs.pm/elixir/1.16/Kernel.html#module-structural-comparison).
|
||||
<!--ID: 1706913303160-->
|
||||
END%%
|
||||
|
||||
## References
|
||||
|
||||
* Thomas H. Cormen et al., _Introduction to Algorithms_, 3rd ed (Cambridge, Mass: MIT Press, 2009).
|
||||
* “Kernel — Elixir v1.16.1,” accessed February 2, 2024, [https://hexdocs.pm/elixir/1.16/Kernel.html#module-structural-comparison](https://hexdocs.pm/elixir/1.16/Kernel.html#module-structural-comparison).
|
||||
|
||||
[^structural]: [Structural Comparison](https://hexdocs.pm/elixir/1.16/Kernel.html#module-structural-comparison)
|
|
@ -0,0 +1,116 @@
|
|||
---
|
||||
title: Insertion Sort
|
||||
TARGET DECK: Obsidian::STEM
|
||||
FILE TAGS: algorithm sorting
|
||||
tags:
|
||||
- algorithm
|
||||
- sorting
|
||||
---
|
||||
|
||||
## Overview
|
||||
|
||||
| Property | Value |
|
||||
| ---------- | -------- |
|
||||
| Best Case | $O(n)$ |
|
||||
| Worst Case | $O(n^2)$ |
|
||||
| Avg. Case | $O(n^2)$ |
|
||||
| Memory | $O(1)$ |
|
||||
| In place | Yes |
|
||||
| Stable | Yes |
|
||||
|
||||
Insertion sort works by advancing an index `i` through an array `A[1..n]` such that `A[1..i]` is kept in sorted order.
|
||||
|
||||
%%ANKI
|
||||
Basic
|
||||
What is insertion sort's best case runtime?
|
||||
Back: $O(n)$
|
||||
Reference: Thomas H. Cormen et al., _Introduction to Algorithms_, 3rd ed (Cambridge, Mass: MIT Press, 2009).
|
||||
<!--ID: 1706925879541-->
|
||||
END%%
|
||||
|
||||
%%ANKI
|
||||
Basic
|
||||
What input value does insertion sort perform best on?
|
||||
Back: An already sorted array.
|
||||
Reference: Thomas H. Cormen et al., _Introduction to Algorithms_, 3rd ed (Cambridge, Mass: MIT Press, 2009).
|
||||
<!--ID: 1706925921544-->
|
||||
END%%
|
||||
|
||||
%%ANKI
|
||||
Basic
|
||||
What is insertion sort's worst case runtime?
|
||||
Back: $O(n^2)$
|
||||
Reference: Thomas H. Cormen et al., _Introduction to Algorithms_, 3rd ed (Cambridge, Mass: MIT Press, 2009).
|
||||
<!--ID: 1706926586947-->
|
||||
END%%
|
||||
|
||||
%%ANKI
|
||||
Basic
|
||||
What input value does insertion sort perform worst on?
|
||||
Back: An array in reverse-sorted order.
|
||||
Reference: Thomas H. Cormen et al., _Introduction to Algorithms_, 3rd ed (Cambridge, Mass: MIT Press, 2009).
|
||||
<!--ID: 1706926586951-->
|
||||
END%%
|
||||
|
||||
%%ANKI
|
||||
Basic
|
||||
Is insertion sort in place?
|
||||
Back: Yes
|
||||
Reference: Thomas H. Cormen et al., _Introduction to Algorithms_, 3rd ed (Cambridge, Mass: MIT Press, 2009).
|
||||
<!--ID: 1706926586955-->
|
||||
END%%
|
||||
|
||||
%%ANKI
|
||||
Basic
|
||||
Is insertion sort stable?
|
||||
Back: Yes
|
||||
Reference: Thomas H. Cormen et al., _Introduction to Algorithms_, 3rd ed (Cambridge, Mass: MIT Press, 2009).
|
||||
<!--ID: 1706926586959-->
|
||||
END%%
|
||||
|
||||
```c
|
||||
void insertion_sort(const int n, int A[static n]) {
|
||||
for (int i = 1; i < n; ++i) {
|
||||
int key = A[i];
|
||||
int j = i - 1;
|
||||
for (; j >= 0 && A[j] > key; --j) {
|
||||
A[j + 1] = A[j];
|
||||
}
|
||||
A[j + 1] = key;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
%%ANKI
|
||||
Basic
|
||||
What loop invariant is maintained in insertion sort?
|
||||
Back: `A[1..i]` is in sorted order.
|
||||
Reference: Thomas H. Cormen et al., _Introduction to Algorithms_, 3rd ed (Cambridge, Mass: MIT Press, 2009).
|
||||
<!--ID: 1706927594718-->
|
||||
END%%
|
||||
|
||||
## Analogy
|
||||
|
||||
Suppose you have a shuffled deck of playing cards face-down on a table. Start by grabbing a card from the deck with your left hand. For the remainder of the cards, use your right hand to transition the topmost card to the end of your left hand. If the newly placed card isn't in sorted order, move it one position closer to the start. Repeat until it's in sorted order.
|
||||
|
||||
If you repeat this process for every card in the deck, your left hand will eventually contain the entire deck in sorted order.
|
||||
|
||||
%%ANKI
|
||||
Basic
|
||||
What analogy does Cormen et al. use to explain insertion sort?
|
||||
Back: Sorting a shuffled deck of playing cards.
|
||||
Reference: Thomas H. Cormen et al., _Introduction to Algorithms_, 3rd ed (Cambridge, Mass: MIT Press, 2009).
|
||||
<!--ID: 1706927594729-->
|
||||
END%%
|
||||
|
||||
%%ANKI
|
||||
Basic
|
||||
What invariant does the left hand maintain in Cormen et al.'s insertion sort analogy?
|
||||
Back: It contains all drawn cards in sorted order.
|
||||
Reference: Thomas H. Cormen et al., _Introduction to Algorithms_, 3rd ed (Cambridge, Mass: MIT Press, 2009).
|
||||
<!--ID: 1706927594732-->
|
||||
END%%
|
||||
|
||||
## References
|
||||
|
||||
* Thomas H. Cormen et al., _Introduction to Algorithms_, 3rd ed (Cambridge, Mass: MIT Press, 2009).
|
|
@ -0,0 +1,45 @@
|
|||
---
|
||||
title: Prompts
|
||||
TARGET DECK: Obsidian::STEM
|
||||
FILE TAGS: bash
|
||||
tags:
|
||||
- bash
|
||||
---
|
||||
|
||||
## Overview
|
||||
|
||||
According to Robbins a POSIX-compliant shell (like Bash) generally has the primary and secondary prompts denoted with `$` and `>` respectively.
|
||||
|
||||
%%ANKI
|
||||
Basic
|
||||
What symbol is usually used to denote the primary prompt?
|
||||
Back: `$$`
|
||||
Reference: Robbins, Arnold D. “GAWK: Effective AWK Programming,” October 2023. [https://www.gnu.org/software/gawk/manual/gawk.pdf](https://www.gnu.org/software/gawk/manual/gawk.pdf)
|
||||
<!--ID: 1706882670149-->
|
||||
END%%
|
||||
|
||||
%%ANKI
|
||||
Basic
|
||||
What symbol is usually used to denote the secondary prompt?
|
||||
Back: `>`
|
||||
Reference: Robbins, Arnold D. “GAWK: Effective AWK Programming,” October 2023. [https://www.gnu.org/software/gawk/manual/gawk.pdf](https://www.gnu.org/software/gawk/manual/gawk.pdf)
|
||||
<!--ID: 1706882670158-->
|
||||
END%%
|
||||
|
||||
Paths supplied to commands are typically "sanitized" by prefixing the path name with `./`. This is mentioned in a few different places:
|
||||
|
||||
* `find -execdir` performs this prefixing automatically on all found files.
|
||||
* `awk` ambiguously interprets a file named e.g. `count=1` as variable assignment. Should write `$ awk -f program.awk ./count=1`.
|
||||
|
||||
%%ANKI
|
||||
Basic
|
||||
What methodology is commonly used to "sanitize" paths supplied as command-line arguments?
|
||||
Back: Prefixing the paths with `./`.
|
||||
Reference: Cooper, Mendel. “Advanced Bash-Scripting Guide,” n.d., 916.
|
||||
<!--ID: 1706885111460-->
|
||||
END%%
|
||||
|
||||
## References
|
||||
|
||||
* Cooper, Mendel. “Advanced Bash-Scripting Guide,” n.d., 916.
|
||||
* Robbins, Arnold D. “GAWK: Effective AWK Programming,” October 2023. [https://www.gnu.org/software/gawk/manual/gawk.pdf](https://www.gnu.org/software/gawk/manual/gawk.pdf)
|
|
@ -8,7 +8,7 @@ tags:
|
|||
|
||||
## Overview
|
||||
|
||||
The shebang (also writting shabang or sha-bang) is a magic character at the start of a script indicating what command should be run when invoking the script directly. It always begins with ASCII characters `#!`.[^mendel]
|
||||
The shebang (also writting shabang or sha-bang) is a magic character at the start of a script indicating what command should be run when invoking the script directly. It always begins with ASCII characters `#!`.
|
||||
|
||||
%%ANKI
|
||||
Basic
|
||||
|
|
|
@ -40,7 +40,7 @@ END%%
|
|||
|
||||
Robbins suggests executing command `set +H` on [[bash]] startup to disable [[C]] shell-style command history.
|
||||
|
||||
## Usage
|
||||
## Structure
|
||||
|
||||
`awk` applies actions to lines matching specified patterns. In this way `awk` is said to be data-driven - we specify the lines `awk` should act on and `awk` is responsible for finding and acting on them. Instructions are provided via a **program**.
|
||||
|
||||
|
@ -88,7 +88,7 @@ Basic
|
|||
Write the `awk` command that searches file `mail-list` for string `li`.
|
||||
Back:
|
||||
```bash
|
||||
$ awk '/li/ { print }' mail-list
|
||||
$ awk '/li/' mail-list
|
||||
```
|
||||
Reference: Robbins, Arnold D. “GAWK: Effective AWK Programming,” October 2023. [https://www.gnu.org/software/gawk/manual/gawk.pdf](https://www.gnu.org/software/gawk/manual/gawk.pdf)
|
||||
<!--ID: 1706819150999-->
|
||||
|
@ -141,7 +141,7 @@ END%%
|
|||
|
||||
%%ANKI
|
||||
Basic
|
||||
What is the `BEGIN` pattern?
|
||||
How is the `BEGIN` pattern interpreted?
|
||||
Back: Code associated with it executes before any input is read.
|
||||
Reference: Robbins, Arnold D. “GAWK: Effective AWK Programming,” October 2023. [https://www.gnu.org/software/gawk/manual/gawk.pdf](https://www.gnu.org/software/gawk/manual/gawk.pdf)
|
||||
<!--ID: 1706823790236-->
|
||||
|
@ -149,7 +149,7 @@ END%%
|
|||
|
||||
%%ANKI
|
||||
Basic
|
||||
What is the `END` pattern?
|
||||
How is the `END` pattern interpreted?
|
||||
Back: Code associated with it executes after all input has been read.
|
||||
Reference: Robbins, Arnold D. “GAWK: Effective AWK Programming,” October 2023. [https://www.gnu.org/software/gawk/manual/gawk.pdf](https://www.gnu.org/software/gawk/manual/gawk.pdf)
|
||||
<!--ID: 1706823790239-->
|
||||
|
@ -188,6 +188,49 @@ Reference: Robbins, Arnold D. “GAWK: Effective AWK Programming,” October 202
|
|||
<!--ID: 1706824091128-->
|
||||
END%%
|
||||
|
||||
`awk` is said to be a "line-oriented" language. Every rule's action must begin on the same line as the pattern.
|
||||
|
||||
%%ANKI
|
||||
Basic
|
||||
When can a rule's pattern and action exist on different lines?
|
||||
Back: Only when using backslash continuation.
|
||||
Reference: Robbins, Arnold D. “GAWK: Effective AWK Programming,” October 2023. [https://www.gnu.org/software/gawk/manual/gawk.pdf](https://www.gnu.org/software/gawk/manual/gawk.pdf)
|
||||
<!--ID: 1706883732944-->
|
||||
END%%
|
||||
|
||||
## Variables
|
||||
|
||||
Variables are defined like `var=val`. They can be specified in two different places:
|
||||
|
||||
1. Via the `-v` command line flag. Using this allows accessing the variable value from within a `BEGIN` rule.
|
||||
2. In the file list. Using this allows accessing the variable value in all subsequent file processing.
|
||||
|
||||
%%ANKI
|
||||
Basic
|
||||
Where in an `awk` invocation can variables be assigned?
|
||||
Back: As a `-v` argument or in the file list.
|
||||
Reference: Robbins, Arnold D. “GAWK: Effective AWK Programming,” October 2023. [https://www.gnu.org/software/gawk/manual/gawk.pdf](https://www.gnu.org/software/gawk/manual/gawk.pdf)
|
||||
<!--ID: 1706885111450-->
|
||||
END%%
|
||||
|
||||
%%ANKI
|
||||
Basic
|
||||
The `-v` flag was introduced to accommodate what functionality?
|
||||
Back: Accessing variables from a `BEGIN` rule.
|
||||
Reference: Robbins, Arnold D. “GAWK: Effective AWK Programming,” October 2023. [https://www.gnu.org/software/gawk/manual/gawk.pdf](https://www.gnu.org/software/gawk/manual/gawk.pdf)
|
||||
<!--ID: 1706885111454-->
|
||||
END%%
|
||||
|
||||
%%ANKI
|
||||
Basic
|
||||
Describe what the following command does in in a single sentence:
|
||||
```bash
|
||||
$ awk 'program' pass=1 data pass=2 data
|
||||
```
|
||||
Back: Evaluates `'program'` against the `data` file twice with a different value of `pass` on each run.
|
||||
Reference: Robbins, Arnold D. “GAWK: Effective AWK Programming,” October 2023. [https://www.gnu.org/software/gawk/manual/gawk.pdf](https://www.gnu.org/software/gawk/manual/gawk.pdf)
|
||||
<!--ID: 1706885111457-->
|
||||
END%%
|
||||
## References
|
||||
|
||||
* Robbins, Arnold D. “GAWK: Effective AWK Programming,” October 2023. [https://www.gnu.org/software/gawk/manual/gawk.pdf](https://www.gnu.org/software/gawk/manual/gawk.pdf)
|
|
@ -0,0 +1,21 @@
|
|||
---
|
||||
title: "2024-02-02"
|
||||
---
|
||||
|
||||
- [x] Anki Flashcards
|
||||
- [x] KoL
|
||||
- [x] Sheet Music (10 min.)
|
||||
- [x] OGS (1 Life & Death Problem)
|
||||
- [x] Korean (Read 1 Story)
|
||||
- [x] Interview Prep (1 Practice Problem)
|
||||
- [ ] Log Work Hours (Max 3 hours)
|
||||
|
||||
* Read 효자 호랑이 (The Filial Tiger).
|
||||
* Read through [Project #1 - Buffer Pool](https://15445.courses.cs.cmu.edu/fall2022/project1/) in anticipation of my call with Kevin later.
|
||||
* Call was pushed back to next week.
|
||||
* Upgraded to Zotero 7. It's a beta version but already has some nice quality of life improvements I want to take advantage of.
|
||||
* Dark mode.
|
||||
* Ability to comment on snapshots.
|
||||
* Answered [String to Integer (atoi)](https://leetcode.com/problems/string-to-integer-atoi/description/). Admittedly though I floundered around. I should try and think more critically at each step instead of getting impatient like I did.
|
||||
* More reading on `awk`. This time around variables.
|
||||
* Begin deep dive into insertion sort. Starting off with the basics, but want to think much more broadly on the role of insertion sort throughout computing.
|
Loading…
Reference in New Issue