Додаток нижче, що роз'яснює умови k(k−1) :
Отже, якщо вивчити терміни у виразі, ви можете передбачити (як аналогія) термін - це перерахування всіх бінарних рядків, що містять 1, які мають перше положення 1. Іншими словами, ми дозволяємо кожній позиції у двійковому рядку відображати вибір того, чи є одне із яти міст у задачі в тому саме підмножині, яке ми розглядаємо на той час. Так, для 5 міст 10101 відповідає підмножині {1,3,5}.(n−1k)kn
Таким чином, для обчислення всіх підмножин {1, ..., }, ми просто підраховуємо кожне двійкове підмножина (тобто рахуємо через двійкові рядки) розміру = 2 (тобто двійкові рядки розміром які містять два 1-х), то size = 3, тоді розмір = 4, ... тоді розмір = n. (Зверніть увагу, що підмножина size = 1 повинна містити лише перше місто, і тому неважливо обчислити його часткове відстань, оскільки відстань від 1 -> у всіх інших містах підмножини -> 1 рівно 0.)nn
У кожній підмножині з містами ми повинні враховувати до кандидат-оптимальні, часткові шляхи. Зокрема, оптимальний, сумарний шлях міг би пройти через даний підмножина і закінчитись у будь-якому з міст , виключаючи перше місто. Тоді для кожного такого підпункту-кандидата ми обчислюємо оптимальний тур до цього моменту як мінімум будь-якого з попередніх, шлях розміру = плюс відстань від міста-термінала для цього під-шляху до місто-термінал для поточного кандидата в під-шлях. Це дає такі порівняння, які ми повинні зробити. Невідповідність між моїм терміном іkk−1k−1k−1(k−1)(k−2)(k−1)(k−2)k(k−1)Термін у пов'язаному аналізі - це нотаційна різниця (я б підсумував інший діапазон, враховуючи моє визначення ніж вони). Принаймні, однак, це має ілюструвати складність цього терміна у квадратичному порядку.k
Як цікаво - я щойно закінчив кодування цього точного алгоритму в С ++ кілька хвилин тому. (Тож пробачте дотичну від чистої теорії до невеликої практичної дискусії. :))
Це коштує часу та простору - принаймні під мою реалізацію. Практично кажучи, коли ваші потреби в просторі зростають так швидко, вони стають набагато болючішими, ніж вимоги часу. Наприклад, на моєму ПК (з 4 ГБ оперативної пам’яті) я можу вирішувати екземпляри до 24 міст - більше того, і мені не вистачає пам’яті.O(2nn2)O(2nn)
Звичайно, я можу бути просто поганим програмістом, і ти можеш зробити це краще, ніж я на практиці. :)
Редагувати: Трохи більше конкретики щодо однієї деталі вашого запитання: Термін випливає з того, що вам доведеться, в гіршому випадку, обчислити часткове, оптимальне відстань від попередніх підмножин (є щонайбільше з них, зазначимо , що підсумовується по в аналізі ви пов'язані) з поточної. Це вимагає, знову ж таки, у гіршому випадку порівняння з підмножинами розміру на загальну суму .k(k−1)nknO(k)k−1O(k2)
Крім того, якщо моє пояснення було недостатньо зрозумілим, ось декілька приємних конспектів лекцій Вазірані ( PDF ). Прокрутіть униз до P. 188, щоб обговорити TSP, включаючи аналіз Холда-Карпа.