Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Определить максимальный элемент массива 
:(
    Опции темы
BftS
Дата 25.11.2009, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 2.10.2009

Репутация: нет
Всего: нет



Как можно определить позицию максимального элемента массива? 
Элементы - целые числа, могут быть отрицательными.

Код

int getMaxElement(int M[], int N)
{
    int maxid=0;
    for(int i=0 ; i<N; i++)
    {
        if(M[i]>=M[maxid])maxid=i;
    }
    return maxid;
}

Как бы все просто. Но.
Если до этого максимально знаечение определялось, мы должны выбрать следующее за ним наибольшее значение
Т.е. если массив 0,1,2 , то в первый раз мы получаем 2, потом 1, а потом 0.
По идеи все тоже легко, просто добавить в if условие M[i]<LAST_MAX 
Но, как мы получим изначально LAST_MAX. Оно должно быть необычайно огромным, что бы не обрезать ни один элемент.

Вроде звучить легко, но добиться от себя решения не могу...
PM MAIL   Вверх
mes
Дата 25.11.2009, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(BftS @  25.11.2009,  18:09 Найти цитируемый пост)
Но, как мы получим изначально LAST_MAX. Оно должно быть необычайно огромным, что бы не обрезать ни один элемент.

гораздо проще - берите значение первого (с индексом 0) элемента...

 Только не забывайте перед началом проверить что массив не пустой, ну и придумать как вести себя в противной ситуации. smile


Это сообщение отредактировал(а) mes - 25.11.2009, 19:47


--------------------
PM MAIL WWW   Вверх
Abyx
Дата 25.11.2009, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 601
Регистрация: 3.11.2009

Репутация: 1
Всего: 10



Код

int getMaxElement(int M[], int N)
{
    int maxid=0;
    int max=INT_MIN;
    for(int i=0 ; i<N; ++i)
        if(M[i]>max)
        {
             maxid=i;
             max=M[i];
        }
    return maxid;
}

PM MAIL   Вверх
BftS
Дата 25.11.2009, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 2.10.2009

Репутация: нет
Всего: нет



Цитата(mes @ 25.11.2009,  19:40)
Цитата(BftS @  25.11.2009,  18:09 Найти цитируемый пост)
Но, как мы получим изначально LAST_MAX. Оно должно быть необычайно огромным, что бы не обрезать ни один элемент.

гораздо проще - берите значение первого (с индексом 0) элемента...

 Только не забывайте перед началом проверить что массив не пустой, ну и придумать как вести себя в противной ситуации. smile

А что будет, если первый элемент больше третьего ? ))
PM MAIL   Вверх
Abyx
Дата 25.11.2009, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 601
Регистрация: 3.11.2009

Репутация: 1
Всего: 10



BftS, тогда он максимальный %)
PM MAIL   Вверх
powerfox
Дата 25.11.2009, 19:55 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 2
Всего: 97



Цитата(Abyx @  25.11.2009,  20:41 Найти цитируемый пост)
    int max=INT_MIN;

Зачем лишняя переменная, если индекс и так сохраняем?


--------------------
user posted image
PM WWW   Вверх
Abyx
Дата 25.11.2009, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 601
Регистрация: 3.11.2009

Репутация: 1
Всего: 10



powerfox, так оптимальнее.

Добавлено через 7 минут и 1 секунду
вообще, надо наверное написать как-то так

Код

int getMaxElement(int M[], int N)
{
    if( N==0 )
        return -1;

    int* pmax=M;
    int max=*pmax;
    for(int* it=M+1, e=M+N ; it<e; ++it)
        if( *it>max )
        {
             max=*it;
             pmax=it;
        }

    return pmax-M;
}


Добавлено через 11 минут и 37 секунд
Цитата(powerfox @  25.11.2009,  19:55 Найти цитируемый пост)
лишняя переменная

лишняя - в смысле объема исходного кода?
PM MAIL   Вверх
mes
Дата 25.11.2009, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Abyx @  25.11.2009,  18:58 Найти цитируемый пост)
лишняя - в смысле объема исходного кода? 

нет..  в смысле ухудшения читабельности и нагружения логики..

Добавлено @ 20:15
Цитата(Abyx @  25.11.2009,  18:58 Найти цитируемый пост)
вообще, надо наверное написать как-то так


имхо, тогда надо довести идею с "итераторами" до  конца :
Код


int * max_in_range (int * begin, int * end)
{
     int * max = begin;
     for (int *p=begin; p != end; ++p)
            if (*p > *max) max = p;

     return max;
}


Это сообщение отредактировал(а) mes - 25.11.2009, 20:17


--------------------
PM MAIL WWW   Вверх
unicuum
Дата 27.11.2009, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 16.3.2005
Где: Рашка

Репутация: 1
Всего: 8



Монстр какой-то получается smile да здравствует китайский код:

Код

#include <iostream>

using namespace std;

// Получить индекс с наибольшим значением
int getIndexMax(const int* const array, const unsigned int& size)
{
    unsigned int maxIndex;
    unsigned int index = 0;
    if (size > 0) maxIndex = index;
    else return -1;
    for(index = 1; index < size; index++)
        if (array[maxIndex] < array[index])
            maxIndex = index;
    return maxIndex;
}

void writeIndex(const int* const array, const unsigned int& size)
{
    cout << size << endl;
    cout << "Индекс с наибольшим значением: " << getIndexMax(array, size) << endl;
}

int main()
{
    int array0[] = {};
    int array1[] = {3};
    int array2[] = {7, 23};
    int array3[] = {15, 30, 70, 91};

    writeIndex(array0, sizeof(array0) / sizeof(int));
    writeIndex(array1, sizeof(array1) / sizeof(int));
    writeIndex(array2, sizeof(array2) / sizeof(int));
    writeIndex(array3, sizeof(array3) / sizeof(int));

    return 0;
}


Вывод:
Код

0
Индекс с наибольшим значением: -1
1
Индекс с наибольшим значением: 0
2
Индекс с наибольшим значением: 1
4
Индекс с наибольшим значением: 3




--------------------
user posted image
обычный день на винграде
PM   Вверх
Earnest
Дата 27.11.2009, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Если нужно последовательно получать максимальные значения, еще не использовавшиеся, то не проще ли один раз отсортировать массив? Или отсортировать индексы, если трогать сам массив нельзя. Общая производительность будет выше (т.к. вместо последовательный линийных поисков мы можем один раз сделать квик-сорт и свести дело к N log N)? да и как-то элегантне это...

Добавлено через 1 минуту и 58 секунд
Кроме того, если нужно получить не весь ряд "максимальных" значений, а только какую-то часть, можно ипользовать partial_sort.


--------------------
...
PM   Вверх
unicuum
Дата 28.11.2009, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 16.3.2005
Где: Рашка

Репутация: 1
Всего: 8



Цитата(Earnest @  27.11.2009,  18:55 Найти цитируемый пост)
Если нужно последовательно получать максимальные значения, еще не использовавшиеся, то не проще ли один раз отсортировать массив? Или отсортировать индексы, если трогать сам массив нельзя

Для задачи автора топика так и надо делать. То есть задача сначала сформулирована в получении одного наибольшего элемента. Но внизу есть пояснение, что на самом деле надо получать индексы массива в порядке убывания значений на которые они ссылаются.


--------------------
user posted image
обычный день на винграде
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0551 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.