NSArray的NSDictionary的VS抬头(NSArray vs NSDictionary

2019-10-16 19:52发布

这是检查是否有物体已经在一个列表中存在更快和更便宜。 通过使用NSArray的对象包含或检查,如果一个键已经存在了一个NSDictionary?

也不会在NSArray的containObject selecter通过整个阵列元件迭代? 还什么有关检查,如果一个键已经在词典中存在? 这是否需要通过所有的按键迭代。

最后,什么是检查对象是否已经(同一类)对象的大名单中存在的最好和最快的方式。

提前致谢

Answer 1:

有多少价值,你在说什么? 的速度差可以是不相关的,从而使选择是一个使在代码最有意义。 事实上,这也许应该是第一优先,除非及直至你知道,有一个速度的问题。

短版:使用NSDictionary的,除非你有特殊需要不。



Answer 2:

据集合类的文件是基于哈希表中的NSDictionary。 这意味着如果你正在寻找一本字典的关键,所需的时间是玉米粥小于通过数组迭代。

因此,寻找一个关键的应该是O(1个+ numberofcollisions)。 其中通过阵列迭代是O(N)。 您可以快速排序数组,那么二进制搜索它,这将使得成本少了很多。 然而,对于您的降压,NSDictionary的(哈希表)是用于搜索非常便宜。

从苹果公司的文档

在内部,一个字典使用一个哈希表来组织它的存储,并提供给相应的键的值的快速访问。 然而,对于词典中所定义的方法中隔离您从与哈希表,散列函数,或密钥的散列值的工作的复杂性。 该方法直接取钥匙,而不是在他们的散列形式。



Answer 3:

我要说的是最快的办法是进行排序的数组,当你插入的对象:

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:



文章来源: NSArray vs NSDictionary look up