我有一个计算柜台上每个结账时花费的金额的函数,经过计算,我想找到最好的两个结账柜台,我能找到最大的结账指数,但我有一个小的关于寻找第二大收银台的困惑。 这是代码。
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;
此代码成功打印最大结账柜台的索引,但未成功打印第二大索引。
答案 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。