@Korifa

Почему функция возвращает разные числа?

если в функции в range написать к примеру 6010 и вернуть число с индексом 6000, а потом в range написать число 10000 и снова вернуть число с индексом 6000, то числа разные, почему ?
def dbl_linear(n):
	integers = [1]
	for k in range(10100):
		f = integers[k] * 2 + 1
		integers.append(f)
		c = integers[k]*3+1
		integers.append(c)
	a = list(set(integers))
	a.sort()
	return a[6000]
  • Вопрос задан
  • 209 просмотров
Пригласить эксперта
Ответы на вопрос 2
@deliro
1. Учим основы питона. Множество (set) всегда отсортировано, если создаётся из коллекции (в твоём случае — массива). И если ты сделаешь из него массив — он тоже будет отсортирован. Нет никакого смысла делать a.sort()
2. При увеличении k голова твоего массива "a" МОЖЕТ изменяться, потому что далеко не факт, что "f" и "c" попадут в хвост массива (из-за сортировки). Я даже могу пообещать тебе, что такого не будет, потому что "f" растёт медленней, чем "c". Поэтому при разном количестве шагов будут разные числа на позиции 6000
3. Если ты хочешь удалить дубли из массива без смены позиций — нельзя использовать set. Самый очевидный способ (но при этом очень медленный) — перегнать из одного массива в другой:

a = [7, 5, 7, 7, 1, 2, 3, 2]
b = []
for i in a:
    if i not in b:
        b.append(i)


Сложность такого подхода — O(n**2)

Сократить до O(n) можно использованием множества:

a = [7, 5, 7, 7, 1, 2, 3, 2]
b = []
s = set()
for i in a:
    if i not in s:
        b.append(i)
        s.add(i)


Так как проверки по хэш-таблице в среднем за O(1), то ты получаешь линейную сложность

Доказательство того, что со множествами быстрее:
5bab43fb5af1a808573546.png
Ответ написан
a = list(set(integers))
вот эта функция берет список(list), преобразовывает его в множество(set), туда попадают только уникальные значения из integers, грубо говоря удаляет дубликаты и потом list(integers) преобразует обратно в список, однако список это упорядоченный масив, а вот set не упорядоченный, поэтому после преобразовывания set(integers) внутри все будет каждый раз перемешенно по разному, хотите вернуть упорядоченный, попробуйте
a = [integer for i, integer in enumerate(integers) if integer not in integers[:i]]
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы