Нахождение четных чисел в массиве без использования обратной связи
Я видел этот пост: нахождение четных чисел в массиве и я думал о том, как вы могли бы сделать это без обратной связи. Вот что я имею в виду.
дан массив длины n, содержащий не более
e
четные числа и a функцияisEven
Это возвращает true, если вход четный и false в противном случае напишите функцию, которая печатает все четные числа в массив, использующий наименьшее количество вызововisEven
.
в ответ на сообщение должен был использовать двоичный поиск, который аккуратен, так как это не означает, что массив должен быть в порядке. Количество раз, когда вы должны проверить, является ли число четным, равно e log n
вместо if n
потому что вы делаете двоичный поиск (log n
), чтобы найти одно четное число каждый раз (e
раза).
но эта идея означает, что вы делите массив пополам, проверяете ровность, а затем решаете, какую половину сохранить на основе результата.
мой вопрос в том, являетесь ли вы или нет может бить n
вызовы по фиксированной схеме тестирования, где вы проверяете все номера, которые вы хотите для ровности, не зная результата, а затем выяснить, где четные номера после того, как вы сделали все тесты на основе результатов. Поэтому я думаю, что это не обратная связь или слепой или какой-то термин.
Я думал об этом некоторое время и ничего не мог придумать. Идея бинарного поиска вообще не работает с этим ограничением, но, может быть, что-то еще делает? Даже до n/2
вызовов вместо n
(да, я знаю, что они такие же большие-O) было бы хорошо.
6 ответов
вы можете использовать Китайская Теорема Остатка для этого. Я собираюсь немного изменить вашу нотацию.
Предположим, у вас есть N
номера которых самое большее E
даже. Выберите последовательность различных простых степеней q1,q2,...,qk
такие, что их продукт является не менее N^E
, то есть
qi = pi^ei
здесь pi
- главная и ei > 0
является целым числом и
q1 * q2 * ... * qk >= N^E
теперь сделайте кучу 0-1
матриц. Пусть Mi
будет qi x N
Матрица, где запись в строке r
и колонки c
есть 1
если c = r mod qi
и 0
иначе. Например, если qi = 3^2
, после строки 2
имеет в Столбцах 2, 11, 20, ... 2 + 9j
и 0
в другом месте.
теперь сложите эти матрицы вертикально, чтобы получить Q x N
матрица M
, где Q = q1 + q2 + ... + qk
. Ряды M
скажите вам, какие числа умножить вместе (ненулевые позиции). Это дает в общей сложности Q
продукты которые вам нужно испытать для равномерность. Назовите каждую строку " испытанием "и скажите, что" испытание включает j
" если j
столбец этой строки непустой. Теорема вам нужно следующее:
теорема: число в позиции j
даже если и только если все испытания с участием j
даже.
таким образом, Вы делаете в общей сложности Q
испытания, а затем посмотрите на результаты. Если вы разумно выбираете первичные силы, то Q
должна быть значительно меньше, чем N
. Есть асимптотические результаты, которые показывают, что вы всегда можете сделать Q
по приказу
(2E log N)^2 / 2log(2E log N)
эта теорема на самом деле является следствием китайской теоремы остатка. Единственное место, которое я видел, это используется в Комбинаторное Групповое Тестирование. По-видимому, проблема первоначально возникла при тестировании солдат, возвращающихся из Второй мировой войны на сифилис.
технический термин для "без обратной связи или слепой" - "неадаптивный". O (e log n) вызовов по-прежнему достаточно, но алгоритм гораздо более вовлечен.
вместо того, чтобы проверять равномерность продуктов, мы собираемся проверить равномерность сумм. Пусть E ≠ F-различные подмножества {1,..., n}. Если у нас есть один массив x1,..., xn с четными числами в позициях E и другим массивом y1,..., yn с четными числами в позициях F, сколько подмножества J {1,..., n} удовлетворяют
(∑Я в J xЯ) mod 2 ≠ (∑Я в J yЯ) mod 2?
ответ 2n-1. Пусть я индекс такой, что xЯ mod 2 ≠ yЯ mod 2. Пусть s-подмножество {1,..., i - 1, i + 1, ... n}. Либо J = S является решением, либо J = S union {i} является решением, но не обоими.
для каждого возможного результата E нам нужно сделать звонки, которые устраняют любой другой возможный результат F. предположим, что мы делаем 2E log n вызовов случайным образом. Для каждой пары E ≠ F вероятность того, что мы все еще не можем отличить E от F, равна (2n-1/2n)2E log n = n - 2e, потому что есть 2n возможные вызовы и только 2n-1 не отличить. Есть самое большее ne + 1 Выбор E и, таким образом, не более (ne + 1) neпар/2. По союз связан, вероятность того, что существует какая-то неразличимая пара, не более n - 2e(ne + 1) ne/2
обратите внимание, что, хотя я использовал случайность, чтобы показать, что существует хорошая последовательность вызовов, результирующий алгоритм детерминированные (и, конечно же, не адаптивный, потому что мы выбрал эту последовательность, не зная результатов).
проблема с которой вы столкнулись-это форма группа тестирования, тип задачи с целью снижения стоимости идентификации определенных элементов набора (до d
элементы набора N
элементов).
как вы уже заявили, существует два основных принципа, с помощью которых может проводиться тестирование:
неадаптивное групповое тестирование, где все тесты исполняться решаются априори.
Адаптивное Групповое Тестирование, где мы выполняем несколько тестов, основывая каждый тест на результатах предыдущих тестов. Очевидно, что адаптивное тестирование имеет потенциал для снижения затрат по сравнению с неадаптивным тестированием.
теоретические оценки для обоих принципов были изучены и доступны в этой статье или этот бумага!--13-->.
на адаптивное тестирование верхняя граница
O(d*log(N))
(как уже описано в ответ).на неадаптивное тестирование, можно показать, что верхняя граница
O(d*d/log(d)*log(N))
, который, очевидно, больше верхней границы для адаптивного тестирования в коэффициентd/log(d)
.
эта верхняя граница для неадаптивное тестирование исходит из алгоритма, который использует матрицы разобщенный: матрицы размерности T x N
("количество тестов" x "количество элементов"), где каждый элемент может быть либо true (если элемент был включен в тест), либо false (если он не был), со свойством, которое любое подмножество d
столбцы должны отличаться от всех остальных столбцов, по меньшей мере, один ряд (включение теста). Это позволяет линейное время декодирования (есть также" D-разделяемые " матрицы, где меньше тестов нужен, но сложность их декодирования является экспоненциальной и не computationaly осуществимо).
вывод:
мой вопрос в том, Можете ли вы победить
n
вызовы по фиксированной схеме тестирования [...]
для такой схемы и достаточно большого значения N
, может быть построена дизъюнктная матрица, которая будет иметь меньше K * [d*d/log(d)*log(N)]
строк. Итак, для больших значений N
, да, вы можете бить он.
основной вопрос (вызов) является своего рода глупым. Если двоичный поисковый ответ приемлем (где он суммирует суб-массивы и отправляет их в IsEven), то я могу придумать способ сделать это с помощью E или менее вызовов IsEven (предполагая, что числа являются целыми числами, конечно).
JavaScript для демонстрации
// sort the array by only the first bit of the number
A.sort(function(x,y) { return (x & 1) - (y & 1); });
// all of the evens will be at the beginning
for(var i=0; i < E && i < A.length; i++) {
if(IsEven(A[i]))
Print(A[i]);
else
break;
}
не совсем решение, но всего несколько мыслей.
легко видеть, что если существует решение для длины массива n, которое занимает меньше n тестов, то для любой длины массива m > n легко видеть, что всегда есть решение с менее чем m тестов. Поэтому, если у вас есть решение для N = 2 или 3 или 4, то проблема решена.
массив можно разбить на пары чисел и для каждой пары: если сумма нечетная, то ровно одна из них четные, иначе, если одно из чисел четное, то оба они четные. Таким образом, для каждой пары требуется один или два теста. В лучшем случае: N / 2 тестов, в худшем случае: N тестов, если четные и нечетные числа выбраны с равной вероятностью, то: 3n / 4 тестов.
мое предчувствие, что нет решения с меньшим, чем N тестов. Не знаю, как это доказать.
UPDATE: второе решение может быть расширено следующим образом.
проверьте, если сумма два числа четные. Если нечетный, то ровно один из них четный. В противном случае обозначьте набор как "однородный набор размера 2". Возьмем два "однородных множества" s одинакового размера n. Выберите одно число из каждого набора и проверьте, Четна ли их сумма. Если он четный, объедините эти два набора в "однородный набор размера 2n". В противном случае это означает, что одно из этих множеств состоит исключительно из четных чисел, а другое-из нечетных чисел.
лучший случай: тесты n / 2. Средний случай: 3*n / 2. В худшем случае все равно n. Худшем случае существует только тогда, когда все числа четные или все нечетные числа.
Если мы можем добавить и умножьте элементы массива, тогда мы можем вычислить каждую Булеву функцию (до дополнения) на битах низкого порядка. Смоделируйте схему, которая кодирует позиции четных чисел как число от 0 до nC0 + nC1 + ... + nCe-1 представлен в двоичном формате и использует вызовы isEven
читать биты.
количество используемых вызовов: в пределах 1 из информация-теоретический оптимум.
см. также полностью гомоморфного шифрование.