7 / 7 / 7
Регистрация: 20.06.2016
Сообщений: 72

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

10.11.2017, 23:12. Показов 1783. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru