Рейтинг:2

Временная сложность алгоритма исчерпывающего поиска

флаг in

у меня есть наборы $S_1=\{2,10,20,6\}$ и $S_2=\{25,26,20\}$ и я хочу найти, сумма каких чисел дает 32. Это очень легко проверить; 6 и 26. Похоже на задачу о рюкзаке, но я не специалист.

Однако, скажем, у меня есть 1000 наборов, каждый из которых содержит 500 элементов, так что суммирование одного термина из каждого набора всегда дает вам уникальное значение. Это гораздо сложнее проверить и решить, особенно если наборы следуют структуре, которая будет казаться случайной (они будут построены из структурированных наборов, с которыми перепутались, и будет почти невозможно угадать смешивание и поменять местами наборы).

Таким образом, единственным способом должен быть алгоритм исчерпывающего поиска. Учитывая, что мой номер 52 485 332, есть $1000^{500}$ возможные варианты для просмотра. Действительно, будут способы сократить этот поиск (например, когда в наборе есть числа, превышающие ваше целевое значение, вы можете игнорировать эти числа). Но в противном случае вы могли бы все еще смотреть на $750^{500}$ возможные варианты.

Итак, какова временная сложность такого алгоритма поиска? $ О (п ^ {к}) $, с $n$ количество комплектов и $к$ количество элементов в этих множествах? Они должны проверить «все» возможные комбинации терминов, пока одна из них не совпадет с заданным значением.

Основные вопросы, кажется, "сколько есть наборов?" и «насколько велики наборы?». Ведь множества тоже могут быть разного размера, а не только одинаковые.

Я не криптограф; мое исследование просто заигрывает с идеей под рукой. Любая помощь будет оценена по достоинству.

poncho avatar
флаг my
«Итак, единственным способом должен быть алгоритм исчерпывающего поиска» - ммм, нет, даже без какой-либо структуры в значениях есть значительно более эффективные методы поиска; тот, который сразу приходит на ум, требует $O(nm)$ времени (где $m$ — целевая сумма; при $m=52485332$ это выглядит практически решаемым). Заинтересованы ли вы, или ваш вопрос касается именно времени, затрачиваемого наивным алгоритмом поиска?
MeBadMaths avatar
флаг in
@poncho спасибо за комментарий. Я не знал, что есть лучшие методы, чем «наивный» метод поиска. Я был бы заинтересован в том, что вы предложили - все, что вы можете предложить, было бы здорово.
jjj avatar
флаг cn
jjj
Вариантов 500^1000, а не 1000^500
Рейтинг:2
флаг my

Таким образом, единственным способом должен быть алгоритм исчерпывающего поиска.

Как я уже упоминал в своем комментарии, существуют практические методы для не очень больших значений $м$$м=52485332$ не велик). Вот схема одного из таких методов (который предполагает, что все наборы состоят из неотрицательных целых чисел):

  • У нас есть массив $A_{n, m+1}$; каждый элемент массива $А_{а, б}$ отметим, как мы можем сгенерировать сумму $b$ с самого начала $а$ наборы (или $\перп$ если такой способ еще не найден).

  • Инициализировать все элементы $А$ к $\перп$

  • За $я := 1$ к $n$ искать элементы $А_{я-1}$ для не-$\перп$ элемент (и для $я=1$, 0-й элемент рассматривается как единственный не-$\перп$ элемент. Для каждого такого элемента $A_{i-1, x}$, установлен $A_{i, x + S_{i,j}}$ к $j$ (для каждого элемента $S_{i,j}$ набора $S_i$) Если $x + S_{i,j} > m$, игнорируй это.

  • Наконец, если $A_{n,m} = \perp$, нет подмножества, приводящего к сумме $м$. Если это что-то другое, мы можем восстановить термины, просматривая массив с возвратом. $А$.

Это должен быть практичный алгоритм восстановления терминов с заданными вами параметрами.

jjj avatar
флаг cn
jjj
В вопросе было указано, что суммирование всегда дает уникальное значение. Это означает, что существует 1000 ^ 500 различных результатов, поэтому мы должны предположить, что мы говорим о m и в этой величине. Тогда этот алгоритм «никогда» не завершится
poncho avatar
флаг my
@jjj: в вопросе также говорится: «Учитывая, что мой номер 52 485 332»; Я предполагал, что они перечисляют свою стоимость в $m$; если нет, то что такое "мой номер"?
jjj avatar
флаг cn
jjj
Я предполагаю, что автор вопроса не знает о том факте, что уникальность приведет к тому, что большинство чисел одного только набора будет намного больше, чем эта сумма. А если их удалить, то проблема резко уменьшится.
MeBadMaths avatar
флаг in
Спасибо вам обоим за ваши ответы и комментарии. Я не разбираюсь в деталях криптографии, поэтому извините за путаницу, которую вызвал мой пост. Тот факт, что я считал 52 485 332 «огромными», показывает мое невежество, ха-ха. уточнить; все множества являются неотрицательными целыми числами. Взятие значения из каждого набора и их суммирование всегда гарантируют уникальный элемент.
MeBadMaths avatar
флаг in
Под "моим номером" я имел в виду термин, который я закодировал (что-то я не указал - извините!). Скажем, я получил сообщение и закодировал его с помощью этих наборов. В результате получается 52 485 332 (а может быть, и больше!). Задача алгоритма поиска состоит в том, чтобы найти, какие уникальные значения из 1000 наборов в сумме составляют это число. Оттуда вы можете расшифровать сообщение. 1000 наборов действуют как открытый ключ. Итак, если это легко взломать, это проблема. Надеюсь, это поможет. @jjj, не могли бы вы подробнее объяснить свой последний комментарий? Я не думаю, что понимаю, извините
MeBadMaths avatar
флаг in
@poncho Спасибо за алгоритм. Я не думаю, что понимаю, что означает перевернутая буква T - мои познания в криптографии в лучшем случае базовые. Я посмотрю повнимательнее и посмотрю, смогу ли я понять остальное.
poncho avatar
флаг my
@MeBadMaths: $\perp$ означает «пустой», то есть символ, который можно отличить от любого допустимого значения. В терминах C думайте об этом как о НУЛЕВОМ указателе...
MeBadMaths avatar
флаг in
@poncho: спасибо за разъяснение. Я чувствую, что этот алгоритм похож на наивный алгоритм поиска в том смысле, что вы перебираете все наборы и составляете список возможных значений, которые можно суммировать. Если какая-то сумма становится слишком большой, вы перестаете на нее смотреть. В конце концов вы перестанете фокусироваться на всех значениях, кроме тех, которые будут равны или меньше назначенного. Я полагаю, что одним из преимуществ вашего алгоритма является то, что вы не проверяете значения до самого конца, кроме как для сравнения, если они слишком велики?
MeBadMaths avatar
флаг in
У меня есть вопрос; сколько наборов (разных размеров) вам понадобится, чтобы этот алгоритм работал слишком долго? Как предложил @jjj, хотя вы можете перестать смотреть на значительную часть наборов, поскольку в конечном итоге многие значения чисел будут слишком большими. Если, например, ваши закодированные числа находятся в самой середине всех возможных суммируемых чисел, на первом шаге можно просмотреть только 250 чисел, но затем к каждому из них добавить 250 из второго набора, а затем по 250 к каждому из них для второго набора. третий набор. Кажется, скоро это станет ОГРОМНЫМ? Хотя, опять же, возможно, я недооцениваю «огромный», ха-ха.
poncho avatar
флаг my
@MeBadMaths: на самом деле, реальное преимущество моего алгоритма (по сравнению с поиском методом грубой силы) заключается в том, что есть несколько способов получить промежуточную сумму. Предположим, что существует 1000 различных способов получить значение 314159 за 42 шага; грубая сила повторит вычисление, начиная с (314159,42) 1000 раз; мой алгоритм сделает это только один раз.
poncho avatar
флаг my
@MeBadMaths: что касается способов сделать проблему невыполнимой для моего алгоритма, то самый очевидный из них - сделать m огромным.Для неограниченного m эта задача на самом деле является NP-трудной, однако, чтобы попасть в действительно сложный диапазон, m должно быть огромным...
MeBadMaths avatar
флаг in
@poncho Я считаю, что после первых 42 шагов был бы только 1 способ достичь 314159. Если бы было больше способов, то не было бы уникальной комбинации для каждой суммы. Но я вижу, как ваш алгоритм делает то, о чем вы говорите — это действительно отличный и хорошо продуманный алгоритм! Гораздо лучше, чем все, что я мог бы сделать, ха-ха. Спасибо за разъяснения по поводу $m$. Я действительно недооценил значение слова «огромный».
Рейтинг:1
флаг cn
jjj

Это скорее ответ на вопрос, почему уникальность сумм так сильно влияет на размер, что случай для $52485332$ становится тривиальным (это слишком долго для комментария).

Когда все суммы должны быть уникальными, они должны давать разные целые числа. Потому что есть $500^{1000}$ возможные суммы, есть также $500^{1000}$ различные целые результаты для этого. в самом нижнем случае будут все целые числа из $0$ к $500^{1000}-1$.

Например,

$S_1 = \{0, 1, 2,..., 499\}$

$S_2 = \{0, 500, 1000,..., 249500\}$

$S_3 = \{0, 250000, 500000, ..., 124750000\}$

...

$S_{1000} = \{0, 500^{999}, 2*500^{999}, ..., 499*500^{999}\}$

способ гарантировать уникальность результата. Как видите, Числа становятся действительно большими очень быстро.

В этом конкретном примере легко найти результат (просто всегда выбирайте наибольшее число, которое подходит от последнего к первому набору). Даже большинство чисел $S_3$ больше, чем $52485332$ и поэтому может быть проигнорировано.

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

Однако крайне маловероятно, что какое-либо значение ниже или равно $52485332$ (когда вы равномерно выбираете $500000$ значения из $500^{1000}$)

Динамическое программирование, как предложил @poncho, действительно работает только для небольших чисел, и его производительность не намного лучше, чем полный поиск (линейная разница в количестве наборов), потому что подсуммы, которые можно повторно использовать, уникальны, преимущество не смотреть на другие возможности не существует. Время выполнения должно быть в том же порядке, что и полный поиск. Единственное улучшение заключается в том, чтобы принять решение, когда значения слишком велики или малы для достижения цели, но для разумных целей это не является большим преимуществом.

Он может легко свести задачу о сумме подмножеств или задачу о рюкзаке к этой, просто используя один и тот же набор столько раз, сколько нужно суммировать.Проблема в том, что это не полиномиальное сокращение времени, поэтому его недостаточно для доказательства, если проблема NP-сложная.

MeBadMaths avatar
флаг in
Спасибо за ответ. Пример набора, который вы привели, я хорошо знаю, и он является самым основным из этих наборов. Но оттуда вы можете «испортить» эту настройку таким образом, что ее будет невозможно восстановить без дополнительной информации (закрытый ключ). Получающиеся в результате «перепутанные» наборы будут казаться случайными и будут генерировать очень большой диапазон наборов. Я согласен с тем, что данное 52485332 слишком мало - я действительно не думал об этом, ха-ха. Но, скажем, мое значение имело достаточный размер, который правильно отслеживался со «случайными» наборами - я полагаю, что это усложняет решение этой проблемы?
jjj avatar
флаг cn
jjj
@MeBadMaths Количество способов испортить это относительно ограничено (если вообще возможно). Например, когда вы разделяете {0, 1, 2, 3, 0, 4, 8, 12} (меньший пример той же структуры) на два набора размера 4, то есть только один способ сделать это (игнорируя порядок наборов и заказ внутри наборов)
MeBadMaths avatar
флаг in
Можно «запутаться» в этих наборах, но они становятся все более и более огромными по мере того, как вы получаете все большие и большие значения. Пусть $N=\prod_{j=1}^n |S_{j}|$, тогда $d>N$. Возьмем $r$ так, что $r$ и $d$ взаимно просты, и возьмем $0\leq t_1,t_2,\dots,t_n
jjj avatar
флаг cn
jjj
@MeBadMaths Хорошо, да, ты прав. Я думал, вы просто хотите поменять местами элементы, а не изменить их. Я проверил, что ваша формула верна и действительно неотличима от случайных значений. Я исправлю последнюю часть своего ответа
MeBadMaths avatar
флаг in
спасибо за все ваши комментарии и ответы - и извините за мое плохое объяснение. Раньше я не использовал эти форумы в такой степени, поэтому я все еще новичок в том, как форматировать вопросы и т. Д. Я очень ценю вашу поддержку. Определенно не собираюсь доказывать NP, ха-ха. Тем не менее ваш вклад помог. Последний вопрос будет; порядок расширенного поиска $O(n^k)$, как я предположил в своем посте, или $O(k^n)$? Или что-то еще? Еще раз спасибо
jjj avatar
флаг cn
jjj
Я хотел сказать, что этого недостаточно, чтобы доказать, что эта проблема является NP-сложной^^. Исчерпывающий поиск будет O (k ^ n) (каждый из k элементов в наборе один может быть объединен с каждым из k элементов в наборе 2...)
MeBadMaths avatar
флаг in
Да, это имеет больше смысла, чем $n^k$. Я читал вики-страницу о сложности времени и не могу сказать, является ли $ O (k ^ n) $ полиномиальным или экспоненциальным временем? (или ни то, ни другое!) Клянусь, это последний вопрос, ахаха, спасибо за всю вашу помощь @jjj

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.