需要建议为包含cgrect值的数组实现BINARY SEARCH

时间:2011-05-06 08:31:49

标签: iphone objective-c algorithm

我正在尝试为搜索rect修改我的代码。我的工作代码在下面

for(int i=0;i<[wordRects count];i++){

     if(CGRectContainsPoint([[wordRects objectAtIndex:i] CGRectValue], tapedPoint)){

        lineImage=[[UIImageView alloc] initWithFrame:[[wordRects objectAtIndex:i]CGRectValue]];
        lineImage.backgroundColor=[[UIColor blueColor] colorWithAlphaComponent:0.3f];
        [textSelectionView addSubview:lineImage];
        break;    
    }
}

在上面的代码中,wordRects数组包含大约500个rects,tapedpoint是视图中的用户点击点。如果用户录制的点不在阵列中,那么在最坏的情况下会发生500次迭代。 * 我的要求* 我希望通过使用二进制搜索算法来减少迭代。有任何用途可以实现,如果是,任何人都可以根据二进制搜索修改我的代码或者给我一些想法来实现它。谢谢提前。

3 个答案:

答案 0 :(得分:2)

在边界检查中获得良好性能的最简单且最强大的方法之一是使用空间分区树或其他称为空间索引树,更具体地说是QuadTree,因为rects是2D结构。

答案 1 :(得分:0)

如果你的if语句是真的,那就做你喜欢的事,只做return;。这将阻止不必要的迭代。

如果您愿意,可以尝试CFArrayBSearchValues

答案 2 :(得分:0)

要提高效果,您应该使用spatial indexing。您可以使用单个网格,其中每个单元格包含指向该单元格上的所有矩形的指针。这应该很容易实现,但足以满足您的需要。您也可以查看other spatial indexing techniques