如何知道NSMutable数组中最小的15个对象的索引,并将这些索引存储在另一个数组中

时间:2013-12-25 23:15:01

标签: objective-c algorithm for-loop nsmutablearray

如何知道NSMutable数组中最小的15个对象的索引,并将这些索引存储在另一个数组中 我在objective-c中编写我的程序,我尝试使用for循环,但我还没有能够提出正确的算法。

1 个答案:

答案 0 :(得分:0)

最简单的方法是对数组进行排序并选择前15个元素。

更有效的方法是将它们推入具有15个元素上限的二进制堆。数组中的前15个元素直接进入堆中。如果它小于它,则每个后续元素都会替换堆中的最大元素。

CoreFoundation提供了CFBinaryHeap,可用于此目的,但您可以将id作为void *进入和退出。还有NDHeap,我一无所知(除了它存在并声称实现二进制堆)。

我的偏好是使用C ++的std::priority_queue,它已经过全面测试,可以通过一些哄骗来处理id

auto lt = [](id a, id b) { return (whatever means "a < b" to you); };
std::priority_queue<id, std::vector<id>, decltype(lt)> pq{lt};

for (id e in myarray) {
    if (pq.size() == 15 && lt(e, pq.top()))
        pq.pop();
    if (pq.size() < 15)
        pq.push(e);
}

NSMutableArray * top15 = [NSMutableArray arrayWithCapacity:15];
while (!pq.empty()) {
    [top15 addObject:pq.top()];
    pq.pop();
}

要使用此代码,您必须将相关的.m文件重命名为.mm。