от
У вас есть список возрастающих чисел, что является наиболее эффективным алгоритмом, вы можете думать, чтобы получить список возрастающих суммы каждых двух чисел в этом списке. Дубликатов в результирующем списке не имеют значения, вы можете удалить их или избежать их, если вам нравится. Чтобы было понятно, меня интересует алгоритм. Не стесняйтесь размещать код на любом языке и парадигмы, которые вам нравятся.

Ваш ответ

Отображаемое имя (по желанию):
Конфиденциальность: Ваш электронный адрес будет использоваться только для отправки уведомлений.
Анти-спам проверка:
Чтобы избежать проверки в будущем, пожалуйста войдите или зарегистрируйтесь.

9 Ответы

0 голосов
от
У вас есть список возрастающих чисел, что является наиболее эффективным алгоритмом, вы можете думать, чтобы получить список возрастающих суммы каждых двух чисел в этом списке. Дубликатов в результирующем списке не имеют значения, вы можете удалить их или избежать их, если вам нравится. Чтобы было понятно, меня интересует алгоритм. Не стесняйтесь размещать код на любом языке и парадигмы, которые вам нравятся.
0 голосов
от
Редактировать в 2018 году: вы, вероятно, следует прекратить чтение этого. (Но я не могу удалить его, как это принято.) Если вы пишете из сумм такой:
1 4  5  6  8  9


Вы заметите, что с М[Я,J]
0 голосов
от
А не кодирование это, я думаю, я буду псевдо-код, это в шагах и объяснить мою логику, так что лучше программисты могут найти дыры в моей логике, если это необходимо. На первом шаге мы начнем со списка длины n чисел. Для каждого номера нужно создать список длины n-1, потому что мы не добавляем число к себе. В итоге мы имеем список о n отсортированных списков, который был создан за o(п^2) времени.
step 1 (startinglist) 
for each number num1 in startinglist
   for each number num2 in startinglist
      add num1 plus num2 into templist
   add templist to sumlist
return sumlist 
В шаге 2, потому что списки были отсортированы по дизайну (добавить код для каждого элемента в отсортированный список и список будет отсортирован) мы можем просто сделать сортировка слиянием слиянием каждого списка вместе, а не mergesorting всю партию. В конце концов это должно занять o(п^2) времени.
step 2 (sumlist) 
create an empty list mergedlist
for each list templist in sumlist
   set mergelist equal to: merge(mergedlist,templist)
return mergedlist
Метод слияния будет тогда нормальное слияние шаг с проверкой, чтобы убедиться, что нет повторяющихся сумм. Я не буду писать это, потому что любой может посмотреть сортировка слиянием. Так вот мое решение. Весь алгоритм является o(п^2) времени. Не стесняйтесь указывать на какие-либо ошибки или улучшения.
0 голосов
от
Вы можете сделать это в две строки в Python с
allSums = set(a b for a in X for b in X)
allSums = sorted(allSums)
Стоимость это N^2 (может быть дополнительным фактором журнала для комплекта?) для итерации и S * журнал(ы) для сортировки, где S-размер набора. Размер комплекта может быть как большой, как Н*(Н-1)/2 например, если x = [1,2,4,...,2^п]. Так что если вы хотите создать этот список, то это займет не менее N^2/2, в худшем случае, так это размер выходного. Однако если вы хотите выбрать первые k элементов в результате вы можете сделать это в o(КН), используя алгоритм отбора отсортированный х у матриц Фредериксон и Джонсона (см. здесь для деталей). Хотя это, вероятно, может быть изменен, чтобы генерировать их в интернете за счет использования вычислений и получить эффективный генератор для этого набора. @deuseldorf, Питер Существует некоторая путаница о (n!) Я серьезно сомневаюсь, что deuseldorf означало "Н факториал", а просто "н, (очень рад)!"
0 голосов
от
Лучшее, что я мог придумать, чтобы произвести матрицу сумм каждой пары, а затем объединить эти строки, а-ля сортировка слиянием. Я чувствую, что я упускаю какую-то простую мысль, которая раскроет гораздо более эффективное решение. Мой алгоритм, в Haskell:
matrixOfSums list = [[a b | b
0 голосов
от
В SQL:
create table numbers(n int not null)
insert into numbers(n) values(1),(1), (2), (2), (3), (4)


select distinct num1.n num2.n sum2n
from numbers num1
inner join numbers num2 
    on num1.n
0 голосов
от
Неважно, что вы делаете, без дополнительных ограничений на вводимые значения, вы не можете сделать лучше, чем o(н^2), просто потому, что у вас есть, чтобы перебрать все пары чисел. Итерация будет доминировать сортировки (который можно сделать за o(n журнал N) или быстрее).
0 голосов
от
Этот вопрос напрягал мозг в течение дня сейчас. Круто. В любом случае, вы не можете уйти от Н^2 природа это легко, но вы можете сделать немного лучше с слиянием, так как вы можете с привязкой диапазон для вставки каждого элемента. Если вы посмотрите на все списки можно создавать, они имеют следующий вид:
(a[i], a[j]) | j
0 голосов
от
Если вы ищете по-настоящему решение агностик язык, то вы будете сильно разочарованы, на мой взгляд, потому что вы будете застрял в цикле for и некоторые условные. Однако, если вы открыли его для функциональных языков и возможности функционального языка (я смотрю на вас, как LINQ), то мои коллеги здесь можете заполнить эту страницу элегантный примеры в Руби, Лисп, Эрланг и другие.
...