[STATUS: ONLINE] 当サイトは要約付きのエンジニア向けFeedです。

TechDistill.dev

[DISCLAIMER] 当サイトの要約は正確性を保証しません。気になる記事は必ず原文を確認してください。
cd ..

【要約】解説通り全探索でやったのにTLEになった話 【AtCoder典型90問032 Ekiden】 [Zenn_Python] | Summary by TechDistill

> Source: Zenn_Python
Execute Primary Source

// Problem

競技プログラマが、AtCoderの典型問題「Ekiden」を解く際に、全探索の判定ロジックが原因でTLEに直面した。
  • 制約に基づき全順列の全探索を選択したが、判定処理の計算量がボトルネックとなった。
  • 不仲なペアの判定に、リストの走査や二重ループを用いていた。
  • N! 通りの組み合わせに対し、各ステップで不仲リストMを走査すると、計算量が膨大になる。
  • 結果として、Python(PyPy)環境でも実行時間制限を超過した。

// Approach

筆者は、判定処理の計算量を削減するために、不仲情報を集合(set)で管理する手法を採用した。
  • 不仲なペアの情報を、リストではなく集合(set)に格納する。
  • 不仲なペア (a, b) を、順序を入れ替えた (b, a) と共に集合へ追加する。
  • 走順のループ内で、隣接するペアが集合に含まれるかを O(1) で判定する。
  • これにより、判定処理の計算量を O(M) から O(1) へと劇的に削減した。

// Result

実装を改善した結果、実行時間を大幅に短縮することに成功した。
  • 解法2(リスト走査)の4022msから、解法3(集合利用)の314msへと改善した。
  • 実行時間は約12.8分の1にまで短縮された。
  • 集合を用いることで、コードが簡潔になり、可読性も向上した。
  • 計算量の最適化が、実行時間の改善に直結することを実証した。

Senior Engineer Insight

> アルゴリズムの計算量設計において、データ構造の選択は極めて重要である。本件では、判定処理をO(M)からO(1)へ落としたことが決定打となった。大規模なシステムにおいても、高頻度で実行されるループ内での検索処理は、必ずハッシュテーブル等の高速なデータ構造を用いるべきだ。定数倍の改善が、システム全体のレイテンシに決定的な差を生む。

[ RELATED_KERNELS_DETECTED ]

cd ..

> System.About()

TechDistillは、膨大な技術記事から情報の真髄(Kernel)のみを抽出・提示します。