kd樹knn算法
給定kd樹,求距離p點(diǎn)最近的k個(gè)樣本。
零、L為有k個(gè)空位的列表
(一)、根據(jù)p的坐標(biāo)值和每個(gè)節(jié)點(diǎn)的切分向下搜索。
(二)、到達(dá)一個(gè)底部節(jié)點(diǎn)時(shí),標(biāo)記。如果L不足k,當(dāng)前節(jié)點(diǎn)加入L;如果L有值,且當(dāng)前節(jié)點(diǎn)與p的距離小于L里最長(zhǎng)的距離,用點(diǎn)前點(diǎn)替換L中離p最遠(yuǎn)的點(diǎn)。
(三)、如果當(dāng)前節(jié)點(diǎn)不是最頂點(diǎn),執(zhí)行(a);否則,輸出L,完成。
(a)向上爬一個(gè)節(jié)點(diǎn)。如果爬過(guò)的節(jié)點(diǎn)未被標(biāo)記,則標(biāo)記,然后執(zhí)行(1)和(2);如果已被標(biāo)記,再執(zhí)行(a)。
(1)如果L不足k,將此節(jié)點(diǎn)加入L;如果L已滿,且當(dāng)前節(jié)點(diǎn)與p的距離小于L里最長(zhǎng)距離,則替換之。
(2)計(jì)算p與當(dāng)前節(jié)點(diǎn)切分線距離。如果該距離大于等于L中距離p最遠(yuǎn)的距離且L中已滿,執(zhí)行(三);如果該距離小于L中最遠(yuǎn)距離或L未滿,從當(dāng)前節(jié)點(diǎn)另一枝從(一)開始。