Розв’язування лабіринту чисел-бункерів


18

Моїм 8-річним набридло, створюючи звичайні лабіринти, і він взявся за створення таких варіантів:

Кількість зразка бункера

Ідея полягає в тому, щоб почати з x і досягти o через звичайні правила. Крім того, ви можете " перейти " з будь-якого цілого числа на будь-яке інше ціле число b , але ви повинні сплатити | а - б | доларів за пільгу. Мета - вирішити лабіринт за найменші витрати. У наведеному вище прикладі ми можемо перейти від x до o через x-14-18-27-28-o за вартістю 5, але дешевше перейти на x-13-11-9-8-29-28-o лише 4.ab|ab|

Тож ось моє запитання: яке найкраще рішення (з точки зору асимптотичного часу роботи) ви можете вирішити для вирішення цього питання? Ви можете зробити будь-які розумні припущення щодо формату введення.

Примітка. Я використовую тут тег "пазли", оскільки маю на увазі відповідь , але я не впевнений, що це оптимально, і я хотів би побачити, чи може хтось ще покращити моє рішення. (Тут n - кількість цілих чисел у лабіринті.)O(n2)n


7
Реквізит для вашої дитини для створення таких творчих та математичних пазлів!
bbejot

2
@bbejot Ви повинні побачити деякі речі, які він мене запитує ... іноді я не можу відповісти на його запитання. Напр., Math.stackexchange.com/questions/33094/…
Fixee

1
Я не впевнений, що ваші розрахунки витрат правильні. x-14-18-27-28-o має коштувати а x-13-11-9-8-29-28-o повинен коштувати 2 + 2 + 1 + 21 + 1 = 27 . 4+9+1=142+2+1+21+1=27
Дейв Кларк

1
@ Не всі переходи є стрибками. Ми можемо написати "ab" для стрибків (у яких вартість ) і "a-> b" для прогулянки по графіку від a до b (що має вартість 0 ), що дозволено, лише якщо вони доступні, не розбиваючи стіни в лабіринті. У цьому позначенні маємо x-> 14-18-> 27-28-> o і вартість 5 і x-> 13-11-> 9-8-> 29-28-> o. Я худий Fixee не вводив цю нотацію через те, що вона є зайвою: немає причин стрибати двічі, і тому хміль і прогулянки в лабіринті будуть чергуватися. |aб|0
Артем Казнатчеєв

2
Це відмінна проблема домашнього завдання!
Jeffε

Відповіді:


15

Ви можете вирішити це за час, використовуючи варіацію алгоритму Дейкстри. Ми можемо уникнути, не виконуючи всі оновлення відстані, коли відвідуємо новий вузол. Якщо ми відвідуємо вузол y , нам потрібно лише оновити відстані всього, що можна переходити від y до 0, і оновлювати відстані до двох вузлів y - і y + з найближчими значеннями до y менше і більше, ніж y, які не мають вибрали ще.O(nlogn)yyyy+yy

Цих оновлень достатньо, щоб купа повертала мінімальний елемент, тому що будь-який найближчий вузол, на який ви переходите, повинен був чисельно трохи вище або трохи нижче вже відвіданого вузла.

Кожен вузол оновлюється до 0 максимум одразу (якщо ми вискакуємо всі нульові відстані з черги, щоб уникнути квадратичної поведінки), і кожен раз, коли ми додаємо вузол, ми робимо лише O (1) інші оновлення. Пошук значень і y + може бути здійснено за лінійним часом, якщо ми також збережемо упорядкований подвійно пов'язаний список усіх вузлів, відсортований за їх цілими значеннями. Створення цього подвійно пов'язаного списку займає час O ( n log n ) , і, нарешті, оновлення O ( n ) до і спливає з купи займає час O ( n log n ) , загальний час виконання O (yy+O(nlogn)O(n)O(nlogn)O(nlogn)


Це, ймовірно, можна трохи покращити, використовуючи черзі сортування та пріоритетності, спеціалізовані для цілих чисел, але ви не можете зробити краще, ніж сортування цілих чисел, як видно з наступного зменшення: якщо у нас є список цілих значень , встановіть x удвічі менше мінімуму, а o - удвічі більше максимуму. Створіть область зі значеннями 2 x i та 2 x i + 1 один для одного x i . Найкраще рішення проходить через кожну область в упорядкованому порядку по x i , і таким чином виробляється сортуванняx1,,xnxo2xi2xi+1xixi значення. xi
Дейв

Дейв правильно, це можна зменшити до , лише оновивши y + і y - . Крім того, замість того, щоб підключати кожен вузол у регіоні до кожного іншого вузла в регіоні, їх потрібно підключити лише до 1 або 2 інших вузлів у регіоні (зробити шлях). Таким чином, кожен вузол має лише до 4 ребер. Тоді алгоритм Дейкстри (з чергою черговості пріоритету), можливо, застосовано надання часу O ( n l g n ) . O(nlgn)y+yO(nlgn)
bbejot

@bbejot: Але якщо так, чи не покращує інтегральну чергу пріоритетів Thorup час роботи до , або навіть до O ( n ) з деякою додатковою технікою ковзання в непрямому випадку? O(nloglogn)O(n)
Сісен-Чі Чанг 張顯 之

4

Я відчуваю, що може бути найкращим, що ти можеш отримати.O(n2)

Здається природним перетворити цю проблему на найкоротшу проблему шляху спеціальним початковим вузлом (x) та кінцевим вузлом (0). Буде також ще один вузол для кожного з чисел. І x, і 0 мають краї вагою 0 для всіх вузлів чисел, які доступні в лабіринті. Усі вузли чисел пов'язані або з масою 0 (якщо цифри доступні лабіринту), або з різницею між числами (якщо їх немає в лабіринті).

Найкоротший шлях у цьому графіку не може бути вирішений менше ніж оскільки граф має приблизно n 2 ребра, і, в гіршому випадку, потрібно було б переглянути кожен випадок один раз. Таким чином, алгоритм Дейкстра для найкоротшого шляху займає час O ( n 2 ) і є в гіршому випадку оптимальним.O(n2)n2O(n2)


Це відповідь, яку я мав на увазі; звичайно, вам потрібно використовувати належну структуру даних з алгоритмом Дейкстри, щоб отримати O(n2)O(n2lgn)

1
rO(r2)

O(nlogn)O(r2+nlogn)Ω(nlogn)

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