文書の過去の版を表示しています。


std::setを使わない代替テクニック

競技プログラミングでは、C++ に std::set という(事実上)平衡二分探索木ライブラリがあるから、たまにその使用を前提とした問題が出る。

std::set, multiset は、集合を順序を持って管理するデータ構造であり、以下のことができる(set - cpprefjp C++日本語リファレンス より一部抜粋)

機能 概略 計算量
insert集合に要素を追加$O(\log{N})$
erase 集合から要素を削除$O(\log{N})$
upper_bound
lower_bound
ある値より大きい最小の要素の探索$O(\log{N})$

Pythonでは標準ライブラリにないし、実装してもリストアクセスの遅さからTLEに直面することがままある。

いや、実際には、別に使わなくても何とか別の方法がある場合が多いが、std::setが「使えば一発」なのに対し、問題依存の考察や実装の手間を要するのが常である。 (素直にC++で書けって?そりゃそうだ)

std::setを使いたいけど使えない……という場合に、代わりになりうる方法をメモ。

代替方法一覧

問題に出くわすごとに列挙していき、ある程度蓄積されたら分類方法を考える。

  • Binary Indexed Tree
    • 最も汎用性のある代替方法
  • 優先度付きキュー (heapq)
    • 一定の制約の上で簡単&高速
  • 問題依存の上手い方法
    • 列挙していけば何か共通点みたいなのが見つかるかも知れない
  • C''コードを埋め込んで外部モジュールとしてコンパイル * うむ。 * 参考 * [[https://qiita.com/drken/items/1b7e6e459c24a83bb7fd#2-%E3%81%A4%E3%81%AE-priority_queue
programming_algorithm/data_structure/balancing_binary_search_tree/tree_free.1593447672.txt.gz · 最終更新: 2020/06/29 by ikatakos
CC Attribution 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0