редактировать: Извините! Похоже, я небрежно скопировал тот же код.
Вопрос:
Учитывая список чисел от 0 до N-1, ваша задача состоит в том, чтобы найти недостающее число. Ваша программа должна принимать список целых чисел и возвращать одно целое число (отсутствующее число).
то есть ввод [0, 1, 3, 4, 5]
должен возвращать 2
.
Я нашел два решения, одно, я думаю, за O (n), а другое за (On ^ 2).
Решение 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
Почему это?
sum(range(min(input_list), max(input_list)+1))
, поскольку проблема гласит, что диапазоны от0 to N - 1
вы можете просто иметьsum(range(max(input_list)+1))
- person Steven Summers   schedule 12.01.2017n
равнаn^2/2 + n/2
. - person Klaus D.   schedule 12.01.2017range()
наxrange()
, потому чтоrange()
создает список. Вы также создаете список и отбрасываете его (после использования для вычисления суммы) с пониманием списка. Было бы полезно, если бы вы предоставили более подробную информацию о примере O (n ^ 2). Ваш набор данных может быть настолько мал, что накладные расходы на некоторые из ваших операций снижают производительность решения O (n). И имейте в виду, что O(n) означает, что оно всегда будет превосходить решение O(n^2), так как по мере того, как дела становятся большими, оно в конечном итоге будет работать лучше. - person John Szakmeister   schedule 12.01.2017