トライ木:効率的な文字列検索と接頭辞マッチングのためのデータ構造

トライ木(Trie)は、辞書木や接頭辞木とも呼ばれるデータ構造で、特定の文字列が存在するかどうかの検索や、特定の接頭辞を持つ文字列の数を効率的に数えるために使用されます。 トライ木は接頭辞の概念を利用しており、各文字列を一文字ずつ分解して木構造のノードに格納します。例えば、"cup", "apple", "cake", "app", "blog" という単語がある場合、以下のような木構 ...

5月19日 06:24 投稿

Redis 5.0.7ソースコード解析:双方向リンクリスト

Redisにおける双方向リンクリストの実装は、adlist.hとadlist.cというファイルに記述されています。 一、データ構造 Redisで実装されている双方向リンクリストは、一般的な双方向リンクリストと基本的に同じ構造を持っています。 単一ノード: 1 typedef struct listNode { 2 struct listNode *prev; 3 struct listNode *next; 4 void *value; 5 } listNode; ...

5月19日 05:24 投稿

競技プログラミング問題解説:5つのアルゴリズム問題の実装例

P1628 合并序列 - 文字列のマージ 指定されたプレフィックスで始まるすべての文字列をマルチセットに格納し(重複を許可し、自動的にソートされる)、出力します。 #include <iostream> #include <vector> #include <string> #include <set> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); in ...

5月18日 16:12 投稿

差分配列と累積和のアルゴリズム

差分配列と累積和 テンプレート(疑似コード) // 元データの読み込み: n, m, a n, m = 入力() for i = 0 to n-1: a[i] = 入力() // 元の配列 // 差分配列の構築 for i = 0 to n-1: diff[i] = a[i] - a[i-1] // 区間操作 while m > 0: m = m - 1 l, r, value = 入力() diff[l] = diff[l] + value diff[r+1] = diff[r+1] - value // 累積和で ...

5月18日 12:33 投稿

二分探索木(BST)

① なぜ二分探索木が必要なのか? ソートされた配列で要素を検索する場合、二分探索を使用すると、複雑度は O(log n) になります。 しかし、その中に要素を挿入または削除する場合、複雑度は O(n) になります。 この問題に対する解決策として、二分探索木が存在します。 ② 二分探索木とは何か? まず、二分探索木の目的を明確にします:検索、挿入、削除の操作を O(log n) ...

5月18日 08:53 投稿

Codeforces Round #627 解法解説

A - Yet Another Tetris Problem n個の整数a_iが与えられます。各操作では、任意のiについてa_iを2増やすか、すべてのa_iを1減らすことができます。すべての値を0にできるか判定してください。 解法:すべての値の偶奇が一致する場合のみ可能です。 #include <iostream> using namespace std; void solve() { int n, first, val; cin >> n >> first; fi ...

5月17日 19:21 投稿

Redissonを用いたSpring Bootアプリケーションの開発ガイド

Spring BootアプリケーションにRedissonを統合することで、分布型データ構造やサービスを容易に利用できます。以下の手順は、依存関係の追加、設定、主要なデータ型の操作、分布型ロックの使用を網羅しています。 1. 依存関係の追加 Spring Bootプロジェクトの`pom.xml`ファイルにRedissonの依存を追加します。最新バージョンを使用することで、最新機能とセキュリティ修 ...

5月17日 04:24 投稿

ヒープ構造の理解と実装:データ構造入門から実践まで

前書き コンピュータサイエンスにおいて、ヒープ(Heap)は優先度付きキューの実装や効率的なソートアルゴリズム(ヒープソート)に使われる重要なデータ構造です。ヒープは完全二分木をベースにしており、配列による順序表現が可能で、メモリ効率と操作速度のバランスに優れています。 1. 木構造の基礎 1.1 木とは 木は非線形データ構造で、ノードの階層的集合です。根( ...

5月16日 12:26 投稿

C++プログラミングの重要な注意点とベストプラクティス

1. イテレータとペアの値へのアクセス方法の違い イテレータを介して値にアクセスする場合と、ループ内で直接ペアオブジェクトにアクセスする場合で、ドット演算子とアロー演算子の使い分けが必要です。 class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { std::unordered_map hash_map; for(int i = 0; i < ...

5月16日 00:32 投稿

【データ構造とアルゴリズム】(24)高度なデータ構造とアルゴリズム設計:二つのポインタを用いた問題の解法と実装例

4.6 Leetcodeにおける二つのポインタ手法 以下の問題はすべて二つのポインタを用いるものであり、加えて以下のケースも含まれる: Leetcode3: 最長の重複しない部分文字列(ハッシュテーブルの章で扱った) ホーソーのクイックソート 二分探索 など ゼロの移動 - Leetcode 283 public class ZeroMoveLeetcode283 { static void moveZeros(int[] nums) { int ...

5月15日 22:47 投稿