From ed8325560470f59b7c1cea4c86d355a9d68245b4 Mon Sep 17 00:00:00 2001
From: Barrett Ruth
Date: Fri, 29 Nov 2024 21:27:21 -0600
Subject: [PATCH] fix(post): fetch code lazily
---
posts/algorithms/extrema-circular-buffer.html | 166 +-----------------
.../extrema-circular-buffer/map.cpp | 56 ++++++
.../extrema-circular-buffer/monotonic.cpp | 65 +++++++
.../extrema-circular-buffer/naive.cpp | 38 ++++
public/prism/prism-theme.css | 4 +-
scripts/index.js | 2 -
scripts/post.js | 36 ++++
styles/common.css | 5 -
styles/index.css | 4 +
styles/post.css | 5 +-
10 files changed, 209 insertions(+), 172 deletions(-)
create mode 100644 public/code/algorithms/extrema-circular-buffer/map.cpp
create mode 100644 public/code/algorithms/extrema-circular-buffer/monotonic.cpp
create mode 100644 public/code/algorithms/extrema-circular-buffer/naive.cpp
diff --git a/posts/algorithms/extrema-circular-buffer.html b/posts/algorithms/extrema-circular-buffer.html
index 7980a09..58ebb74 100644
--- a/posts/algorithms/extrema-circular-buffer.html
+++ b/posts/algorithms/extrema-circular-buffer.html
@@ -115,44 +115,7 @@
operations. The minimum/maximum element must be found via a linear
scan in \(O(n)\) time, certainly far from optimal.
-
@@ -174,9 +137,7 @@ private:
std::map<double, size_t>std::map
allows us to do all of this.
@@ -184,62 +145,7 @@ private:
Now, we can access extrema instantly. Insertion and deletion take
\(O(log(n))\) time thanks to the map—but we can do better.
-
#include <deque>
-#include <map>
-#include <stdexcept>
-
-class ExtremaCircularBuffer {
-public:
- ExtremaCircularBuffer(size_t capacity) : capacity(capacity) {}
-
- void push_back(double value) {
- if (prices.size() == capacity) {
- double front = prices.front();
-
- if (--sorted_prices[front] == 0)
- sorted_prices.erase(front);
- prices.pop_front();
- }
-
- prices.push_back(value);
- ++sorted_prices[value];
- }
-
- void pop_front() {
- if (prices.empty()) {
- throw std::out_of_range("Cannot pop_front() from empty buffer");
- }
-
- double front = prices.front();
-
- if (--sorted_prices[front] == 0)
- sorted_prices.erase(front);
- prices.pop_front();
- }
-
- size_t size() const { return prices.size(); }
-
- double get_max() const {
- if (prices.empty()) {
- throw std::out_of_range("Cannot find max() of empty buffer");
- }
-
- return sorted_prices.rbegin()->first;
- }
-
- double get_min() const {
- if (prices.empty()) {
- throw std::out_of_range("Cannot find min() of empty buffer");
- }
-
- return sorted_prices.begin()->first;
- }
-
-private:
- std::deque<double> prices;
- std::map<double, size_t> sorted_prices;
- size_t capacity;
-};
+
@@ -298,71 +204,7 @@ private:
once; across a sequence of \(n\) operations, \(n\) total \(O(1)\)
operations will be executed).
-
#include <deque>
-#include <stdexcept>
-#include <utility>
-
-class ExtremaCircularBuffer {
-public:
- explicit ExtremaCircularBuffer(size_t capacity) : capacity(capacity) {}
-
- void push_back(double value) {
- if (prices.size() == capacity) {
- double front_value = prices.front();
- pop_max(front_value);
- prices.pop_front();
- }
-
- prices.push_back(value);
- push_max(value);
- }
-
- void pop_front() {
- if (prices.empty()) {
- throw std::out_of_range("Cannot pop_front() from empty buffer");
- }
-
- double front_value = prices.front();
- pop_max(front_value);
- prices.pop_front();
- }
-
- size_t size() const { return prices.size(); }
-
- double get_max() const {
- if (prices.empty()) {
- throw std::out_of_range("Cannot find max() of empty buffer");
- }
-
- return maxs.front().first;
- }
-
-private:
- void push_max(double value) {
- size_t popped = 0;
-
- while (!maxs.empty() && maxs.back().first < value) {
- popped += maxs.back().second + 1;
- maxs.pop_back();
- }
-
- maxs.emplace_back(value, popped);
- }
-
- void pop_max(double value) {
- size_t popped = maxs.front().second;
-
- if (popped == 0) {
- maxs.pop_front();
- } else {
- --maxs.front().second;
- }
- }
-
- std::deque<double> prices;
- std::deque<std::pair<double, size_t>> maxs;
- size_t capacity;
-};
+
further improvements
-
diff --git a/public/code/algorithms/extrema-circular-buffer/map.cpp b/public/code/algorithms/extrema-circular-buffer/map.cpp
new file mode 100644
index 0000000..9adb021
--- /dev/null
+++ b/public/code/algorithms/extrema-circular-buffer/map.cpp
@@ -0,0 +1,56 @@
+#include
+#include