Вот другой подход, основанный на итеративном поиске чисел, которые не могут появляться среди . Назовем множество Чрезмерно аппроксимацию «S , если мы знаем , что . Точно так же, является overapproximation из «ы , если мы знаем , что . Очевидно, что чем меньше , тем более полезно это по-приближение, и то же самое относится и к . Мой подход основан на итеративном уточнении этих чрезмерных аппроксимаций, т.е. итеративном уменьшении размера этих множеств (поскольку мы исключаем все больше и больше значений как невозможных).{ a 1 , … , a 6 } A a { a 1 , … , a 6 } ⊆ A B b { b 1 , … , b 6 } ⊆ B A B{a1,…,a6}Aa{a1,…,a6}⊆ABb{b1,…,b6}⊆BAB
Ядром этого подхода является метод уточнения : с учетом чрезмерного приближения для 's и чрезмерного приближения для ' s найти новое избыточное приближение для ', такое, что . В частности, обычно будет меньше, чем , так что это позволяет уточнить чрезмерное приближение для .A a B b A ∗ a A ∗ ⊊ A A ∗ A aAaBbA∗aA∗⊊AA∗Aa
С помощью симметрии, по существу, тот же трюк позволит нам уточнить наше чрезмерное приближение для : s: с учетом избыточного приближения для и s и чрезмерного приближения для , это создаст новое -приближение для .b A a B b B ∗ bbAaBbB∗b
Итак, позвольте мне рассказать вам, как сделать уточнение, тогда я соберу все вместе, чтобы получить полный алгоритм для этой проблемы. В дальнейшем пусть обозначает множество множеств разностей, т. ; мы сосредоточимся на поиске дорабатываться приближения , учитывая .D D = { a i - b j : 1 ≤ i , j ≤ 6 } A ∗ A , BDD={ai−bj:1≤i,j≤6}A∗A,B
Как рассчитать уточнение. Рассмотрим одну разность . Рассмотрим множество . Основываясь на наших знаниях о том, что является чрезмерным приближением , мы знаем, что хотя бы один элемент из должен быть элементом . Таким образом, мы можем рассматривать каждый из элементов в , как «предложение» для ряда , чтобы возможно включить в . Итак, давайте рассмотрим все различия и, для каждого, определим, какие числа «предложены» .d ∈ D d + B = { d + y : y ∈ B } B b d + B { a 1 , … , a 6 } d + B A d ∈ D dd∈Dd+B={d+y:y∈B}Bbd+B{a1,…,a6}d+BAd∈Dd
Теперь я собираюсь заметить, что число обязательно будет предложено как минимум 6 раз во время этого процесса. Почему? Поскольку различие в , и когда мы его обработаем, будет одним из предложенных чисел (поскольку мы гарантируем, что , обязательно включает ). Точно так же разница появляется где-то в , и это заставит быть предложенным снова. Таким образом, мы видим, что правильное значение будет предложено как минимум 6 раз. То же самое верно для иa 1 a 1 - b 1 D a 1 b 1 ∈ B ( a 1 - b 1 ) + B a 1 a 1 - b 2 D a 1 a 1 a 2 a 3a1a1−b1Da1b1∈B(a1−b1)+Ba1a1−b2Da1a1a2a3, и так далее.
Итак, пусть будет набором чисел , которые были предложены как минимум 6 раз. Это, безусловно, является чрезмерным приближением , согласно приведенным выше комментариям.A ∗ a ∗ aA∗a∗a
В качестве оптимизации, мы можем отфильтровать все предложения, которые не присутствуют в сразу: другими словами, мы можем рассматривать разность как предполагающее все значения . Это гарантирует , что мы будем иметь . Мы надеемся, что строго меньше, чем ; никаких гарантий, но если все пойдет хорошо, возможно, так и будет.A d ( d + B ) ∩ A A ∗ ⊆ A A ∗ AAd(d+B)∩AA∗⊆AA∗A
Собирая это вместе, алгоритм для уточнения для получения выглядит следующим образом:A , B A ∗A,BA∗
Пусть . Это множество предложений.S = ∪ d ∈ D ( d + B ) ∩ AS=∪d∈D(d+B)∩A
Подсчитайте , сколько раз появляется каждое значение . Пусть множество значений , которые появляются по крайней мере 6 раз в . (Это может быть осуществлено эффективно путем создания массива из 251 первоначально, первоначально все равен нуля, и каждый раз , когда число предполагается, вы увеличиваете , в конце концов вы несетесь через ищем элементы , которые имеют значение 6 или больше)S A ∗ S a s a [ s ] aSA∗Sasa[s]a
Подобный метод может быть построен, чтобы уточнить A , B, чтобы получить B ∗ . Вы в основном обратные вещи выше и флип некоторые признаки: например, вместо D + B , вы смотрите на - г + A .A,BB∗d+B−d+A
Как вычислить начальное чрезмерное приближение. Чтобы получить наше начальное чрезмерное приближение, одна идея состоит в том, чтобы предположить (wlog), что b 1 = 0 . Отсюда следует, что каждое значение a i должно появляться где-то среди D , поэтому список различий D можно использовать в качестве нашего начального чрезмерного приближения для a 's. К сожалению, это не дает нам очень полезного чрезмерного приближения для b .b1=0aiDDab
Лучший подход состоит в том, чтобы дополнительно угадать значение одного из а . Другими словами, мы предполагаем (wlog), что b 1 = 0 , и используем A = D в качестве нашего начального чрезмерного приближения a 's. Тогда мы угадать, один из этих 36 значений действительно один из через -х, скажем , на 1 . Это дает нам чрезмерное приближение B = a 1 - D для b . Мы используем это начальное чрезмерное приближение A , Bab1=0A=Daaa1B=a1−DbA,Bзатем итеративно уточняйте его до сходимости и проверяйте, верен ли результат. Повторим до 36 раз, с 36 различных догадок в 1 (в среднем 6 догадок должно быть достаточно) , пока мы не находим тот , который работает.a1
Полный алгоритм. Теперь у нас может быть полный алгоритм для вычисления a 1 , … , a 6 , b 1 , … , b 6 . По сути, мы выводим начальное избыточное приближение для A и B , а затем итеративно уточняем.a1,…,a6,b1,…,b6AB
Сделайте предположение: для каждого z ∈ D предположим, что a 1 = z . Сделайте следующее:z∈Da1=z
Начальное течение приближения: Определить A = D и B = г - D .A=DB=z−D
Итеративное уточнение: неоднократно применять следующее до сходимости:
- Уточните A , B, чтобы получить новое избыточное приближение B ∗ из b .A,BB∗b
- Уточните A , B ∗, чтобы получить новое избыточное приближение A ∗ из a .A,B∗A∗a
- Пусть A : = A ∗ и B : = B ∗ .A:=A∗B:=B∗
Проверьте успешность: если каждый из наборов A , B имеет размер 6, проверьте, являются ли они допустимым решением проблемы. Если они есть, остановись. Если нет, продолжайте цикл по значениям-кандидатам z .A,Bz
Анализ.
Будет ли это работать? Сойдет ли он в конечном итоге на A = { a 1 , … , a 6 } и B = { b 1 , … , b 6 } , или застрянет, не решив полностью проблему? Лучший способ выяснить это, вероятно, проверить это. Однако, по вашим параметрам, да, я ожидаю, что это будет эффективно.A={a1,…,a6}B={b1,…,b6}
Если мы используем метод # 1, пока | A | , | Б | не слишком велики, эвристически я ожидаю, что размеры наборов будут монотонно уменьшаться. Рассмотрим выводе A * из A , B . Каждое различие d предполагает | Б | ценности; один из них правильный, а другой | Б | - 1 можно рассматривать (эвристически) как случайные числа. Если x - это число, которое не появляется среди a , то какова вероятность того, что оно выдержит фильтрацию и будет добавлено к A|A|,|B|A∗∗ ? Ну, мы ожидаембудет предложено о ( | B | - 1 ) × 36 / 251 раз в общей сложности (в среднем, со стандартным отклонением около квадратного корня из этого). Если | Б | ≤ 36 , вероятность того, что неправильный x переживет фильтрацию, должна составлять примерно p = 0,4 или около того (используя нормальное приближение для бинома с коррекцией непрерывности). (Вероятность меньше, если | B | меньше; например, для | B | =30 , я ожидаю, что p ≈ 0,25 .) Я ожидаю, что размер A ∗ будет примерно равен p ( | A | - 6 ) + 6 , что строго улучшит чрезмерное приближение, поскольку оно строго меньше | A | , Например, если | A | = | Б | = 36 , то исходя из этой эвристики я ожидаю | A ∗ | ≈ 18 , что является большим улучшением по сравнению с | A |,
Поэтому я прогнозирую, что время бега будет очень быстрым. Я ожидаю, что для сходимости будет достаточно 3-5 итераций уточнения, и, вероятно, достаточно около 6 предположений при z . Каждая операция уточнения включает, возможно, несколько тысяч операций чтения / записи в память, и мы делаем это, возможно, 20-30 раз. Итак, я ожидаю, что это будет очень быстро для указанных вами параметров. Тем не менее, единственный способ узнать наверняка - это попробовать и посмотреть, хорошо это работает или нет.