Якщо припустимо, що є фіксованим (як це роблять обидві пов'язані лекції), то ваш алгоритмічний вибір визначатиме, чи приймає ваш обчислення час виконання O ( n d + k n ) або O ( n d k )kO(nd+kn)O(ndk) час виконання.
Спочатку розглянемо алгоритм виконання :O(nd+kn)
- Ініціалізуйте для всіх спостережень i в навчальному наборіselectedi=0i
- Для кожного навчального набору спостереження , обчислити d i s t i , відстань від нового спостереження до навчального набору iidistii
- Для до k : перегляньте всі спостереження набору тренувань, вибравши індекс i з найменшим значенням d i s t i і для якого s e l e c t e d i = 0 . Виберіть це спостереження, встановивши s e l e c tj=1kidistiselectedi=0 .selectedi=1
- Поверніть вибраних індексівk
Кожне обчислення відстані вимагає виконання часу виконання, тому другий крок вимагає виконання O ( n d ) часу виконання. Для кожного ітерату на третьому кроці ми виконуємо роботу O ( n ) , пробираючи спостереження через навчальний набір спостережень, тому загальний крок вимагає роботи O ( n k ) . Перший та четвертий кроки вимагають лише роботи O ( n ) , тому ми отримуємо O ( n d + k n )O(d)O(nd)O(n)O(nk)O(n)O(nd+kn) .
Тепер розглянемо алгоритм виконання :O(ndk)
- Ініціалізуйте для всіх спостережень i в навчальному наборіselectedi=0i
- Для до k : проведіть через усі спостереження набір тренувань і обчисліть відстань d між вибраним спостереженням та новим спостереженням. Виберіть індекс i з найменшим d значенням, для якого s e l e c t e d i = 0 . Виберіть це спостереження, встановивши s e l e c t e d i = 1 .j=1kdidselectedi=0selectedi=1
- Поверніть k вибраних індексів
Для кожного ітерату на другому кроці ми обчислюємо відстань між новим спостереженням та кожним спостереженням набору тренувань, вимагаючи, щоб працював для ітерації, а отже O (O(nd)O(ndk) цілому.
Різниця між двома алгоритмами полягає в тому, що перший попередньо обчислює і зберігає відстані (вимагаючи додаткової пам'яті), а другий - ні. Однак, враховуючи, що ми вже зберігаємо весь навчальний набір, що вимагає O ( n d ) пам'яті, а також вектор s e l e c t e d , що вимагає O ( n )O(n)O(nd)selectedO(n) зберігання, зберігання двох алгоритмів є асимптотично те саме. Як результат, кращий асимптотичний час виконання робить перший алгоритм більш привабливим.k>1
Варто зауважити, що можна отримати час виконання за допомогою алгоритмічного вдосконалення:O(nd)
- Для кожного навчального набору спостереження , обчислити d i s t i , відстань від нового спостереження до навчального набору iidistii
- Запустіть алгоритм швидкого вибору, щоб обчислити найменшу відстань в O ( n ) часу виконанняkthO(n)
- Повертайте всі індекси не більше, ніж обчислена найменша відстаньkth
Цей підхід використовує той факт, що існують ефективні підходи для знаходження найменшого значення в несортованому масиві.kth
quickselect
.