Dengan asumsi adalah tetap (seperti yang dilakukan oleh kedua kuliah terkait), maka pilihan algoritmik Anda akan menentukan apakah perhitungan Anda membutuhkan runtime O ( n d + k n ) runtime atau runtime O ( n d k ) .kO(nd+kn)O(ndk)
Pertama, mari kita pertimbangkan algoritma runtime :O(nd+kn)
- Inisialisasi untuk semua pengamatan saya pada set pelatihanselectedi=0i
- Untuk setiap pelatihan set observasi , hitung d i s t i , jarak dari observasi baru ke training set observasi iidistii
- Untuk hingga k : Lewati semua pengamatan set pelatihan, pilih indeks i dengan nilai d i s t i terkecil dan untuk mana s e l e c t e d i = 0 . Pilih pengamatan ini dengan mengatur s e l e c t e d i = 1 .j=1kidistiselectedi=0selectedi=1
- Kembalikan indeks yang dipilih k
Setiap perhitungan jarak membutuhkan runtime , sehingga langkah kedua membutuhkan runtime O ( n d ) . Untuk setiap iterate pada langkah ketiga, kami melakukan pekerjaan O ( n ) dengan mengulang melalui pengamatan set pelatihan, sehingga langkah keseluruhan membutuhkan pekerjaan O ( n k ) . Langkah pertama dan keempat hanya membutuhkan O ( n ) bekerja, jadi kami mendapatkan runtime O ( n d + k n ) .O(d)O(nd)O(n)O(nk)O(n)O(nd+kn)
Sekarang, mari kita pertimbangkan algoritma runtime :O(ndk)
- Inisialisasi untuk semua pengamatan saya pada set pelatihanselectedi=0i
- Untuk hingga k : Lewati semua pengamatan set pelatihan dan hitung jarak d antara observasi set pelatihan yang dipilih dan observasi baru. Pilih indeks i dengan nilai d terkecil yang s e l e c t e d i = 0 . Pilih pengamatan ini dengan mengatur s e l e c t e d i = 1 .j=1kdidselectedi=0selectedi=1
- Kembalikan indeks yang dipilih k
Untuk setiap iterate pada langkah kedua, kita menghitung jarak antara pengamatan baru dan setiap pengamatan pelatihan set, membutuhkan bekerja untuk iterasi dan karena itu O ( n d k ) kerja secara keseluruhan.O(nd)O(ndk)
Perbedaan antara kedua algoritma adalah bahwa yang pertama precomputes dan menyimpan jarak (membutuhkan memori tambahan), sedangkan yang kedua tidak. Namun, mengingat bahwa kita sudah menyimpan seluruh rangkaian pelatihan, membutuhkan memori O ( n d ) , serta vektor s e l e c t e d , membutuhkan penyimpanan O ( n ) , penyimpanan kedua algoritma tersebut asimptotik. sama. Hasilnya, runtime asimptotik yang lebih baik untuk k > 1 membuat algoritma pertama lebih menarik.O(n)O(nd)selectedO(n)k>1
Perlu dicatat bahwa dimungkinkan untuk mendapatkan runtime menggunakan peningkatan algoritmik:O(nd)
- Untuk setiap pelatihan set observasi , hitung d i s t i , jarak dari observasi baru ke training set observasi iidistii
- Jalankan algoritma QuickSelect untuk menghitung jarak terkecil di O ( n ) runtimekthO(n)
- Kembali semua indeks tidak lebih besar dari yang dihitung jarak terkecilkth
Pendekatan ini mengambil keuntungan dari fakta bahwa pendekatan yang efisien ada untuk menemukan nilai terkecil dalam array disortir.kth
quickselect
.