2015-09-17 3 views
-1

Какой лучший способ, чтобы написать программу, чтобы найти максимум 4 no.s в C/C++:Какой из лучших способов найти максимум no.s?

  1. с помощью пятой переменной & сравнивая его ко всем входам
  2. используя функцию
  3. макс()
  4. и сравнение входов с использованием, если

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

Будет ли такой же алгоритмический подход по-прежнему лучшим в случае более чем четырех переменных?

+2

Если вы знаете, что это четыре входа, наименьшее количество сравнений - 'max (max (a, b), max (c, d))'. – rlbond

+0

сравнения будут немногочисленными, но не будет ли многократно повторяться в терминах функции max() многократно? – dj1

+0

@ rlbond: Да? 'max (a, max (b, max (c, d)))' имеет такое же количество сравнений. Он имеет более длинную цепочку зависимостей. – EOF

ответ

2

Для большого числа элементов, стандартная библиотека имеет std::max_element алгоритм, который делает max(N-1, 0) сравнения для N элементов, его теоретический минимум , даже для 4 элементов.

На практике он охватывает все элементы, как и ваш метод 1., но он мог бы выполнить «турнир по ликвидации» вложенных max, если N - это сила 2 (ваш метод 2). Некоторый оптимизирующий компилятор может даже развернуть цикл и создать сложную цепочку операторов if (ваш метод 3).

В комментариях решение стиля C++ 11 max({a,b,c,d}) было предоставлено @NathanOliver (которое работает только в constexpr контекстах). Но в C++ 1z std::max_element также станет constexpr, так что это будет полностью общее решение, маленькое или большое, время выполнения или время компиляции.

TL; DR: не переусердствуйте, используйте стандартную библиотеку, которая обеспечивает минимально необходимый объем работы.

0

Лучше потерять терпение. Как указано в комментариях

max(max(a,b), max(c,d)); 

очень краткий, однако есть 3 вызова функций. Это немного быстрее, код мудрый, но гораздо больше кодирования, чтобы написать что-то вроде:

if (a>b) 
{ 
    if (a>c) 
    { 
    if (a>d) 
    { 
     return (a); 
    } 
    } 
} 

if (b>a) 
{ 
    if (b>c) 
    { 
    if (b>d) 
    { 
     return (b); 
    } 
    } 
} 
if (c>a) 
{ 
    if (c>b) 
    { 
    if (c>d) 
    { 
     return (c); 
    } 
    } 
} 

if (d>a) 
{ 
    if (d>b) 
    { 
    if (d>c) 
    { 
     return (d); 
    } 
    } 
} 
+1

' std :: max ({a, b, c, d}) ' – NathanOliver

+2

' max' обычно реализуется как макрос, и даже если это не так, он, вероятно, встроен современными компиляторами. – EOF

+0

Этот код может делать более чем в два раза больше сравнений, чем 'std :: max', и для некоторых значений этот код не будет доступен ни одному из операторов' return'. Просто используйте 'std :: max', если профилирование не показывает, что это узкое место (и, вероятно, это не так). – Blastfurnace