我使用 Instruments 在我的 iOS 应用程序上运行了一些程序,发现启动时主线程上 90% 的负载(总共约 1000 毫秒)是由 containsObject: 调用引起的。那是在主线程上,我不认为这很酷。
这种方法有更快的替代方法吗?算法还是其他方法?
有什么建议么?
更多信息:
我再次查看了我的代码,我意识到实际上我不需要知道对象的顺序,只要一个对象是该集合的一部分。这意味着 NSSet 会做得很好(我猜更快)。
对象数量 - 该集合中很可能有 1000 多个对象。
我使用 Instruments 在我的 iOS 应用程序上运行了一些程序,发现启动时主线程上 90% 的负载(总共约 1000 毫秒)是由 containsObject: 调用引起的。那是在主线程上,我不认为这很酷。
这种方法有更快的替代方法吗?算法还是其他方法?
有什么建议么?
更多信息:
我再次查看了我的代码,我意识到实际上我不需要知道对象的顺序,只要一个对象是该集合的一部分。这意味着 NSSet 会做得很好(我猜更快)。
对象数量 - 该集合中很可能有 1000 多个对象。
如果您需要使用数组,请再往下跳一点
您的其他选择可能包括:
使用一个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];
}
您可以使用NSSet containsObject
比NSArray