python实现KD树模型

本文介绍了一个简单的KD树数据结构实现,包括添加子节点、构建树和打印树等基本操作。通过具体的示例代码展示了如何使用该算法处理二维空间数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import numpy as np


class KDTree():
    def __init__(self, obj):
        self.key = obj
        self.lchild = None
        self.rchild = None

    def addlChild(self, obj):
        if self.lchild == None:
            self.lchild = obj
        else:
            t = KDTree(obj)
            t.lchild = self.lchild
            self.lchild = t

    def addrChild(self, obj):
        if self.rchild == None:
            self.rchild = obj
        else:
            t = KDTree(obj)
            t.rchild = self.rchild
            self.rchild = t

    def getRootVal(self):
        return self.key

    def splitLR(self, root, left, right):
        self.key = root

    def buildKD(self, data, depth):
        dataNum = data.__len__()
        if dataNum == 0:
            return
        else:
            self.key = KDTree(data[0])
        numAxis = 2
        splitAxis = depth % numAxis
        lchilds = []
        rchilds = []
        for i in range(dataNum):
            if data[i][splitAxis] == self.calMedian([x[splitAxis] for x in data]):  # 根
                self.key = data[i]
            else:
                if data[i][splitAxis] < self.calMedian([x[splitAxis] for x in data]):
                    lchilds.append(data[i])
                else:
                    rchilds.append(data[i])
        self.lchild = KDTree(' ')
        self.rchild = KDTree(' ')
        self.lchild.buildKD(lchilds, depth + 1)
        self.rchild.buildKD(rchilds, depth + 1)

    def calMedian(self, data):
        numElem = data.__len__() / 2
        data = np.sort(data)
        return data[numElem]

pass


def printTree(KDTree):
    if ' ' == KDTree.lchild.key and ' ' == KDTree.rchild.key:
        print KDTree.key
    else:
        printTree(KDTree.lchild)
        printTree(KDTree.rchild)

if __name__ == "__main__":
    data = [[2, 3], [5, 4], [9, 6], [4, 7], [8, 1], [7, 2]]
    tree = KDTree(' ')
    tree.buildKD(data, 0)
    printTree(tree)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值