k-d树最近邻搜索算法原理与伪代码

k-d树最近邻搜索算法伪代码:

'''
输入:k-d树根节点root,要查询的结点target
输出:k-d树中距离target最近的结点nearest_node
'''
search(root, target):
## 1. 进行二叉查找,建立搜索路径,直到找到一个叶结点
    #二分查找target结点应该落在哪个区域
    cur_node = root
    while cur_node != NULL:
        search_stack.push(cur_node)#把cur_node压入堆栈
        ##更新cur_node
        s = cur_node->split_dim #当前结点划分区域的维度
        if target->val[s] < cur_node->val[s]: 
            cur_node = cur_node->left
        else:
            cur_node = cur_node->right
## 2. 把叶结点设为最近邻点
    nearest_node = search_stack.pop() #弹出搜索堆栈放进的最后一个结点,即一个叶结点
    nearest_dis = dis(nearsest_node,taget)
## 3. 回溯更新最近邻点
    while search_stack != NULL:
        cur_node = search_stack.pop()
        if dis(cur_node,taget) < nearest_dis: # 如果cur_node到target的距离更近,更新最近邻点
            nearest_node = cur_node
            nearest_dis = dis(cur_node,target)
        s = cur_node->split_dim
        if target[s] <= cur_node[s]: #如果taget位于它的父结点的左区域,那么另外一个区域为右区域,则进入右区域搜寻最近邻点
            cur_node = cur_node->left  #如果taget位于它的父结点的右区域,那么另外一个区域为左区域,则进入左区域搜寻最近邻点
        else:
            cur_node = cur_node->right
        search_stack.push(cur_node) #把更新后的cur_node压入搜索堆栈
    return nearest_node
发布了10 篇原创文章 · 获赞 2 · 访问量 7724

猜你喜欢

转载自blog.csdn.net/ftfy123/article/details/104632512