6 способов найти максимальное значение в C++


Этот код является частью проекта Н-способов получить код для одной конкретной задачи. В данном случае, этот код на C++ состоит из 6 различных функций возвращает максимальное значение из множества действительных чисел. В основном используют for-петли и while-петля, последняя функция используется рекурсивный метод. Объяснение других 5 функции включены в код. Я хотел бы знать, как улучшить код.


// Author : anbarief@live.com
// Since 10 March 2018

#include <iostream>
#include <string>


float max_1(float x[], int sizex){
    float max = x[0];
    for (int index=0; index < sizex; index++){
        if (x[index] >= max) {
        max = x[index];
        }
    }
    return max;
}

float max_2(float x[], int sizex){
    float max;
    for (int index=0; index < sizex; index++){
        if (x[index+1] >= x[index]) {
        max = x[index+1];
        }
        else {
        max = x[index];
        }
        x[index+1]=max;
    }
    return max;
}

float max_3(float x[], int sizex){
    float max = x[0];
    int index=0; 
    while (index < sizex)
    {
        if (x[index] >= max) {
        max = x[index];
        }
        index = index+1;
    }
    return max;
}

float max_4(float x[], int sizex){
    float max, maxx, maxxx;

    if (x[0] >= x[sizex-1]){
        max = x[0];
    }
    else{
        max = x[sizex-1];
    };

    for (int index=1; index < sizex; index++){

        if (x[sizex-index] >= x[index]) {
        maxx = x[sizex-index];
        }
        else {
        maxx = x[index];
        }

        if (maxx >= max){
            maxxx = maxx;
        }
        else{
            maxxx = max;
        }

        max = maxx;

    }
    return maxxx;
}

float max_5(float x[], int sizex){
    float max, maxx, maxxx;

    if (x[0] >= x[sizex-1]){
        max = x[0];
    }
    else{
        max = x[sizex-1];
    };

    int index = 1;

    while(index < sizex){

        if (x[sizex-index] >= x[index]) {
        maxx = x[sizex-index];
        }
        else {
        maxx = x[index];
        }

        if (maxx >= max){
            maxxx = maxx;
        }
        else{
            maxxx = max;
        }

        max = maxx;

        index=index+1;
    }
    return maxxx;
}

float max_6(float x[], int sizex){

    float max;

    if (x[sizex]>=x[sizex-1]){
        max=x[sizex];
    } 
    else{
        max=x[sizex-1];
    };

    if (sizex == 1){
    return max;
    };

    x[sizex-1] = max;

    return max_6(x, sizex-1);
}


int main(){

    float data[] {1, 1, 2, -2, -2233, -112.3, 3, 3, 3, 4.123, 1, 44.234, 2.0013, 3, 5, 5, 6, 6, 3, 56, 112, 112, 112.3, 12, 3};
    const int n = sizeof(data)/sizeof(*data);

    std::string ex_1 = "max_1 : Comparing per-element in a for-loop to get the maximum val.";
    std::cout << '\n' << ex_1;
    std::cout << '\n' << max_1(data, n);

    std::string ex_2 = "max_2 : Comparing two adjacent elements of the data in a for-loop to get the maximum val.";
    std::cout << '\n' << ex_2;
    std::cout << '\n' << max_2(data, n);

    std::string ex_3 = "max_3 : Similar as max_1, but using while-loop";
    std::cout << '\n' << ex_3;
    std::cout << '\n' << max_3(data, n);

    std::string ex_4 = "max_4 : Comparing end-to-end elements of the data in a for-loop to get the maximum.";
    std::cout << '\n' << ex_4;
    std::cout << '\n' << max_4(data, n);

    std::string ex_5 = "max_5 : Similar as max_4, but using while-loop.";
    std::cout << '\n' << ex_5;
    std::cout << '\n' << max_5(data, n);

    std::string ex_6 = "max_6 : Using a recursive method to find the maximum.";
    std::cout << '\n' << ex_6;
    std::cout << '\n' << max_6(data, n);

    return 0;
}

Редактирование: 4-й и 5-й функции должны быть отредактированы как

float max_4(float x[], int sizex){
        float max, maxx, maxxx;

        if (x[0] >= x[sizex-1]){
            max = x[0];
        }
        else{
            max = x[sizex-1];
        };

        for (int index=1; index < sizex-1; index++){

            if (x[sizex-index-1] >= x[index]) {
            maxx = x[sizex-index-1];
            }
            else {
            maxx = x[index];
            }

            if (maxx >= max){
                maxxx = maxx;
            }
            else{
                maxxx = max;
            }

            max = maxx;

        }
        return maxxx;
    }

   float max_5(float x[], int sizex){
        float max, maxx, maxxx;

        if (x[0] >= x[sizex-1]){
            max = x[0];
        }
        else{
            max = x[sizex-1];
        };

        int index = 1;

        while(index < sizex-1){

            if (x[sizex-index-1] >= x[index]) {
            maxx = x[sizex-index-1];
            }
            else {
            maxx = x[index];
            }

            if (maxx >= max){
                maxxx = maxx;
            }
            else{
                maxxx = max;
            }

            max = maxx;

            index=index+1;
        }
        return maxxx;
    }


845
5
задан 10 марта 2018 в 04:03 Источник Поделиться
Комментарии
2 ответа

Отступ несовместимы, и могут быть исправлены для улучшения видимости.

Ни одна из ваших функций обработки пустой массив (sizex == 0) правильно.

max_2 обращается за конец x массив, в результате чего неопределенное поведение. Он также имеет (вероятно, нежелательный) побочный эффект удалив этот массив (в том числе первого проплывают в конце), так что последующие тесты с data массив не работают с исходными данными.

max_4 и max_5 делать двойную работу им нужно. Поскольку они сравнивают элементы с обоих концов массива внутрь, они могут остановиться, как только они обрабатывают средние элементы.

max_6 обращается мимо конца массива, и влияет на исходный массив.

Я не уверен, что вы пытаетесь достичь здесь. Все 6 методов в принципе все то же самое - посмотрите на каждый элемент, чтобы найти самый большой и прямой способ ходьбы массива в max_1 превосходит другие (кроме max_3, который является другим способом сказать то же самое), которые являются слишком сложными.

10
ответ дан 10 марта 2018 в 05:03 Источник Поделиться

Я думаю, что это отличная идея. Это может быть очень полезно знать больше чем один способ сделать то же самое, и когда я был новичком, я часто не имел возможности сказать, какой из этих методов лучше, чем другой, или если моя первоначальная идея была вообще возможна. Вот несколько способов, вы могли бы улучшить его:

В C++

Там нет ничего про этот код, относящийся к C++ и другие, чем напечатать заявления. Если вы хотите сделать это в C++, вы должны использовать C++ типы данных и алгоритмов. Я бы такими быть std::array<float, n> или std::vector.

Как только вы сделали это, вы можете использовать указатели, итераторы, или выбор на основе циклов для перебора контейнера и найти максимальный элемент. Вы можете также использовать стандартные библиотеки std::max_element(). Было бы неплохо показать, как это сделать, а также с использованием лямбда-выражений.

Вы могли бы также изучить сортировка с std::sort(). Один (не очень эффективный) способ получения Макс-отсортировать массив и вывести последний элемент. Это не эффективно, только получив максимум, но это могут сделать другие операции на массив более эффективным.

Именования

Имена ваших функций не скажу, что они делают. Описания печати не сразу загорается это для меня. Я бы назвал max_6() для recursive_max() например. max_1() может быть linear_search(). Я честно не знаю, как назвать некоторые из других, так как они не делают для меня много смысла.

Имена переменных в порядке (хоть и не большую) для большинства функций, за исключением max_4() и max_5(). Я читал его десятки раз и не могу понять, в чем разница между max, maxx и maxxx.

Ленитесь

Это звучит странно сказать, вслух, но вы должны стремиться к тому, чтобы ваши программы делать как можно меньше работы. Это экономит время пользователя и часто экономит электричество так как их процессоры не нужны, чтобы запустить полную скорость, чтобы включить вентиляторы. (Это становится реальной проблемой на мобильных устройствах, которые не имеют вентиляторов.)

Я поднимаю этот вопрос, потому что я замечаю свои функции делать дополнительную работу. Например, max_1() устанавливает max переменную в 0- й элемент, то он начинает цикл index = 0 проверка max против ценности он уже содержится. Он должен начинаться на 1, а не.

Модус Операнди

Я должен признать, что я не вижу смысла max_2() или max_4(). Они не кажутся очень реалистичными способы нахождения максимума. Они делают слишком много работы.

5
ответ дан 10 марта 2018 в 09:03 Источник Поделиться