基本的な探索アルゴリズムのテンプレート集

再帰を用いた探索手法 再帰は、探索アルゴリズムの実装において非常に強力なツールです。ここでは、いくつかの基本的な列挙問題を再帰関数で解くテンプレートを示します。 部分集合の列挙 (指数型探索) N個の要素からなる集合のすべての部分集合を生成します。各要素について「含める」か「含めない」かの2つの選択肢があるため、計算量はO(2^N)となります。 #include & ...

10月23日 14:31 投稿

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

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

9月14日 13:56 投稿

回溯法による組合せ問題の解法:理論からLeetCode 77まで

回溯法の基本概念 回溯法(Backtracking)は、探索空間を系統的に調べるアルゴリズム手法です。再帰と密接に関連しており、再帰的な探索過程で「戻る」操作を含むため、この名前が付いています。 この手法の核心は全探索にあります。問題の制約条件を満たすすべての解を列挙し、その中から目的のものを選び出します。効率化のために枝刈り(Pruning)を組み合わせること ...

9月6日 04:10 投稿

データ構造とアルゴリズムの実践:ユニオンファインドと二分木操作

本記事では、特定のアルゴリズム問題に対するアプローチと実装について考察します。ユニオンファインド、ハッシュテーブル、そして二分木のさまざまな操作(巡回、比較、対称性チェック、パス計算)に焦点を当てます。 アカウントのマージ問題 複数のメールアドレスが同一人物に属するかを判断し、関連するすべてのアドレスを統合する問題について考えます。これは、互い ...

8月16日 21:57 投稿

動的計画法(1)——アルゴリズム入門(16)

動的計画法を学ぶために、まずは2つの問題から始めましょう。 鋼板の切断問題 1.1 問題の提示 ある企業は長さがnの鋼板をいくつかの断片に切り分けて販売したいと考えています。市場では、長さi(0[r_n = \max_{1\leq i\leq n}( p_i + r_{n-i}) ]よって、この問題を解決するには「トップダウン」の再帰的な方法が利用できます。 1.3 トップダウン再帰実装 public static ...

8月9日 20:24 投稿

順序リストの実装

空間計算量 一般的な再帰は深さ優先探索であり、深さ優先探索の空間計算量は再帰の深さによって決まります。ある方向での再帰が終了すると、その時点で使用していたスタック領域が解放され、同じメモリが再利用されます。 順序リスト 静的順序リスト typedef int SLDataType; #define N 10 struct SeqList { SLDataType a[N]; int size; }; 動的順序リスト seq ...

7月30日 01:26 投稿

第5回藍橋杯 C++ B級プログラミングコンテスト問題解説

1. ビールと飲料の購入 解法: 全探索(ブルートフォース) ビール(1缶2.3元)と飲料(1缶1.9元)の合計金額が82.3元。ビールの本数が飲料より少ない条件で計算します。浮動小数点計算の誤差を避けるため、10倍して整数で処理します。 #include <iostream> using namespace std; int main() { for (int beer = 0; beer <= 823 / 23; ++beer) { for ( ...

7月29日 17:12 投稿

C言語初学者向けの実践プログラムと核心概念の解説

基本入出力と制御構造 初期学習段階では、標準入出力と基本的な制御フローをマスターすることが重要です。 #include <stdio.h> int main() { // 飛行機のASCIIアート printf(" ** \n"); printf(" ** \n"); printf("************\n"); printf("************\n"); printf(" * * \n"); printf(" * * \n"); ...

7月25日 17:40 投稿

プログラミング実験レポート

1. 点数評価システム #include <stdio.h> char calculateGrade(int score); int main() { int score; char result; while (printf("点数を入力してください: "), scanf("%d", &score) != EOF) { result = calculateGrade(score); printf("Score: %d, Grade: %c\n\n", score, result); } return 0; } char calculateGrade( ...

7月19日 17:22 投稿

リスト操作の基礎: 要素の削除、リストの設計、およびリストの逆転

リスト理論の基礎 リストノードの定義 class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next 203. リストから要素を削除する class Solution: def removeElements(self, head, val): dummy_head = ListNode(next=head) current = dummy_head while current.next is not None: ...

7月16日 21:47 投稿