【问题标题】:Optimizing search in CFArray优化 CFArray 中的搜索
【发布时间】:2011-10-14 12:11:02
【问题描述】:

我已经对 CFArray 进行了排序,我需要找到一个值的索引。但是我也不确定该值是否在这个数组中,所以我也需要知道这一点。

现在我使用这个代码:

NSInteger valueIndex;
    BOOL valueExactMatch = CFArrayContainsValue((CFArrayRef)sortedBorders, arrayRange, value);
    if (valueExactMatch)
        valueIndex = CFArrayGetFirstIndexOfValue((CFArrayRef)sortedBorders, arrayRange, value);
    else
        valueIndex = CFArrayBSearchValues((CFArrayRef)sortedBorders, arrayRange, value, (CFComparatorFunction) CFDateCompare, nil);

但据我了解,valueExactMatch 被计算了两次——一次在 CFArrayContainsValue 中,一次执行实际搜索。

我可以使用现有的 CFArray 实现对其进行优化吗?

【问题讨论】:

    标签: objective-c arrays optimization search binary-search


    【解决方案1】:

    CFArrayGetFirstIndexOfValue 如果没有匹配则返回 -1,所以你可以这样使用:

    NSInteger valueIndex = CFArrayGetFirstIndexOfValue((CFArrayRef)sortedBorders, arrayRange, value);
    if (valueIndex == -1)
        valueIndex = CFArrayBSearchValues((CFArrayRef)sortedBorders, arrayRange, value, (CFComparatorFunction) CFDateCompare, nil);
    

    我手边没有带 XCode 的机器,但这也可以用:

    Boolean found = false;
    NSInteger valueIndex = CFArrayBSearchValues((CFArrayRef)sortedBorders, arrayRange, value, (CFComparatorFunction) CFDateCompare, nil);
    if (valueIndex < CFArrayGetCount(sortedBorders) && CFArrayGetValueAtIndex(sortedBorders, valueIndex) == value)
      found = true;
    

    【讨论】:

    • 它不执行两个完整的二进制搜索吗?看来应该更慢了吧?
    • 在您的代码中,您搜索数组一次以获取 valueExactMatch,然后再次使用 CFArrayGetFirstIndexOfValueCFArrayBSearchValues 获取索引。在我的代码中,我搜索了一次索引,如果找到,就完成了。如果没有匹配,它只会搜索第二次。
    猜你喜欢
    • 1970-01-01
    • 2015-07-20
    • 1970-01-01
    • 2019-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    • 2014-01-10
    相关资源
    最近更新 更多