回 2-4 道 2 データ構造とアルゴリズム
スタックと
読み終えたら元に
この頁の流れ
出し入れの
「元に 戻す」は、 なぜ新しい 操作から戻るのか
元に
文書を
一方、
違うのは、
スタックと キューは どう違うのか
スタックは
スタックは 上に 積み、 上から取る
スタックは、
Python のappend()、取るのはpop() で、
キューは 後ろに 並び、 前から出る
キューは、
Python のcollections.deque を
2 つの 違いを 表で比べる
| 見る所 | スタック | キュー |
|---|---|---|
| 出る順 | 新しい物から | 古い物から |
| 入れる | append(x) | append(x) |
| 出す | pop() | popleft() |
| 次に | s[-1] | q[0] |
| Python の型 | list | deque |
| 出し入れの手間 | O(1) | O(1) |
空かif not s で、len(s) でappend を
動かして確かめる
1 本目は、undo にredo にundo の
動かす 元に戻すとやり直しを 2 つのスタックで
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
書いた あいう
戻す あい
戻す あ
やり直し あい
書いた あいえ
やり直し あいえ
redo の数 0「あ」
ここでredo をredo に
元に
2 本目は、
動かす かっこの対応をスタックで確かめる
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
(a[1] + b) 正しい
f(x[0)] 6字目が違う
{(} 3字目が違う
((a) 1個が残る
a) 2字目が余分(a[1] + b) はf(x[0)] は) で、[ なので((a) はa) は) で
スタックと キューは どこで 崩れるのか
キューを
list で 作った キューは、 取り出すたびに詰め直す
list の pop(0) でpop(k) はpop(0) は
次のpopleft() は
動かす キューを list で作ると詰め直しが増える
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
件数 list deque
1000 499500 0
2000 1999000 0
4000 7998000 01000 件を
来る 数が 多いと、 キューは 伸び続ける
キューは、
次の
動かす 来る数が多いとキューが伸びる
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
刻み 長さ 先頭の待ち
1 1 0
4 4 1
7 7 2
10 10 3
先に来た順の次 7
後に来た順の次 101 刻みで
10 刻み目に、
スタックと キューは 仕事で どう 確かめるのか
仕事では、
- 出す順を
決める。 元に 戻す、 ブラウザの 戻る、 かっこの 対応、 深く 先に 進む探し方は スタック。 仕事の 受付順、 印刷の 順番、 近い順に 広げる 探し方はキュー - スタックは
list の appendとpop、キューはcollections.dequeのappendとpopleftを使う。 list の pop(0)をループの 中で 使っていないかを探す - 試験では、
空から 取り出した ときの 振る 舞いを 決めて おく。 Python の list と deque は、 空から 取り出すと IndexErrorを出す - 本番では、
キューの 長さと、 先頭が 待った 時間を 見張る。 長さが 増え続けるなら、 来る 数が 片付ける 数を 上回っている
元に戻すの試験
def test_undo_returns_newest():
write("あ")
write("い")
do_undo()
assert text == "あ"関わる実例
Facebook は、 混んだ ときに 新しい 要求から 片付けた (2015年11月)
Facebook の
記事は、
崩れた
出典は Fail at Scale (Communications of the ACM、
Amazon は、 たまった 行列を 別の キューへ 逃が した (2019年12月5日)
Amazon は
記事に
崩れた
出典は Avoiding insurmountable queue backlogs (Amazon Builders' Library) です。
よくある問い
呼び出しの スタックや スタックオーバーフローも 同じ スタックですか
同じRecursionError が出ます。
スタックと キューは どちらが 速いですか
どちらも、
スタックと キューは、 どんな 場面で 使われていますか
スタックは、
deque と queue.Queue は どう 違いますか
collections.deque はmaxlen をqueue.Queue は、
優先度付きキューとは何ですか
入れたheapq や queue.PriorityQueue で作れ、heapq のheap[0] に
確認クイズ
答えだと
1 問目
「あ」
2 問目
Python で、
3 問目
かっこの対応 f(x[0)] を、) が
4 問目
この
スタックとキューから取り出す
from collections import deque
s = [] # スタック
q = deque() # キュー
for v in [1, 2, 3]:
s.append(v)
q.append(v)
s.pop()
q.popleft()
s.append(4)
q.append(4)
print(s.pop(), q.popleft())説明課題
元に
自分の
この回の 先の一歩
元に
もっと深く
この
一次資料
どれも
- Data Structures (Python 公式文書の
チュートリアル、英語)。list を スタックとして 使えること、 append()とpop()、キューにlist を 使うと 先頭の 出し入れで 残りを ずらすので 効率が よくないこと、 collections.dequeを勧める こと、 空の list から popするとIndexErrorが出ること - collections, Container datatypes (Python 公式文書、英語)。deque が
両端の 出し入れを ほぼ 同じ O(1) で できること、 maxlenを決めるといっぱいの ときに 反対の 端から 捨てる こと、 空の deque から 取り出すと IndexErrorが出ること - Time complexity of operations on built-in types (Python 公式文書、英語)。list の
appendがO(1)、 pop(k)がO(n − k) であること - queue, A synchronized queue class (Python 公式文書、英語)。いく
つもの スレッドの 間で 安全に 受け渡すキューである こと、 上限に 達すると 入れるのを 待たせる こと、 FIFO、 LIFO、 優先度付きの 3 つ - heapq, Heap queue algorithm (Python 公式文書、英語)。優先度付きキューの
やり方である こと、 一番小さい物が heap[0]にあること - Built-in Exceptions (Python 公式文書、英語)。上限の
深さを 超えると RecursionErrorが出ること - Fail at Scale (Communications of the ACM、
英語、 2015年11月号)。最悪の 遅れの 障害の 多くで キューに 要求が 並んでいた こと、 adaptive LIFO で 混んだ ときに LIFO に 切り替える こと、 CoDel で 待つ 時間に 上限を 設けること - Avoiding insurmountable queue backlogs (Amazon Builders' Library、英語)。2019年12月5日の
公開、 1 時間止まると 元に 戻るのに 2 倍の 力で さらに 1 時間要る こと、 たまりの ときは 新しい データが 先に 処理される ことが 望まれる こと、 古い物を 別の キューへ移すこと
次へ
道 2 データ構造とアルゴリズムの回
- 2-0アルゴリズムとは順次、
分岐、 反復の 3 つで書く手順頁で読む - 2-1線形探索と二分探索100 万件でも
20 回で見つかる頁で読む - 2-2バブルソートと
挿入・選択ソート遅い ソート 3 つ、 2 倍で 約 4 倍頁で読む - 2-3クイックソートと
マージソート速い ソート 2 つ、 平均と最悪頁で読む - 2-4スタックとキュー積む順と並ぶ順この回
- 2-5再帰自分を
呼んで 小さくする頁で読む - 2-6木と
二分探索木たどる 順、片寄り頁で読む - 2-7ハッシュテーブル鍵から
一気に 引く、衝突頁で読む - 2-8ダイクストラ法と最短経路点と
線、 幅優先、 重みのある道頁で読む - 2-9動的計画法同じ
計算を 2 度しない頁で読む - 2-10試験と
面接で確かめる基本情報 科目B、 道場 10 問、 面接 20 問頁で読む
