gpt4 book ai didi

ios - NSArray 包含对象 : faster alternative?

转载 作者:可可西里 更新时间:2023-11-01 03:28:33 24 4
gpt4 key购买 nike

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

是否有比此方法更快的替代方法?算法还是其他方法?

有什么建议吗?

更多信息:

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

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

最佳答案

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


备选方案

您的其他选择可能包括:

  • 使用 NSDictionary,它使用键->值对(我预计)具有 O(1) 的读取复杂度,代价是键的额外存储空间

  • 如果您不使用重复且顺序不重要,使用 NSSet 将提供更好的读取复杂度(我不知道复杂度是多少,文档可能将)


使用数组

如果您保持数组排序,搜索可以在 O(log n) 时间内完成,而不是 O(n),因为您可以利用二进制搜索.

Caveat Lector:这是凭内存写的

-(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];
}

关于ios - NSArray 包含对象 : faster alternative?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14894868/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com