Я боролся с этими вопросами в течение некоторого времени. Вопрос звучит так: -

У нас есть n^2 чисел. Нам нужно выяснить, существует ли тройка a,b,c такая, что a+b+c = 0. В более общем случае a+b+c = k. (к дано)

Существует решение со сложностью O(n^2log(n)).

Любая помощь будет принята с благодарностью.

Благодарность

4
Pigol 15 Дек 2009 в 09:01
1
Вы можете прочитать существующую литературу по проблеме суммы подмножеств, которая является более общей версией того, что вы предлагаете. en.wikipedia.org/wiki/Subset_sum_problem
 – 
mqp
15 Дек 2009 в 09:05
Просто из любопытства, это для Project Euler?
 – 
Carl Smotricz
15 Дек 2009 в 09:11
Нет, это не для проекта Эйлера. Эта проблема была задана на одном из моих экзаменов пару лет назад.
 – 
Pigol
15 Дек 2009 в 09:21
N номеров уникальны или есть дубликаты? И: (a != b) && (a != c) ?
 – 
anon
15 Дек 2009 в 10:48
1
Что вы подразумеваете под n ^ 2 числа? Что такое н?
 – 
MAK
15 Дек 2009 в 10:51

2 ответа

Чтобы получить это за O(n²logn), вам нужно отсортировать числа. Найдите все комбинации из 2 чисел и выполните двоичный поиск, чтобы найти третье.

Верхняя граница гораздо выше для общего варианта задачи.

3
Anurag 15 Дек 2009 в 10:38
Количество комбинаций будет O (n ^ 4). мы ищем оптимизированное решение.
 – 
Pigol
15 Дек 2009 в 11:31
Так что в основном, перефразируя, вы говорите, что есть n элементов и есть решение в O (nlog√n)?
 – 
Anurag
15 Дек 2009 в 11:40
@ Анураг, да ладно, log√n равно ½log n
 – 
P Shved
15 Дек 2009 в 13:25
Справедливо Павел, так это в O(nlogn).. и вот я радовался выбору символов юникода :)
 – 
Anurag
15 Дек 2009 в 16:51

Я написал грубое решение.

Это определенно можно сделать за O (n ^ 2). Вам не нужно сортировать это.

Это расширение задачи, которая требует суммирования двух чисел до x, и хитрость заключается в использовании хеш-таблицы.

def triplets(l, total):
    """Sum of 3 numbers to get to total 
    Basically an extension of the 2 table 
    """
    l = set( l)
    d = { }

    for i in l:
        remain = total - i

        inside = {}
        for j in l:
            if i == j:
                continue
            inside[j] = remain -j

        d[i] = inside

    good = set()

    for first, dic in d.iteritems():
        for second, third in dic.iteritems():
            if third in l:
                good.add( tuple(sorted([first, second, third])) )

    for each in good: 
        print each

triplets( [2, 3, 4, 5, 6], 3+4+5)

ПРИМЕЧАНИЕ: мы можем использовать метод быстрой сортировки для троек, который будет равен O(1).

0
disappearedng 25 Мар 2011 в 03:00
Не могли бы вы предоставить C или Java вашего решения?
 – 
Hengameh
6 Июл 2015 в 12:13