データ構造の勉強
背景
-
目的
- データ構造を改めて勉強する。
- Pythonでコーディングして知識整理を行い、再コーディング時に自走出来るようにする。
-
参考
- 参考書籍「プログラミングコンテスト攻略のためのアルゴリズムとデータ構造」
データ構造
- Stack
buffer = []#init
buffer.append(x)#append(末尾)
y = buffer.pop()#pop(末尾)
- Queue
- 専用の
queue
モジュールが存在するが、list
のみで実装が可能。- アルゴリズム上位というか、概要確認が目的のため今回は使わない。
- マルチスレッド処理などが良いようだ(?)
- 専用の
buffer = []#init
buffer.append(x)#append(末尾)
y = buffer.pop(0)#pop(先頭)
-
双方向連結リスト
-
Pythonで書くのは重いということが起きそうな気がしているがPythonでやってみた。
- ALDS1_3_Cの処理時間制限でアウトの状態。
-
ポインタのつなぎ方、Gurdianなどが復習できた。
-
性能問題ありだが、動作はする状態。
- 無限ループ
while
よりもfor
が良いという情報あり、やってみたが、課題クリアに至らず。 - データコンテナに独自クラスを利用していることが最大の問題ではないかと推測。
- 無限ループ
-
高速化について考察
- TOPのソースを見ると、
from collections import deque
を使っている。- コードも超シンプル・・。これが競技プログラミングの世界か。
- 何か悔しいが、使えるものが見えたので、ここまで。
- TOPのソースを見ると、
-
Python Tips
- 取り出した値(str型)が数字かどうかの判定
- 逆ポーランド記法をStackで解く場合に必要になった。
y.isdecimal()# return True/False
- StackやQueueで実装していると、不要なところもStack/Queueで実装してしまっていることがある。適切に必要な実装を心がける。
まとめ
学習したこと
- stack, queue, 双方向連結リストのロジックを再確認した。
- 双方向連結リストに関して、pythonでは
collections.deque
を使えば良い。
残課題
- pythonの
list
による、双方向連結リストの独自実装の改良。- ただ、
collections.deque
があるので現状はそれを知るに留めておく。
- ただ、
- pythonの
list
型の各メソッドの計算量の確認とか、最適なロジックの検討。
以上