【发布时间】:2018-11-16 05:20:54
【问题描述】:
p = random_point(a,b)
#random_point() returns a tuple/named-tuple (x,y)
#0<x<a 0<y<b
if centers.validates(p):
centers.insert(p)
#centers is the data structure to store points
在centers 数据结构中,所有x 和y 坐标都存储在两个单独的排序(升序)列表中,一个用于x,另一个用于y。 x中的每个节点都指向对应的y,反之亦然,这样它们就可以分别排序并且仍然持有pair属性:centers.get_x_of(y)和centers.get_y_of(x)
我在数据结构中需要的属性:
- 快速插入,在已排序的数据中(最好是 log n)
- 随机访问
- 对 x 和 y 分别排序,不会丢失对属性
最初我想使用简单的Lists,并使用Binary search 来获取插入任何新元素的索引。但我发现,可以使用像 AVL 或 B-trees 这样的自平衡树来改进它。我可以为x 和y 分别制作两棵树,每个节点都有一个额外的指针,可以从x-tree 节点指向y-tree 节点。
但我不知道如何在这些树中构建随机访问功能。函数centers.validate() 尝试插入x & y,并对相邻元素进行一些检查,这需要随机访问:
def validate(p):
indices = get_index(p)
#returns a named tuple of indices to insert x and y, Eg: (3,7)
condition1 = func(x_list[indices.x-1], p.x) and func(x_list[indices.x+1], p.x)
condition2 = func(y_list[indices.y-1], p.y) and func(y_list[indices.y+1], p.y)
#func is some mathematical condition on neighboring elements of x and y
return condition1 and condition2
在上述函数中,我需要访问x & y 的相邻元素
数据结构。我认为在树中实现这一点会使它复杂化。是否有任何数据结构组合可以实现这一目标?我正在用 Python 写这个(如果有帮助的话)
【问题讨论】:
-
我认为两个可索引的跳过列表,一个用于 'x's 和一个用于 'y's 可以做到这一点。 en.wikipedia.org/wiki/Skip_list
-
定义“快”。 O(log n) 对随机访问是否足够快?如果是这样,那么上面提到的可索引跳过列表是一个好主意。插入呢?什么是“快”?
-
你可以使用两个不同的字典和对应的键/值对吗?插入是 O(1)。随机访问是 O(1)。您需要多久对元素进行一次排序?插入时排序是这个数据结构的关键方面吗?
标签: python python-3.x list data-structures tree