Проверьте, есть ли в ArrayList размера N два числа, сумма которых равна N - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть домашнее задание. Я должен реализовать алгоритм, который должен проверить, если в ArrayList, размером N, есть хотя бы два числа, которые добавили, их сумма равна N. Сложность алгоритма должна быть Theta (n log n). Я уже знаю, что могу использовать Merge.Sort или Heap-Sort, тогда я должен вычесть размер списка массивов, с каждым элементом списка массивов. Вопрос в следующем: вычитая последовательно сложность, все равно будет Тета (n log n)?!? Если нет, то как я могу сохранить это?

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

сортировка массива с помощью любого алгоритма сортировки, предпочтительно с приемлемым порядком, например, mergeSort (O (nlogn));

затем начинаем проверять первый и последний элемент массива и сохраняем их индексы, а именно: «начало» и «конец». в то время как последний элемент больше, чем желаемое значение, уменьшите индекс на единицу, затем сравните эту сумму «начало» и «конец» с желаемым значением,

если оно больше желаемого значения, вы не найдете двух значений, удовлетворяющих вашему условию,

если оно равно вашему желаемому значению, сообщите элементы start и end

, если его значение меньше желаемого значения, увеличивается индекс 'start' и сделайте сравнение снова,

повторять, пока два индекса не встретятся друг с другом.

наконец, сложность будет: O (n) + O (nlogn), что равно O (nlogn)

0 голосов
/ 30 апреля 2018

Сортировка массива с помощью MergeSort для O (n log n) затем для каждой записи r_i в массиве выполнить поиск записи N - r_i, используя двоичный поиск, который равен O (log n)

У вас будет O (n log n) для mergeSort + O (n log n) для n бинарных поисков -> O (n log n)

...