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 投稿