这是检查是否有物体已经在一个列表中存在更快和更便宜。 通过使用NSArray的对象包含或检查,如果一个键已经存在了一个NSDictionary?
也不会在NSArray的containObject selecter通过整个阵列元件迭代? 还什么有关检查,如果一个键已经在词典中存在? 这是否需要通过所有的按键迭代。
最后,什么是检查对象是否已经(同一类)对象的大名单中存在的最好和最快的方式。
提前致谢
这是检查是否有物体已经在一个列表中存在更快和更便宜。 通过使用NSArray的对象包含或检查,如果一个键已经存在了一个NSDictionary?
也不会在NSArray的containObject selecter通过整个阵列元件迭代? 还什么有关检查,如果一个键已经在词典中存在? 这是否需要通过所有的按键迭代。
最后,什么是检查对象是否已经(同一类)对象的大名单中存在的最好和最快的方式。
提前致谢
有多少价值,你在说什么? 的速度差可以是不相关的,从而使选择是一个使在代码最有意义。 事实上,这也许应该是第一优先,除非及直至你知道,有一个速度的问题。
短版:使用NSDictionary的,除非你有特殊需要不。
据集合类的文件是基于哈希表中的NSDictionary。 这意味着如果你正在寻找一本字典的关键,所需的时间是玉米粥小于通过数组迭代。
因此,寻找一个关键的应该是O(1个+ numberofcollisions)。 其中通过阵列迭代是O(N)。 您可以快速排序数组,那么二进制搜索它,这将使得成本少了很多。 然而,对于您的降压,NSDictionary的(哈希表)是用于搜索非常便宜。
从苹果公司的文档
在内部,一个字典使用一个哈希表来组织它的存储,并提供给相应的键的值的快速访问。 然而,对于词典中所定义的方法中隔离您从与哈希表,散列函数,或密钥的散列值的工作的复杂性。 该方法直接取钥匙,而不是在他们的散列形式。
我要说的是最快的办法是进行排序的数组,当你插入的对象:
NSMutableArray *myArray;
[myArray addObject:someCustomObject];
[myArray sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
// custom compare code here
}];
虽然这需要表现出来插入对象,这将大大增加你的查找时间。
为了做一个NSArray的二进制搜索:
BOOL binarySearchContains(NSArray *sortedArray, id object, NSComparator comparisonBlock)
{
// simple recursive helper function
__block BOOL (^_binaryRecurse)(NSArray *, id, int lo, int hi) = ^BOOL(NSArray *array, id object, int lo, int hi)
{
int middleIndex = ((hi - lo) / 2) + lo;
if (hi == lo || middleIndex < 0 || middleIndex >= [array count])
return NO;
int compareResult = (comparisonBlock(object, [array objectAtIndex:middleIndex]));
if (compareResult < 0)
return _binaryRecurse(array, object, lo, middleIndex - 1);
if (compareResult > 0)
return _binaryRecurse(array, object, middleIndex + 1, hi);
return YES;
};
return _binaryRecurse(sortedArray, object, 0, [sortedArray count]);
}
在我的测试中, bsearch
比快约15倍-containsObject: