Складність башт Ханої


20

У мене виникли наступні сумніви щодо складності башти Ханої , щодо яких я хотів би отримати ваші коментарі.

  • Це в НП? Спроба відповіді: Припустимо, Пеггі (доказ) вирішує проблему і передає її Віктору (верифікатору). Віктор легко помітить, що остаточний стан рішення є правильним (за лінійним часом), але у нього не буде іншого варіанту, як пройти кожен з кроків Пеггі, щоб переконатися, що вона не зробила незаконний крок. Оскільки Peggy має зробити мінімум 2 ^ | диски | - 1 хід (доказний), Віктор теж повинен слідувати прикладу. Таким чином, Віктор не має перевірки поліноміального часу (визначення NP), а значить, не може бути в NP.

  • Це в PSPACE ? Здається, так, але я не можу придумати, як розширити вищезазначені міркування.

  • Це PSPACE-повний? Здається, ні, але у мене є лише розпливчасте уявлення. Автоматизоване планування, конкретним екземпляром якого є ToH, завершено PSPACE. Я думаю, що планування має набагато більш важкі випадки, ніж ToH.

Оновлено : Input = , кількість дисків; Вихід = конфігурація диска на кожному кроці. Після оновлення я зрозумів, що цей формат вводу / виводу не відповідає проблемі рішення. Я не впевнений у правильній формалізації для відображення понять NP, PSPACE тощо для подібного роду проблем.н

Оновлення №2 : Після коментарів Каве і Джеффа я змушений зробити проблему більш точною:

Нехай вхід - пара входів де n - кількість дисків. Якщо послідовність рухів, зроблених дисками, записується у форматі (номер диска, від-прив’язки, до-прив’язки) (номер диска, від-прив’язки, до-прив’язки) ... від першого переміщення до Останній і закодований у двійковому, виводить i- й біт.(н,i)нi

Дайте мені знати, чи потрібно мені бути більш конкретним щодо кодування. Я припускаю, що коментар Каве застосовується в цьому випадку?


5
Ви можете, будь-ласка, визначити проблему "Башти Ганоя" або посилання на визначення?
Каве

1
ПКГ, я знаю, що це Ханойська вежа. Я мав на увазі, у чому полягає обчислювальна проблема, яку ви хочете знати про її складність? Що таке вхід? Який вихід?
Kaveh

@Kaveh: Ваш намір був незрозумілий з вашого першого коментаря
PKG

вибачте. До речі, існують класи складності функцій, вони зазвичай мають F до і після назви, перевіряйте зоопарк складності на визначення.
Каве

1
Так ціле число також є частиною вводу? i
JeffE

Відповіді:


9

Ні, описана вами проблема насправді досить проста. Причина високого рівня полягає в тому, що індекс приблизно n біт довгий, тому ми можемо дозволити собі витратити час полінома в n .inn

Розглянемо наступну пов’язану задачу: Давши два цілих числа та k , опишіть k- й хід у розв’язку n -дискової головоломки. Розмір вводу - lg n + lg k < n + lg k , але насправді має значення лише найменш значущий біт n . Тож навіть якщо lg k значно менший за n , ми можемо вирішити цю задачу в поліномії часу в O ( log k ) .nkknlgn+lgk<n+lgknlgknО(журналк)

Припустимо, що диски пронумеровані від до будь-яких у збільшенні розмірів, а кілочки нумеруються 0 = джерело, 1 = призначення та 2 = запасні. Запишемо k = ( 2 p + 1 ) 2 d для деяких цілих чисел p і d . Потім по черзі k :0к=(2p+1)2гpгк

  • Якщо є непарним, то диск d переходить від прив'язки ( p mod 3 ) до прив'язки ( ( p + 1 ) mod 3 ) .d+nd(pmod3)((p+1)mod3)
  • Якщо є парним, то диск d переміщується з форми peg ( - p mod 3 ) в peg ( ( - p - 1 ) mod 3 ) .d+nd(pmod3)((p1)mod3)

Ми можемо легко обчислити і d у часі O ( log k ) , провівши двійкове представлення k від найменш значущого біта вгору. Це воно.pdO(logk)k

Тепер припустимо, що ви дійсно хочете го біта у вихідній послідовності, де i є частиною введення замість k . Якщо кожен виток кодується за допомогою однакової кількості бітів, зокрема, lg ( n + 1 ) біт для номера диска, 2 біта для-прив’язки, і 2 біта для прив’язки - тоді нам просто доведеться обчислити k- й хід, де k = i / ( lg ( n + 1 ) + 4 ) iiklg(n+1)22kk=i/(lg(n+1)+4), а потім витягніть відповідний біт. (Зауважте, що є лінійним у вхідному розмірі, оскільки нам потрібно знати n, щоб визначити вихід.)lg(n+1)+4n

З іншого боку, якщо ми використовуємо представлення змінної довжини для чисел дисків, то ми можемо знайти число переміщення у поліноміальний час шляхом двійкового пошуку. Нам потрібно знати загальну кількість витків, необхідних для переміщення верхніх m дисків, для всіх m k , але це задано повторенням M ( m ) = 2 M ( m - 1 ) + ( \ #bit для запису переміщення диск  m ), який ми можемо оцінити в поліноміальний час за допомогою динамічного програмування. Решта деталей залишаються читачем як нудна вправа.kmmk

M(m)=2M(m1)+(\#bits to record moving disk m)

(Я припускаю, що я допустив принаймні одну поодинку або помилку паритету, але, сподіваємось, основна ідея зрозуміла.)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.