Задать вопрос
littleguga
@littleguga
Не стыдно не знать, а стыдно не интересоваться.

Как найти максимальное значение без ?/switch/if?

В голову пока пришло решение только с циклами.
Вот пример:
$arr = [1,2,3,4,5,6,98,65,190];
$max = $arr[0];
foreach($arr as $val){
     while($val > $max){
          $max = $val;
           break;
     }
}


Может есть более красивые решения?

upd:
Без привязки к языку. PHP, просто как пример взял. Интересует сам алгоритм.
  • Вопрос задан
  • 2724 просмотра
Подписаться 2 Оценить 2 комментария
Решения вопроса 6
@Alexander1705
Можно написать функцию max без использования условных операторов:

def max_(a, b):
    return (a + b + abs(a-b)) / 2;

m = 0
arr = [1, 2, 3, 4, 5, 6, 98, 65, 190]
for val in arr:
    m = max_(m, val)

print(m)
Ответ написан
BuriK666
@BuriK666
Компьютерный псих
$max = $arr[0];
foreach($arr as $val){
     $max = max($max, $val);
}
Ответ написан
@dmitryKovalskiy
программист средней руки
stackoverflow.com/questions/5846156/get-min-and-ma... Вот тут что-то похожее решают.
Ответ написан
@alexxandr
you'll see in memory only 0xDEADFACE
max(a, b) = (a > b)*a + (a < b)*b

при FALSE = 0; TRUE = 1
Ответ написан
Комментировать
Vestail
@Vestail
Software Engineer
Если интересуетесь именно алгоритмом, то вот отсюда :
Min and max. Given an array of N elements, find the min and max using as few compares as possible. Brute force: find the max (N-1 compares), then find the min of the remaining elements (N-2 compares).
Solution 1. Divide and conquer: find min and max in each half (2T(N/2) compares), return min of 2 and max of 2 (2 compares). T(1) = 0, T(2) = 1, T(N) = 2T(N/2) + 2. Recurrence solution: T(N) = ceil(3N/2) - 2.
Solution 2. Divide the elements into pairs and compare two elements in each pair. Put the smallest elements in A and the largest in B. If n is odd, put element n in both A and B. This requires floor(n/2) comparisons. Now directly compute the minimum in A (ceil(n/2) - 1 comparisons) and the maximum in B (ceil(N/2) - 1) comparisons. [In fact, this is best possible.]
Ответ написан
Mrrl
@Mrrl
Заводчик кардиганов
Можно с битовыми операциями, в расчёте на 32-битную архитектуру:

var arr=new int[]{1,2,3,4,5,6,98,65,190};
    int max=arr[0];
    foreach(int x in arr){
        int y=max-x;
        max-=y&(y>>31);
    }
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@FoxInSox
Какой еще алгоритм? Операции ветвления это базовый элемент языка программирования. В вашем вопросе заложено использование по умолчанию оператора ветвления. И в приведенном вами случае while это лишь частный случай if.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы