Получить второе наибольшее число в массиве пары значений ключей с определенным расстоянием - PullRequest
0 голосов
/ 09 мая 2018
  • Я работаю над проектом, который отображает точки роста на шее.

  • Используя Arduino и датчик Холла, я отображаю точки сопротивления в разных местах.

  • я отображаю в HashMap мои очки (points [stepper_motor_location] [сопротивление])
  • Мне нужно найти среднюю точку (связка Cricothyriod)
  • Я знаю, как получить верхнюю точку (хрящ щитовидной железы), получая максимальное сопротивление во всех местах.
  • но я не знаю, как получить нижнюю точку (Cricoid Cartilage), которая является второй самой высокой вершиной, но на значительном расстоянии от первой самой высокой вершины.

Итак, вопрос:

Как вы получаете 2-е наивысшее сопротивление в пунктах [местоположение] [сопротивление] с разницей в 2-10 от местоположения наивысшего сопротивления?

C, C ++, Arduino или псевдокод, я искренне не против.


Вот мой код:

/* ###### VARIABLE ######## */
 /*  */
found bool = false; /* while our point is not found, FOUND IS FALSE */
resistance int []; /* resistance vector */
location int []; /* Motor location vector */
current_location int = 0; /* 0 which means the top part of the motor container */
current_resistance int; /* the resistance which the Hall Sensor registers at that moment */
points HashMap; /* HashMap with location as key and resistance at its location as value */
min_distance int = 50; /* value for the minimum distante between the highest point and the second highest point (Variable to be modified as we test more) */

/* ######## FUNCTIONS ######### */
 /*  */
move_check()
{
    location.push(current_location);
    current_resistance = GET_CURRENT_RESISTANCE;
    resistance.push(current_resistance);
    MOVE_MOTOR++;
    location++;
}

map_points()
{
    for(;location <= MAX_DISTANCE;) /* WE SET THE MAX_DISTANCE TO WHAT WE MEASURED BEFORE AS MAX DISTANCE */
    {
        move_check();
        RED_LED = 1;
        RED_LED = 0; /* TO SEE THAT IS MAPPING POINTS */
        }
    }
    CreateHashMap (points, location, resistance, MAX_DISTANCE); /* (VARIABLE_NAME , int, int, NUMBER_OF_ITEMS) */
}

get_top() /* gets the thryoid Cartilage location */
{
    maximum int = 0;
    max_location int = 0;
    for(int i = 0; i<= location.length(); i++)
    {
        if(maximum > max(points[i], maximum))
        {
            maximum = max(points[i], maximum);
        }
        else
        {
            maximum = max(points[i], maximum);
            max_location = i;
        }
    }
    return max_location;
}

get_bottom() /* gets the cricoid cartilage location*/
{
    bottom_point int;
    ??????????????????????????????
    return bottom_point;
}

goto_middle_point()
{
    RED_LED = 1;
    while(location != floor((get_top() + get_bottom()) / 2))
    {
        location--;
    }
    RED_LED = 0;
    BEEP_SPEAKER_LONG;
}

wait_button_press()
{
    resistance_now int = GET_CURRENT_RESISTANCE;
    while(resistance_now != GET_CURRENT_RESISTANCE)
    {
        RED_LED = 1;
        RED_LED = 0;
    }
    SLEEP(1000);
    found = true;
}

done(bool found)
{
    if(found)
    {
        while(location)/*  if location is 0 == false (top location) */
        {
            location--;
            MOVE_MOTOR--;
        }
    }
    BEEP_SPEAKER;
    BEEP_SPEAKER; /* beep speaker twice for done */
    RED_LED = 0; /* stops working */
    GREEN_LED = 1; /* signal for ready */
}

int main()
{
    map_points();
    goto_middle_point();
    wait_button_press();
    done();
    return 0;
}

1 Ответ

0 голосов
/ 09 мая 2018

Я не знаю, какую реализацию Arduino HashMap вы используете, но если это эта , это лучшее, что я могу придумать, учитывая API. Это, конечно, не оптимально, и лучшая структура данных будет быстрее.

Если я правильно понял проблему, я бы просто выполнил линейный поиск. Вы знаете, как получить высшую точку. Вы знаете, что местоположение второй наивысшей точки должно быть ниже самой высокой. (Я добавляю здесь, вам может понадобиться вычесть, если ваша система координат отличается). Предположим, что минимальная разница в позициях должна быть min_dist (некоторое значение 2-10).

HashMap<int, int, N> points = ...;
int key_low = upper_position + min_dist;
int peak_location = -1;
for(int i=0; i < points.size(); ++i)
{ 
    int location = points.keyAt(i);
    if (location < key_low) continue;
    int resistance = points[location];
    if (peak_location < 0 || resistance > points[peak_location])
    {
        peak_location = location; 
    }
}
...