【问题标题】:need suggestion to implement BINARY SEARCH for array which contains cgrect values需要建议对包含 cgrect 值的数组实施 BINARY SEARCH
【发布时间】:2012-11-29 20:39:13
【问题描述】:

我正在尝试修改我的代码以用于搜索矩形。我的工作代码在下面

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 个矩形,并且 tapedpoint 是视图中的用户点击点。如果用户录制的点不在数组中,那么在最坏的情况下会发生 500 次迭代。 *我的要求 * 我想通过使用二进制搜索算法来减少迭代。是否有任何用途来实现,如果是的话,任何人都可以根据二进制搜索修改我的代码或给我一些想法来实现这个。提前致谢。

【问题讨论】:

    标签: iphone objective-c algorithm


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      如果你的 if 语句是正确的,请做任何你喜欢的事,只要return;。这将停止不必要的迭代。

      如果你愿意,可以试试CFArrayBSearchValues

      【讨论】:

      • 感谢您的早期回复。有时 wordRect 数组包含 2500 个矩形。如果用户点击的点包含在 [wordRects objectAtIndex:1] 中,那么我的代码是好的。如果用户点击的点不包含在2500 个矩形(wordRects)然后我所有的迭代都有浪费,所以我需要减少我的迭代。为此我正在寻找一些搜索算法
      • 你能使用CFArrayBSearchValues吗?您可以在我更新的答案中获得参考
      • 我看到 CFArrayBSearchValues 在 Mac osx 中可用但在 ios 中不可用
      • 看看这是否有帮助stackoverflow.com/questions/5456633/…
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2011-09-09
        • 1970-01-01
        • 2010-09-16
        • 2010-10-22
        • 1970-01-01
        • 1970-01-01
        • 2013-08-01
        • 2012-09-21
        • 1970-01-01
        相关资源
        最近更新 更多