2012-09-19 75 views
0

在Python編程語言實現的kd樹的算法構建如下(從http://en.wikipedia.org/wiki/K-d_tree):kd樹籌建排序優化

class Node: pass 

def kdtree(point_list, depth=0): 

    if not point_list: 
    return None 

    # Select axis based on depth so that axis cycles through all valid values 
    k = len(point_list[0]) # assumes all points have the same dimension 
    axis = depth % k 

    # Sort point list and choose median as pivot element 
    point_list.sort(key=lambda point: point[axis]) 
    median = len(point_list) // 2 # choose median 

    # Create node and construct subtrees 
    node = Node() 
    node.location = point_list[median] 
    node.left_child = kdtree(point_list[:median], depth + 1) 
    node.right_child = kdtree(point_list[median + 1:], depth + 1) 
    return node 

則排序基於每一步進行。如何減少排序的數量?

+1

你的意思是減少排序的數量? –

+0

你必須對每一步排序數組,複雜度快速排序nlog(n)=>複雜度樹構建k * nlog(n),其中k - 步數;我想要優化算法樹build – Fandorin

+0

k是數字維度,而不是步驟 – Scholle

回答

1

它看起來像你只是排序分裂中位數。相反,您可以實現線性時間選擇算法,如quickselect,然後執行point_list的線性時間分區。那麼,你根本不需要再分類了。

+0

謝謝!我搜索了http://ndevilla.free.fr/median/median/index.html(quickselect.c)。我可以改變快速選擇方法。是? – Fandorin

+0

@Fandorin:是的,如果你以不同的方式進行分裂。 'point_list [:median]'取決於排序順序。 –