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

时间:2014-12-07 12:28:40

标签: c++

我有一个计算柜台上每个结账时花费的金额的函数,经过计算,我想找到最好的两个结账柜台,我能找到最大的结账指数,但我有一个小的关于寻找第二大收银台的困惑。 这是代码。

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;

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

3 个答案:

答案 0 :(得分:0)

只有当你的表现超出最佳状态时才会发送第二好的。

40,60,50,30

的示例

使用你的代码,你设置一个最好的第一次,是40。然后60取代它40成为第二好。 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

答案 1 :(得分:0)

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

如果您需要以流式方式处理值(即具有恒定空间),那么您需要分别跟踪每个订单索引,这与您正在尝试的内容类似。 Boost.Accumulators可能有一些工具来简化这项任务。

答案 2 :(得分:0)

别搞得很复杂,很简单:

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

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