Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
7 / 7 / 7
Регистрация: 20.06.2016
Сообщений: 72

Как ускорить программу?

10.11.2017, 23:12. Показов 1742. Ответов 12

Студворк — интернет-сервис помощи студентам
Здравствуйте, такая задача:
Страна состоит из n городов, которые расположены на оси. Координата i-го из городов равна xi.
Выведите количество пар городов, между которыми расстояние составляет ровно d.

Входные данные
В первой строке записаны два целых числа n, d (2 ≤ n ≤ 10**5, 1 ≤ d ≤ 10**9).

Вторая строка содержит координаты n городов — последовательность целых чисел x1, x2, ..., xn ( - 10**9 ≤ xi ≤ 10**9). Все xi — различны.

Выходные данные
Выведите искомое количество пар городов. Пары, отличающиеся только порядком городов, следует считать одной и той же парой.

Вот мое решение:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
n, d = list(map(int, input().split()))
coords = list(map(int, input().split()))
pairs = 0
 
for i in range(n - 1):
    try:
        coords.index(coords[0] + d)
        pairs += 1
    except ValueError: pass
 
    try:
        coords.index(coords[0] - d)
        pairs += 1
    except ValueError: pass
    coords.pop(0)
print(pairs)
Однако оно не проходит ограничение по времени. Оно составляет одну секунду. Реально ли как-то еще ускорить программу?

Добавлено через 41 минуту
Стало быстрее, но все равно недостаточно быстро.
Python
1
2
3
4
5
6
7
8
9
10
11
n, d = map(int, input().split())
coords = list(map(int, input().split()))
pairs = 0
coords.sort()
for i in range(n - 1):
    try:
        coords.index(coords[0] + d)
    except ValueError: pass
    else: pairs += 1
    finally: coords.pop(0)
print(pairs)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.11.2017, 23:12
Ответы с готовыми решениями:

Как ускорить программу?
m=int(input()) for i in range(1,10**18): if (i)<m and m<=(i ** 2 + i)//2: a=(((i ** 2 + i)//2)) print (a) ...

Как ускорить программу
Вот задача: ограничение времени на тест: 1 сек. ограничение памяти на тест: 262144 KB. ввод: input.txt вывод: output.txt Вам...

Как ускорить программу
Вот задача: Требуется определить в заданном массиве количество элементов, равных искомому числу. Входные данные В первой строке...

12
440 / 432 / 159
Регистрация: 21.05.2016
Сообщений: 1,338
11.11.2017, 00:43
Python
1
2
3
4
5
6
7
8
9
10
11
12
n, d = map(int, input().split())
coords = list(map(int, input().split()))
pairs = 0
coords.sort()
for i in range(len(coords)):
    for j in range (i + 1, len(coords)):
        if coords[j] - coords[i] == d:
            pairs += 1
            break
        elif coords[j] - coords[i] > d:
            break
print(pairs)
0
7 / 7 / 7
Регистрация: 20.06.2016
Сообщений: 72
11.11.2017, 00:54  [ТС]
Сложность вашего решения N**2. Оно уже при 1000 будет выполняться очень долго. А входные данные до 10**9
0
440 / 432 / 159
Регистрация: 21.05.2016
Сообщений: 1,338
11.11.2017, 01:00
Цитата Сообщение от Anikin Посмотреть сообщение
Сложность вашего решения N**2. Оно уже при 1000 будет выполняться очень долго. А входные данные до 10**9
Сложность вашего решения O(n**2) Для поиска индекса необходимо пройти весь список
У моего решения сложность O(n log n)
0
7 / 7 / 7
Регистрация: 20.06.2016
Сообщений: 72
11.11.2017, 01:06  [ТС]
Откуда тут log n? У вас два цикла, которые зависят от n. Тут даже не используется бинарный поиск числа. И решение за n log n не проходит все тесты. У вас по сути перебор всех возможных вариантов.
0
440 / 432 / 159
Регистрация: 21.05.2016
Сообщений: 1,338
11.11.2017, 01:24
Цитата Сообщение от Anikin Посмотреть сообщение
Откуда тут log n? У вас два цикла, которые зависят от n. Тут даже не используется бинарный поиск числа. И решение за n log n не проходит все тесты. У вас по сути перебор всех возможных вариантов.
второй цикл начинается с i+1, i каждый раз увеличивается. У вас функция index делает тоже самое, но всегда начинает с нулевого элемента и заканчивает последним

Добавлено через 15 минут
Хотя да, вру. Если брать хучший случай, то получится n * n/2 итераций
0
7 / 7 / 7
Регистрация: 20.06.2016
Сообщений: 72
11.11.2017, 01:26  [ТС]
Почему вы решили, что list.index ищет элементы простым перебором, а не методом двоичного поиска например? В любом случае, "внутренний" поиск самого питона быстрее, чем тот же поиск через циклы. Так как язык интерпретируемый, и не очень быстрый.
0
440 / 432 / 159
Регистрация: 21.05.2016
Сообщений: 1,338
11.11.2017, 01:37
Цитата Сообщение от Anikin Посмотреть сообщение
Почему вы решили, что list.index ищет элементы простым перебором, а не методом двоичного поиска например?
Потому что интерпретатор не знает отсортирован список или нет

Добавлено через 3 минуты
Вот, кстати. Замените index на двоичный поиск, получите n log n
0
7 / 7 / 7
Регистрация: 20.06.2016
Сообщений: 72
11.11.2017, 01:44  [ТС]
Эта программа работает медленней той, что я написал сначала. Это n log n.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
n, d = list(map(int, input().split()))
coords = list(map(int, input().split()))
coords.sort()
pairs = 0
for i in range(n - 1):
    left = i + 1
    right = n - 1
    mid = 0
    while left != right and coords[i] + d != coords[mid]:
        mid = (left + right) // 2
        if coords[mid] > coords[i] + d:
            right = mid - 1
        elif coords[mid] < coords[i] + d:
            left = mid + 1
    if left == right:
        if coords[i] + d == coords[left]:
            pairs += 1
    elif coords[i] + d == coords[mid]:
        pairs += 1
print(pairs)
0
440 / 432 / 159
Регистрация: 21.05.2016
Сообщений: 1,338
11.11.2017, 02:25
эта быстрее работает на больших значениях n

Добавлено через 32 минуты
Тут сортировка сама по себе дает n log n. Линейно эту задачу не решить
0
7 / 7 / 7
Регистрация: 20.06.2016
Сообщений: 72
11.11.2017, 13:17  [ТС]
Сортировать можно за log n. Цикл работает за n. Бинарный поиск работает за log n. Получается O(n log log n).
0
440 / 432 / 159
Регистрация: 21.05.2016
Сообщений: 1,338
11.11.2017, 18:46
Цитата Сообщение от Anikin Посмотреть сообщение
Сортировать можно за log n.
Это что за чудо сортировка такая?
0
7 / 7 / 7
Регистрация: 20.06.2016
Сообщений: 72
11.11.2017, 21:28  [ТС]
Ошибся. Время работы сортировки слиянием O(n log n)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.11.2017, 21:28
Помогаю со студенческими работами здесь

Как ускорить программу
Напишите программу, которая будет искать все целые X, удовлетворяющие уравнению AX3 + BX2 + CX + D = 0, где A, B, C, D — данные...

Как ускорить программу?
Задача: найти в строке такую подстроку максимальной длины, чтобы символы в ней не повторялись. Принцип решения: пусть дана строка s, в...

Как ускорить программу?
n, m = input().split() team,word = , points = *int(n) for i in range(int(m)): team, word = input().split() ...

Как ускорить программу
есть прога но она очень медленно работает помогите ускорить пожалуйста def fast_pow(x, y): if y == 0: return 1 if y...

Как можно ускорить программу?
god,kolvo=int(input()), int(input()) x,y=0,0 for i in range(god, god + kolvo): if (i%4==0 or i%400==0) and i%100!=0: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru