在参考了《Fast k Nearest Neighbor Search using GPU》后,结合现在在做的课题,写点东西。
1. 算法思路
KNN算法的基础是对给定的query点集,对应查找在参考空间中距离最近的K个紧邻点。KNN的应用方面非常广泛,在ICP配准问题,Spin-image旋转图像配准法,SIFT点提取,数据挖掘,机器学习等多个方面中有广泛应用。
KNN算法存在的一个重要问题是,繁重的计算量。如果参考空间由M个点,query点集有N个点,空间维度维d维,那么计算query点集与参考空间各个点集的距离就有O(mnd)的时间复杂度。同时,对于每一个query点计算出的M个距离进行排序,至少要有O(m*logm)的时间复杂度,仅仅排序就要有O(mn*logm)的时间复杂度。因此,整个KNN问题的时间复杂度为O(mnd)+O(mnlogm)。这里为了方便,输入参考空间与query点集都是n个点。
虽然针对于KNN算法有各种各样的优化方式,但是这里讨论的重点是CUDA对KNN问题的优化,因此采用最基础(也是最暴力的)Brute Force算法——穷举法。
虽然快排算法