快速更有效地搜索数组以匹配不同类型

时间:2017-04-22 16:38:55

标签: arrays swift algorithm search

我正在使用Swift 3在数组中找到一个GKGraphNode,该数组的x,y位置与目标x,y位置匹配。下面是节点的init。您可以看到每个节点都有一个名为gridPosition的vector_int2坐标。我创建了一个这些节点的数组来匹配我的地图的六边形网格。

class HexGraphNode : GKGraphNode {
var gridPosition: vector_int2!

required init(gridPosition: vector_int2) {
    super.init()

    self.gridPosition = gridPosition

}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

}

我需要能够搜索此数组以找到占用某些特定网格坐标的节点。我正在使用下面的功能。当地图很小,如500个节点以下时,此功能正常工作。但是,随着阵列的增长,程序变慢到不可接受的程度。我需要一种更有效的方法来搜索数组并找到匹配的节点,而不是每次都从索引零开始。我寻找其他帖子,但他们似乎总是比较相同类型的对象。在这种情况下,我需要将对象的属性(node.position)与不同的类型(包含x,y整数的vector_int2)进行比较。

func node(atGridPosition position: vector_int2) -> NodeType {

    var result: NodeType!

    for node in self.nodes as! [NodeType] {

        if node.gridPosition.x == position.x && node.gridPosition.y == position.y {
            result = node

            break
        }
    }

    return result
}

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

如果节点的网格位置没有动态变化,则可以保留节点字典而不是(或除此之外)数组。如果网格具有固定(或最大)宽度或高度,则可以将x,y坐标转换为单个整数值,以用作字典中的键。否则你可以使用两级字典。

然后访问节点将是O(1)操作而不是O(n / 2)。