データ構造#
データ構造と計算量#
なぜデータ構造を学ぶのか → 一つの実用的な理由は、計算量を大幅に削減できる場合があるから
listは検索(
"hoge" in List
)するとき\(O(n)\)(線形探索)setは検索するとき\(O(1)\)
listでsortすると、要素数の分だけ計算量かかる
heapq(ヒープキュー、優先度つきキュー)で保持すると、最小値や最大値しか取り出せないが、頻繁に最小値や最大値を参照するときはlistで保持して毎回sortするより効率がいい(ABC141D - Powerful Discount Tickets)
スタック#
スタック(stack) はデータの中で最後に入ったものが最初に取り出される 後入れ先出し(Last In First Out: LIFO) のデータ構造
操作:
push(x)
: スタックに要素x
を追加するpop()
: スタックの最後の要素を取り出す
class Stack:
def __init__(self):
self.data = []
def push(self, x):
self.data.append(x)
def pop(self):
return self.data.pop(-1)
s = Stack()
s.push(1)
s.push(2)
s.pop()
2
キュー#
キュー(Queue) はデータの中で最初に入ったものが最初に取り出される、 先入れ先出し(First In First Out: FIFO) のデータ構造
操作:
enqueue(x)
: キューの末尾に要素x
を追加するdequeue()
: キューの先頭から要素を取り出す
from queue import Queue
q = Queue()
q.put(1)
q.put(2)
q.get()
1
連結リスト#
#TODO