Нахождение четных чисел в массиве без использования обратной связи

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

дан массив длины 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;
}

не совсем решение, но всего несколько мыслей.

  1. легко видеть, что если существует решение для длины массива n, которое занимает меньше n тестов, то для любой длины массива m > n легко видеть, что всегда есть решение с менее чем m тестов. Поэтому, если у вас есть решение для N = 2 или 3 или 4, то проблема решена.

  2. массив можно разбить на пары чисел и для каждой пары: если сумма нечетная, то ровно одна из них четные, иначе, если одно из чисел четное, то оба они четные. Таким образом, для каждой пары требуется один или два теста. В лучшем случае: N / 2 тестов, в худшем случае: N тестов, если четные и нечетные числа выбраны с равной вероятностью, то: 3n / 4 тестов.

мое предчувствие, что нет решения с меньшим, чем N тестов. Не знаю, как это доказать.

UPDATE: второе решение может быть расширено следующим образом.

проверьте, если сумма два числа четные. Если нечетный, то ровно один из них четный. В противном случае обозначьте набор как "однородный набор размера 2". Возьмем два "однородных множества" s одинакового размера n. Выберите одно число из каждого набора и проверьте, Четна ли их сумма. Если он четный, объедините эти два набора в "однородный набор размера 2n". В противном случае это означает, что одно из этих множеств состоит исключительно из четных чисел, а другое-из нечетных чисел.

лучший случай: тесты n / 2. Средний случай: 3*n / 2. В худшем случае все равно n. Худшем случае существует только тогда, когда все числа четные или все нечетные числа.


Если мы можем добавить и умножьте элементы массива, тогда мы можем вычислить каждую Булеву функцию (до дополнения) на битах низкого порядка. Смоделируйте схему, которая кодирует позиции четных чисел как число от 0 до nC0 + nC1 + ... + nCe-1 представлен в двоичном формате и использует вызовы isEven читать биты.

количество используемых вызовов: в пределах 1 из информация-теоретический оптимум.

см. также полностью гомоморфного шифрование.