NP-трудный? Алгоритмическая сложность обнаружения сговора покера онлайн?

Просто исправьте условие if if else следующим образом:

function streamverify(x) {
  if (x == 0) {
    document.getElementById('upstream_tab').style.display = 'block';
    document.getElementById('downstream_tab').style.display = 'none';
  } else {
    document.getElementById('downstream_tab').style.display = 'block';
    document.getElementById('upstream_tab').style.display = 'none';
  }
  return;
}
.tg {
  border-collapse: collapse;
  border-spacing: 0;
}

.tg td {
  font-family: Arial, sans-serif;
  font-size: 14px;
  padding: 10px 5px;
  border-style: solid;
  border-width: 1px;
  overflow: hidden;
  word-break: normal;
  border-color: black;
}

.tg th {
  font-family: Arial, sans-serif;
  font-size: 14px;
  font-weight: normal;
  padding: 10px 5px;
  border-style: solid;
  border-width: 1px;
  overflow: hidden;
  word-break: normal;
  border-color: black;
}

.tg .tg-s268 {
  text-align: left
}
<input type="radio" name="rad1" onclick="streamverify(0)">Cookies
<input type="radio" name="rad1" onclick="streamverify(1)">Candies

<div id="upstream_tab">
  <table class="tg">
    <tr>
      <th class="tg-s268">Cookies</th>
    </tr>
    <tr>
      <td class="tg-s268"></td>
    </tr>
  </table>
</div>



<br>
<div id="downstream_tab">
  <table class="tg">
    <tr>
      <th class="tg-s268">Candies</th>
    </tr>
    <tr>
      <td class="tg-s268"></td>
    </tr>
  </table>
</div>

10
задан Matthew Flaschen 26 April 2009 в 11:49
поделиться

4 ответа

Подход с использованием грубой силы, который я сразу вижу, таков:

Set colluders = new Set();
for(Player p1 : allPlayers)
{
  for(Player p2 : allPlayers)
  {
    if(!p1.equals(p2) && haveColluded(p1, p2))
    {
      colluders.add(p1);
      colluders.add(p2);
    }
  }
}

Я не вижу смысла вызывать haveColluded с большим числом аргументов, чем 2, поскольку это может привести к ложным отрицаниям. Я полагаю, хотя это зависит от того, насколько дорогая функция. Но приведенный выше результат приводит к O (n ^ 2) вызовам функции hasColluded (n - количество игроков). Сама функция, по-видимому, будет O (m), где m - количество игр, в которые они играли вместе. Таким образом, алгоритм выглядит хорошо при O (n ^ 3). Чтобы быть NP-сложным, вы должны доказать, что «проблема H является NP-трудной в том и только в том случае, если существует NP-полная задача L, полиномиальное время Тьюринга сводимо к H [...] Другими словами, L может решаться за полиномиальное время с помощью оракула с оракулом для Х. " ( http://en.wikipedia.org/wiki/NP-hard ). Я изучил NP-полные проблемы (например, 3-SAT, проблема коммивояжера и т. Д.) И не понимаю, как вы это докажете. Но опять же, это кажется подозрительно похожим на проблему клики .

4
ответ дан 4 December 2019 в 01:58
поделиться

Я думаю, что вы ищете, это sed .. Это - s tream ed итор, который позволит вам делать замены построчно.

Как вы объясняете, команда `cat named. местный | grep zone 'дает вам вывод, подобный следующему:

zone "domain1.tld" {
zone "domain2.tld" {
zone "domain3.tld" {
zone "domain4.tld" {

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

"domain1.tld"
"domain2.tld"
"domain3.tld"
"domain4.tld"

Итак, на самом деле, из каждой строки мы просто хотим, чтобы текст между двойными кавычками (включая сами двойные кавычки).

Я не уверен, что вы знакомы с Регулярными выражениями , но они являются бесценным инструментом для любого человека, пишущего сценарии оболочки. Например, регулярное выражение /. Oe / будет соответствовать любой строке, в которой слово со 2-й буквой является строчным o , а 4-е - e . Это будет соответствовать строке, содержащей такие слова, как « zone », « tone » или даже « Ione-deaf. »

Прикол использовать . (точка) символ означает «любая буква». Есть пара других специальных символов, таких как * , что означает " Мы можем сгруппировать его, используя parens: / "(. *)" /

Если мы хотим заменить текст кавычками с подчеркиванием, мы сделаем замену: s / "(. *)" / _ / , и это оставило бы нас с:

Billy _ Smith
Jimmy _ Stuart
Chuck _ Norris

Но у нас есть возвращение! Это позволит нам вспомнить, что было внутри паренов, используя символ \ 1 . Поэтому, если мы сделаем сейчас: s / "(. *)" / \ 1 / мы получим:

Billy The Kid Smith
Jimmy The Fish Stuart
Chuck The Man Norris

Поскольку кавычек не было в скобках, они не были частью содержимого из \ 1 !

Чтобы оставить только содержимое внутри двойных кавычек, нам нужно сопоставить всю строку. Для этого у нас есть ^ (что означает «начало строки») и $ (что означает «конец строки».)

Так что теперь, если мы используем с /^.*"(.*)». * $ / \ 1 / , мы получим:

The Kid
The Fish
The Man

Почему? Давайте прочитаем регулярное выражение s /^.* "(. *)". * $ / \ 1 / слева направо:

  • s / - Запустите подстановка регулярное выражение
  • ^ - поиск начала строки. Начните оттуда.
  • . * - Продолжайте читать, читая каждый символ, до ...
  • " - ... пока не достигнете двойной кавычки.
  • ( - создать группу символов, которую мы могли бы вспомнить позже при возврате.
  • . * - Продолжайте, читая каждый символ, пока ...
  • ) - (pssst! закройте группу! )
  • " - ... пока вы не достигнете двойной кавычки.
  • . * - Продолжайте читать, читая каждый символ, до ...
  • $ - Конец линии

  • / - используйте что С другой стороны, размер клики здесь ограничен (10), поэтому грубая сила в худшем случае равна n ^ 10.

    Редактировать: Ключевой вопрос здесь заключается в том, каковы свойства функции сговора. Могут ли 10 игроков, вступающих в сговор вместе, всегда быть обнаружены путем вызова функции на двух меньших наборах (скажем, 5) игроков

3
ответ дан 4 December 2019 в 01:58
поделиться

Под вашей моделью все, что вы описываете, должно быть довольно простым. Вам дан неявный граф (вершины - это игроки, ребра соответствуют тому, что они играли в игру вместе). Вам нужен подграф этого графа.

Если функция сговора была абсолютно надежной, вы просто вызываете ее на каждой паре вершин графа, и вы получаете подграф.

Этот подграф, вероятно, довольно отключен. Я ожидал бы, что полученный граф будет отключен или очень слабо связан; большие хорошо связанные подграфы будут быстро выпадать при выполнении нескольких сокращений.

Обратите внимание, что мы можем ограничиться рассмотрением только пар, потому что функция сговора должна подчиняться (с точки зрения уровня доверия) Collude (A, B, C)

Создание этой глобальной функции сговора - это та часть, которая кажется сложной.

1
ответ дан 4 December 2019 в 01:58
поделиться
..

Я бы разделил это на два этапа:

  1. Итерация более 5 миллиардов рук в покере, рассматривающих игру на каждой руке. Применить какой-нибудь алгоритм, назовём его алгоритмом A, на каждой руке. По мере того, как вы идете, вы строите график сговора, где вершины представляют игроков, а неориентированные взвешенные рёбра представляют некоторую уверенность в сговоре между двумя игроками. Когда алгоритм A срабатывает по подозрению в сговоре игрока X с игроком Y, некоторое значение добавляется к взвешенному краю XY в графике сговора. По мере прохождения через руки, которые были проиграны, вес фронта накапливается с течением времени. Когда некоторый порог достигнут, тогда рёбра представляют собой сговор между X и Y.

  2. Затем функция, определяющая, имеет ли список вершин N игроков все сговорившиеся вместе, является вопросом проверки того, что подграф, содержащий N вершин, полностью связан (это означает, что каждая вершина имеет вес рёбра, превышающий порог сговора с каждой другой вершиной подграфа). IIRC, определяя это O(n*lg(n) ).

1
ответ дан 4 December 2019 в 01:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: