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

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

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

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

upd:
Без привязки к языку. PHP, просто как пример взял. Интересует сам алгоритм.
• Вопрос задан
• 2419 просмотров
Решения вопроса 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)``````
Ответ написан
``````\$max = \$arr;
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
Ответ написан
Если интересуетесь именно алгоритмом, то вот отсюда :
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.]
Ответ написан
Можно с битовыми операциями, в расчёте на 32-битную архитектуру:

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

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

Похожие вопросы
от 50 000 до 70 000 ₽
Цифроград Ставрополь
от 60 000 ₽
от 130 000 до 150 000 ₽
29 мая 2023, в 09:18
30000 руб./за проект
29 мая 2023, в 08:59
500 руб./за проект
29 мая 2023, в 08:57
20000 руб./за проект