Рассмотрим следующую вычислительную : вход: массив чисел a размера n. выход: индексы 1 ≤ i,j,k ≤ n, для которых a[i]+a[j]+a[k]=0, или "нет", если таких индексов нет (считаем, что i,j,k могут быть равны). нетрудно видеть, что для такой есть простой переборный алгоритм, время работы которого зависит от n кубически: for i=1 to n: for j=1 to n: for k=1 to n: if a[i]+a[j]+a[k]=0: print i, j, k stop print "нет" данный алгоритм совершает не более n3 базовых операций. постройте алгоритм, который решает эту за квадратическое от n время, то делает не не более cn2 базовых операций, где c — константа, независящая от n. опишите алгоритм словами (код писать не нужно), псевдокод, если считаете нужным, докажите корректность алгоритма и оценку на время работы.
234
248
Ответы на вопрос:
Алгоритм. отсортируем массив за o(nlogn). запустим цикл по всем k, в теле цикла будем искать индексы i < = j, такие, что a[i] + a[j] = -a[k]. понятно, что этот поиск надо делать за o(n), чтобы общее время работы было квадратичным. искать будем с двух указателей. рассмотрим кусок массива, в котором ищем ответ a[l..r] (первоначально l = 1, r = n). посмотрим на a[l] + a[r]. если эта сумма больше, чем нужно, уменьшим на 1 число r, если меньше - увеличим на 1 число l, если равно -a[k] - победа, выводим ответ (l, r, k). будем повторять это в цикле, пока l не станет больше r. если после выполнения цикла по k искомая тройка так и не нашлась, пишем "нет". корректность. пусть в какой-то момент a[l] + a[r] < -a[k]. тогда, чтобы иметь возможность получить a[i] + a[j] = -a[k], надо сумму увеличить. a[l] оказалось настолько мало, что даже если прибавить к нему самое большое возможное число (а это как раз a[r] - массив-то то всё равно получается слишком мало. значит, a[l] в ответе не будет, и можно безбоязненно выкинуть его из рассмотрения. аналогично будет и в случае, когда a[l] + a[r] > -a[k]. осталось показать, что если такая тройка индексов существует, то наш алгоритм не выдаст неверный ответ "нет". но это очевидно: если ответ (i, j, k), то уж при k = k алгоритм что-нибудь да найдёт. время работы. внутренний цикл выдает ответ не более чем за линейное время: всякий раз размер массива уменьшается на 1, всего элементов в массиве n, а на каждом шаге тратится константное время; пусть время выполнения внутреннего цикла t'(n) < an. тогда все n проходов внешнего цикла затратят время t1(n) < = n t'(n) < an^2. сортировку можно сделать за время t2(n) < b nlogn < bn^2 общее время работы t(n) = t1(n) + t2(n) < an^2 + bn^2 = cn^2
Реши свою проблему, спроси otvet5GPT
-
Быстро
Мгновенный ответ на твой вопрос -
Точно
Бот обладает знаниями во всех сферах -
Бесплатно
Задай вопрос и получи ответ бесплатно
Популярно: Информатика
-
Okean11107.06.2021 12:07
-
Zauchka1708.08.2021 20:37
-
1Shupy4ka29.08.2021 00:26
-
lesya1614622.09.2022 12:09
-
ky3325masha24.11.2020 18:22
-
lizokturina28.01.2021 09:58
-
Barvina77918.04.2021 20:51
-
elzarik0806.05.2023 01:28
-
Знания06107.07.2021 10:31
-
генадийпетрович13.06.2020 22:21
Есть вопросы?
-
Как otvet5GPT работает?
otvet5GPT использует большую языковую модель вместе с базой данных GPT для обеспечения высококачественных образовательных результатов. otvet5GPT действует как доступный академический ресурс вне класса. -
Сколько это стоит?
Проект находиться на стадии тестирования и все услуги бесплатны. -
Могу ли я использовать otvet5GPT в школе?
Конечно! Нейросеть может помочь вам делать конспекты лекций, придумывать идеи в классе и многое другое! -
В чем отличия от ChatGPT?
otvet5GPT черпает академические источники из собственной базы данных и предназначен специально для студентов. otvet5GPT также адаптируется к вашему стилю письма, предоставляя ряд образовательных инструментов, предназначенных для улучшения обучения.