嘿伙计们,我已经为这个工作了3天,并且从我看过的每一个都没有得到任何东西。
我正在尝试使用大约250个浮点数的数组,并且无需改变数组或创建新数组即可找到第K个最大值。
我可以更改它或创建一个新的,因为其他函数需要以正确的顺序放置数据,而我的Arduino不能在其内存空间中保存更多值,因此最简单的2个选项就出来了。
数组中的值可以(也可能会)包含重复项。
作为EG:如果你有数组::: 1,36,2,54,11,9,22,9,1,36,0,11; 从Max到min将:: 1)54 2)36 3)36 4)22 5)11 6)11 7)9 8)9 9)2 10)1 11)1 12)0
任何帮助都会很棒。 要求一个能很好地为我做这个的功能可能要做很多事啊:) hahaha
这是我到目前为止的代码,但我还没有尝试让重复项工作 它出于某种原因只能给出一个答案,因为某些原因是2 ,,,不知道为什么虽然
void setup()
{
Serial.begin(9600);
}
void loop ()
{
int Array[] = {1,2,3,4,5,6,7,8,9,10};
int Kth = 6; //// just for testing putting the value as a constant
int tr = 0; /// traking threw the array to find the MAX
for (int y=0;y<10;y++) //////////// finding the MAX first so I have somewhere to start
{
if (Array[y]>Array[tr])
{
tr = y;
}
}
Serial.print("The max number is ");
int F = Array[tr];
Serial.println(F); // Prints the MAX ,,, mostly just for error checking this is done
///////////////////////////////////////////////////////// got MAX
for ( int x = 1; x<Kth;x++) //// run the below Kth times and each time lowering the "Max" making the loop run Kth times
{
for(int P=0;P<10;P++) // run threw every element
{
if (Array[P]<F)
{
for(int r=0;r<10;r++) //and then test that element against every other element to make sure
//its is bigger then all the rest but small then MAX
{
Serial.println(r);
if(r=tr) /////////////////// done so the max dosent clash with the number being tested
{
r++;
Serial.println("Max's Placeing !!!!");
}
if(Array[P]>Array[r])
{
F=Array[P]; ////// if its bigger then all others and smaller then the MAx then make that the Max
Serial.print(F);
Serial.println(" on the ");
}
}}}}
Serial.println(F); /// ment to give me the Kth largest number
delay(1000);
}
答案 0 :(得分:1)
如果速度不是问题,您可以采用这种方法(伪代码):
current=inf,0
for i in [0,k):
max=-inf,0
for j in [0,n):
item=x[j],j
if item<current and item>max:
max=item
current=max
然后 current
将包含第k个最大项,其中一个项是一对值和索引。
这个想法很简单。要找到第一个最大的项目,您只需找到最大的项目。要查找第二大项目,您会发现最大项目不大于您的第一大项目。要查找第三大项目,您会发现不大于第二大项目的最大项目。等
这里唯一的技巧是,由于可能存在重复项,因此项目需要包含值和索引才能使它们成为唯一。
以下是如何在C中实现的:
void loop()
{
int array[] = {1,2,3,4,5,6,7,8,9,10};
int n = 10;
int k = 6; //// just for testing putting the value as a constant
int c = n; // start with current index being past the end of the array
// to indicate that there is no current index.
for (int x = 1; x<=k; x++) {
int m = -1; // start with the max index being before the beginning of
// the array to indicate there is no max index
for (int p=0; p<n; p++) {
int ap = array[p];
// if this item is less than current
if (c==n || ap<array[c] || (ap==array[c] && p<c)) {
// if this item is greater than max
if (m<0 || ap>array[m] || (ap==array[m] && p>m)) {
// make this item be the new max
m = p;
}
}
}
// update current to be the max
c = m;
}
Serial.println(array[c]); /// ment to give me the Kth largest number
delay(1000);
}
在C版本中,我只是跟踪当前和最大索引,因为我总是可以通过查看数组来获取当前值和最大值。