Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何知道NSMutable数组中最小15个对象的索引,并将这些索引存储在另一个数组中_Objective C_Algorithm_For Loop_Nsmutablearray - Fatal编程技术网

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

Objective c 如何知道NSMutable数组中最小15个对象的索引,并将这些索引存储在另一个数组中,objective-c,algorithm,for-loop,nsmutablearray,Objective C,Algorithm,For Loop,Nsmutablearray,如何知道NSMutable数组中最小15个对象的索引,并将这些索引存储在另一个数组中 我正在用objective-c编写程序,我尝试使用for循环,但还没有找到合适的算法 最简单的方法是对数组排序并选择前15个元素 一种更有效的方法是将它们推送到一个上限为15个元素的二进制堆中。数组中的前15个元素直接进入堆。如果堆中最大的元素小于它,则每个后续元素都会替换它 CoreFoundation提供了一个可用于此目的的ID,尽管您可以将ID作为void*s进行输入和输出。还有一个,我对它一无所知,只知

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

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

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

CoreFoundation提供了一个可用于此目的的ID,尽管您可以将ID作为void*s进行输入和输出。还有一个,我对它一无所知,只知道它存在并声称实现了一个二进制堆

我的首选是使用C++的std::priority_队列,它经过了彻底的测试,只需稍加哄骗就能很好地处理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。

对数组进行排序,索引0…14将对应最小的15个对象。具体问题是什么。遍历数组并存储最小15个值的索引,例如,在15个元素的有序数组中。