Content-LengthとTransfer-Encodingを用いたC++ソケットによるHTTPデータ受信の正確な実装

HTTPはトランスポート層でTCPプロトコルを使用するため、ソケットプログラミングでは通常、ソケットの初期化、IPの解決、接続、送信、受信という流れになります。 リクエストヘッダーの送信は比較的簡単ですが、受信処理では問題が発生します。 受信関数recvにはバッファサイズを指定する必要がありますが、HTTPプロトコルではヘッダーにデータ長を示すフィールドが存在し ...

9月23日 03:39 投稿

繰り返し二乗法、高速乗算、および進数変換のアルゴリズム実装

繰り返し二乗法 (Binary Exponentiation) 繰り返し二乗法は、べき乗の計算($x^n \pmod m$)を効率的に行う手法です。標準的な pow 関数よりも高速であり、大きな数に対する余り(mod)の計算を安全に行うことができます。 アルゴリズムの原理 指数 $n$ を 2 進数として分解することで、計算回数を $O(n)$ から $O(\log n)$ に削減します。例えば、$x^{10}$ を計算する場 ...

9月20日 10:59 投稿

樹状配列と座標圧縮:アルゴリズム問題の実装解説

アルゴリズム問題におけるデータ構造の応用 本稿では、効率的なデータ処理を目的とした 5 つのアルゴリズム問題について解説します。特に、樹状配列(Binary Indexed Tree)や座標圧縮、篩を用いた前処理などの技術に焦点を当てます。 問題 1:自然数の出現頻度计数 入力された自然数の出現回数を统计し、数値の昇順で出力する問題です。値の範囲が非常に大きいため(1e10 ...

9月19日 00:23 投稿

ESP32およびOpenWeatherMap APIを用いた電子ペーパー天気表示端末の構築ガイド

OpenWeatherMap APIの概要と選定 ESP32マイコンと電子ペーパーディスプレイ(EPD)を組み合わせた省電力な天気表示システムを構築する場合、OpenWeatherMapが提供するAPIエンドポイントが主なデータソースとなります。特に、ESP32での実装においては、以下の2つのAPIサービスが重要な役割を果たします。 APIサービス名 主な用途 無料利用枠の上限 One Call API 3.0 ...

9月18日 20:56 投稿

数論・組み合わせ・対頂ヒープを用いた競技プログラミング問題の解析と実装

問題A:平方倍数の探索 問題概要 正の整数 k が与えられる。k | n^2 (n^2 は k の倍数)かつ n が k の倍数ではないという条件を満たす最小の正の整数 n を求める。 解法の考察 求める n^2 は k の倍数であるため、n^2 = m * k と表せる。ここで n は k の倍数ではないため、m は 1 以上 k-1 以下の範囲に存在する。m を直接全探索すると計算量が O(k) となりTLEする。 ...

9月17日 20:44 投稿

C++ クラスの基礎 (第1部)

クラスの設計ではデータ抽象とカプセル化が基本原則です。 データ抽象はインターフェース(宣言)と実装(定義)を分離するプログラミング技法です。クラスデザイナーは、クラスの利用者向けにインターフェースと実装を設計します。ここでいう利用者はアプリケーションの最終ユーザーではなく、他のプログラマを指します。 メンバは必ずクラス内で宣言され、その定義はクラ ...

9月17日 05:35 投稿

ネットワークフローのテンプレート集

テンプレートは非常に重要です。 以下に、いくつかの高速で短いネットワークフローのテンプレートを紹介します。 1. 最大フロー a. HLPP バージョン1: このバージョンには激しい最適化が施されています。 行数: 46行 実行時間: 全体で44ms #include <cstdio> using namespace std; #define getchar() (S == T && (T = (S = BB) + fread(BB, 1, 1 << 15 ...

9月15日 06:54 投稿

二分探索木における最小絶対差と最頻値、および二分木の共通祖先探索アルゴリズム

1. 二分探索木における最小絶対差の取得 二分探索木(BST)の性質として、中序巡回(In-order Traversal)を行うと、ノードの値を昇順で取得できるという特徴があります。この性質を利用することで、隣接するノード間の差分を比較し、最小絶対差を効率的に求めることが可能です。 ポインタ prevNode を使用して、常に現在のノード currNode の直前の値を保持するこ ...

9月14日 13:56 投稿

11月15日のアルゴリズム問題集追加

11/15 問題1: 二進数行列の最小反転回数 (3239) 解法はシミュレーションに基づく。 各行の反転回数を計算し、列方向の反転回数も同様に求めます。 int calcRowDiff(const vector& matrix) { int count = 0; for (const auto& row : matrix) { for (size_t i = 0; i < row.size() / 2; ++i) { if (row[i] != row[row.size()-1-i]) ++count; ...

9月9日 19:42 投稿

C++のコピーコンストラクタとメモリ管理

コピーコンストラクタの動作原理 オブジェクト間の代入操作(例:`obj2 = obj1;`)は、デフォルトのコピーコンストラクタを呼び出します。この際、各オブジェクトは異なるメモリアドレスに配置され、メンバ変数の値がコピーされます。 #include <iostream> using namespace std; struct Person { int age; string name; }; int main() { Person p1 = ...

9月8日 09:59 投稿