Я работаю, пытаясь написать сценарий для синтаксического анализа слабо преобразованных таблиц в текстовой форме, которая исходит из разбора pdf: s в csv: s. По существу заголовки - это длины досок, данные - количество досок, и, наконец, дается общая длина всех досок в ряду.Алгоритм для поиска целевой суммы суммы произведений двух списков упорядоченных целых чисел
Упрощенный пример
1,0 2,0 3,0 4,0 5,0 total M
1 3 2 1 17,0
Поскольку расположение меняется дико и мне не нужно, чтобы гарантировать правильность Я думаю, что есть приличный шанс, что просто пытается все допустимые комбинации количества досок раз длин складываются вместе и посмотреть, правильная сумма должна работать достаточно хорошо.
В качестве доказательства концепции я хочу написать простую программу, которая берет два списка целых чисел и ищет все действительные суммы продуктов, чтобы увидеть, что я не получаю комбинаторный кошмар.
Правила этой проблемы с игрушкой тогда.
Два списка целых чисел, первые [1..14], второстепенные мелкие целые числа (< 1000) и от 1 до 14 членов. называть их длины и numPlanks
Целевая сумма, которая определяется суммированием продуктов всех членов numPlanks с ровно одним членом длин и без двух членов numPlanks, может делиться длиной. Поиск по всем таким комбинациям и печать комбинаций, соответствующих цели.
Далее, члены обоих списков упорядочены. Если первый элемент numPlanks умножается на второй элемент длин, ни один другой член numPlanks не может быть умножен на первый элемент длин.
Пример, в псевдокоде
lengths = [1, 2, 3, 4]
numPlanks = [10, 20]
target = 110
программа будет затем проверить 10 + 40, 10 + 60, 10 + 80, 20 + 60, 20 + 80, 30 + 80, чтобы увидеть, которые складываются к цели и, наконец, распечатать что-то вроде «10 * 30 + 20 * 40 = 110».
Я пытался создать решения, но я был в тупике, только имея возможность думать о вложении столько циклов, сколько есть членов в numPlanks. Что кажется ужасным.
Программа написана на java, поэтому, если кто-то хочет указать на какой-либо язык, я был бы очень благодарен, и все остальное, конечно, тоже фантастическое.
Редактировать: эскиз с ручкой и бумагой кажется, что количество сравнений связано с треугольником Паскаля. Например, для длин с двумя членами и numPlacks с 0 до 2 членами число сравнений равно 1,2,1 для 0, 1 и 2 членов в numPlanks соответственно.
Учитывая, что я знаю, что у меня ровно 14 членов в моей реальной проблеме и от 1 до 14 членов в numPlanks, это будет соответствовать худшему случаю 1716 сравнений. Кажется, все в порядке.
Это похоже на экземпляр суммы подмножества. Эта проблема (слабо) NP-полная. – collapsar
Из некоторого дальнейшего эскиза он также представляется изоморфным генерированию всех восходящих комбинаций (0,1, 2, 3, ..., n) выбирает k элементов. Если результирующий список будет соответствовать тому, какой индекс по длине будет соответствовать каждому элементу в досках. Т.е., если длины [2, 5, 10] и numPlanks [7, 19], то (0, 1), (0,2) и (1,2) соответствуют потенциальным решениям, тогда как (1, 0), (2, 0) и (2,1) будут запрещены. – FasmusR
Для проблемы реального мира ваши шансы лучше искать в другом месте: данные (исходники/базы данных), неконтекстная часть файлов в формате Portable Document Format (? PDF может содержать потоки метаданных), извлечение (горизонтальное) положение вместе с текстовыми фрагментами/символами. – greybeard