如何查找数组集合中第二大元素的索引

How to find the index of second largest element in an array collection?

本文关键字:元素 索引 集合 何查找 查找 数组      更新时间:2023-10-16

我有一个函数,可以计算柜台上每次结账所花费的总和,计算后,我想找到最好的两个结账柜台,我能够找到最大结账的索引,但我对找到第二大结账柜台有一点困惑。这是代码。

for (int j = 0; j < Bq[i]; j++)
{
    sumM += p.GetValue(i, j).GetSum();
    sumT += p.GetValue(i, j).GetTime();
}
indexofmax = i;
if(sumM > maxmoney)
{
    Secondbestcheckout=firstbestcheckout;
    firstbestcheckout = indexofmax+1;
    maxmoney = sumM;
    secondindex = Secondbestcheckout;
    indexofmax =firstbestcheckout;
}
fr << i+1 << fixed << setw(9) << setprecision(2) << sumM
   << " " << setw(6) << sumT << endl;
}
fr << "The first best checkout interms of money collected is "
   << firstbestcheckout << "And the second best checkout is "
   <<  secondindex << endl;

此代码成功打印最大结账柜台的索引,但未成功打印第二大结账柜台的索引。

只有当你表现最好时,才会发送第二好的。

示例 40、60、50、30

使用您的代码,您设置的最佳时间是 40。 然后 60 取代它,40 成为第二好的。 THen 50 到达,但它的表现并没有超过最好的,所以被忽略为第二好。

您必须添加一个子句来处理这种情况:

...
if (sumM > maxmoney)   // as you already did
{
    Secondbestcheckout=firstbestcheckout;
    firstbestcheckout = indexofmax+1;
    secondmaxmoney = maxmoney;   // <<NEW INSTRUCTION - of course, you'll need to create and init secondmaxmoney somewhere ;-)
    maxmoney = sumM;
    secondindex = Secondbestcheckout;
    indexofmax =firstbestcheckout;
}
else if (sumM > secondmaxmoney)       // NEW STATEMENT  
{
    Secondbestcheckout= ...;       // as above, but unclear for me what the difference with secondinex is
    secondmaxmoney = maxmoney;     // update amount onf second best
    secondindex = i;               // or i+1 ?  Not clear if you start from 0 or from 1 
}
...  // rest or your code

如果您可以将所有值保留在内存中(即,如果您的签出次数少于数十亿次),则可以使用 std::partial_sort 对两个最大的元素进行排序(但保留其余元素的未排序),也可以使用std::nth_element两次,一次使用 1,一次使用 2。(在这两种情况下,你的谓词都应该是std::greater,我想。

如果您需要以流式处理方式(即使用常量空间)处理值,则需要单独跟踪每个订单索引,基本上与您已经尝试的类似。Boost.Accumulators可能有一些工具来简化这项任务。

不要让它变得复杂,它很简单:

INDX = (-ARRAY).argsort()[:N]

其中 N 是您正在搜索的元素数,例如 N=2(两个最大的数字)ARRAY 是你正在搜索的 numpy 数组,例如 ARRAY=np.array[10.1,9,10,5,1,3]并且,INDX 是数组中元素索引的列表。显然,INDX 的长度等于 N。