編集:申し訳ありません私は不注意で同じコードをコピー&ペーストしたようです。なぜこのO(n^2)ソリューションはO(n)ソリューションより速く動作するのですか?
質問:
0からN-1までの数値のリストを考えると、あなたの仕事が見つからない 番号を見つけることです。あなたのプログラムは整数のリストを取り、 の単一の整数(欠けている数)を返します。
つまり、[0, 1, 3, 4, 5]
の入力は2
を返す必要があります。
O(n)で1つ、(On^2)で1つの解決策が見つかりました。
O(N)溶液
def alt_find_missing(input_list):
input_sum = sum(input_list)
range_sum = sum([i for i in range(min(input_list), max(input_list)+1)])
return range_sum - input_sum
はO(n^2)溶液
def find_missing(input_list):
input_set = set(input_list)
for i in range(min(input_list), max(input_list)+1):
if i not in input_set:
return i
しかしながら、O(N^2)の溶液を(高速Oより実行n)複数の試験でtimeit
試験:
List with 4 elements, using for ... in set (x 1 000 000)
1.1550223514080038
List with 4 elements, using difference of sums (x 1 000 000)
1.391524411772641
List with 100 elements, using for ... in set (x 1 000 000)
8.43574248785071
List with 100 elements, using difference of sums (x 1 000 000)
8.94695660741872
List with 1000 elements, using for ... in set (x 100 000)
8.1138781071155
List with 1000 elements, using difference of sums (x 100 000)
8.383110816298519
これはなぜですか?
あなたはあなたのタイトルを後方に持っていると思います。 – user2357112
あなたの2つの機能は私と同じに見えます。 – user2357112
'sum(range(min(input_list)、max(input_list)+1))'を実行することができるときにリストのcompが何であるか分かりません。問題の状態が '0からN - 'sum(range(max(input_list)+1))'を持つことができます。 –