7

我使用 Instruments 在我的 iOS 应用程序上运行了一些程序,发现启动时主线程上 90% 的负载(总共约 1000 毫秒)是由 containsObject: 调用引起的。那是在主线程上,我不认为这很酷。

这种方法有更快的替代方法吗?算法还是其他方法?

有什么建议么?

更多信息:

  1. 我再次查看了我的代码,我意识到实际上我不需要知道对象的顺序,只要一个对象是该集合的一部分。这意味着 NSSet 会做得很好(我猜更快)。

  2. 对象数量 - 该集合中很可能有 1000 多个对象。

4

2 回答 2

12

如果您需要使用数组,请再往下跳一点


备用选项

您的其他选择可能包括:

  • 使用一个NSDictionary使用键->值对的键->值对(我希望)具有 O(1) 读取复杂性,代价是键的额外存储空间

  • 如果您不使用重复项并且顺序并不重要,则使用 anNSSet将提供更好的读取复杂性(我不知道复杂性是什么,文档可能会)


使用数组

如果您保持数组排序,则可以及时完成搜索,O(log n)而不是O(n)利用二进制搜索。

警告讲师:这是凭记忆写的

-(void) /*adding*/
{
    int proposedIndex = 0;
    proposedIndex = [array indexOfObject:node
                                inSortedRange:NSMakeRange(0, array.count)
                                      options:NSBinarySearchingInsertionIndex
                              usingComparator:
                      ^ NSComparisonResult(id obj1, id obj2)
                      {
                          if (obj1.valueToCompare < obj2.valueToCompare) return NSOrderedAscending;
                          if (obj1.valueToCompare > obj2.valueToCompare) return NSOrderedDescending;
                          else return NSOrderedSame;
                      }];

    [array insertObject:node atIndex:proposedIndex];
}


-(id) /* Getting */
{
    int location = [array indexOfObject:node
                                    inSortedRange:NSMakeRange(0, array.count)
                                          options:NSBinarySearchingFirstEqual
                                  usingComparator:
                          ^ NSComparisonResult(id obj1, id obj2)
                          {
                              if (obj1.valueToCompare < obj2.valueToCompare) return NSOrderedAscending;
                              if (obj1.valueToCompare > obj2.valueToCompare) return NSOrderedDescending;
                              else return NSOrderedSame;
                          }];
    if (location == NSNotFound) return nil;
    return [array objectAtIndex:location];
}
于 2013-02-15T12:43:08.477 回答
-1

您可以使用NSSet containsObjectNSArray

于 2015-10-15T05:00:21.930 回答