キュー
先入れ先出し (FIFO) でデータを管理する基本データ構造
データ構造基礎
キューとは
キュー (Queue) は、先に追加された要素が先に取り出される FIFO (First-In, First-Out) のデータ構造である。enqueue (末尾に追加) と dequeue (先頭から取り出し) の 2 つの操作で構成される。レジの行列と同じ原理だ。
計算量
| 操作 | 計算量 |
|---|---|
| enqueue (追加) | O(1) |
| dequeue (取り出し) | O(1) |
| peek (先頭を参照) | O(1) |
TypeScript での実装
class Queue<T> {
private items: Map<number, T> = new Map();
private head = 0;
private tail = 0;
enqueue(item: T): void {
this.items.set(this.tail++, item);
}
dequeue(): T | undefined {
if (this.isEmpty()) return undefined;
const item = this.items.get(this.head);
this.items.delete(this.head++);
return item;
}
peek(): T | undefined {
return this.items.get(this.head);
}
isEmpty(): boolean {
return this.head === this.tail;
}
get size(): number {
return this.tail - this.head;
}
}
配列の shift() は O(n) のため、大量のデータを扱う場合は Map ベースの実装が効率的だ。
キューの種類
| 種類 | 特徴 | 用途 |
|---|---|---|
| FIFO キュー | 先入れ先出し | メッセージキュー、タスクキュー |
| 優先度キュー | 優先度順に取り出し | スケジューリング、ダイクストラ法 |
| 双方向キュー (Deque) | 両端から追加・取り出し | スライディングウィンドウ |
| 循環キュー | 固定サイズ、末尾が先頭に繋がる | バッファ、ログの保持 |
AWS のメッセージキュー
キューのデータ構造は、分散システムのメッセージングに直接応用される。
| サービス | 種類 | 特徴 |
|---|---|---|
| SQS Standard | FIFO ではない (ベストエフォート順序) | 高スループット、at-least-once |
| SQS FIFO | 厳密な FIFO | 順序保証、exactly-once |
| Kinesis | ストリーム (シャード内 FIFO) | リアルタイム処理、複数コンシューマー |
BFS (幅優先探索) でのキュー
function bfs(graph: Map<string, string[]>, start: string): string[] {
const visited = new Set<string>();
const queue = new Queue<string>();
const result: string[] = [];
queue.enqueue(start);
visited.add(start);
while (!queue.isEmpty()) {
const node = queue.dequeue()!;
result.push(node);
for (const neighbor of graph.get(node) ?? []) {
if (!visited.has(neighbor)) {
visited.add(neighbor);
queue.enqueue(neighbor);
}
}
}
return result;
}
スタックとの比較
| データ構造 | 順序 | 用途 |
|---|---|---|
| キュー (FIFO) | 先入れ先出し | メッセージキュー、BFS |
| スタック (LIFO) | 後入れ先出し | 関数呼び出し、Undo、DFS |
キューを扱う関連書籍も多い。