はじめに
- この記事は、以下の問題の復習記事です
- AtCoder 218_d Rectangle
 
 - いつもの感覚でListで処理したらTLE、解説ACでSetで処理したら通るので、どのくらい違うのか疑問に思って調べました。
 
ACのソースコード
- https://atcoder.jp/contests/abc218/submissions/25830932
 - Setで実装するとAC
 - いつもだとListでやりがち
- ○:p = set([tuple(input().split()) for _ in range(N)])
 - ×:p = [(input().split()) for i in range(2000)]
 
 
テスト用データセットと計測の条件
- 以下の2パターンとする
- Set ○:p = set([tuple(i, i) for i in range(2000)])
 - List ×:p = [(i, i) for i in range(2000)]
 
 - テストデータセットとしては、単純に,(i,i)の点を2000個用意する
 - 計測は、2点を選んで、他の2点を探索する部分だけを計測。(SetとListの入力部分を含まない)
 
計測結果
Setでの実行結果
- elapsed_time:0.4602658748626709[sec]
 - elapsed_time:0.46323299407958984[sec]
 - elapsed_time:0.5020439624786377[sec]
 
Listでの実行結果
- elapsed_time:210.26401782035828[sec]
 - elapsed_time:225.0454020500183[sec]
 - elapsed_time:206.4326469898224[sec]
 
結論
- こりゃListでTLEしたわけだ
 - ポイントは以下の記事が参考になりました。inの処理が、ListだとO(N)、SetだとO(1)なのですね。勉強になりました。