-
- Можно вообще обойтись без сравнений чисел см. "сортировка подсчетом". :-) - Boвa(16.04.2024 19:26)
- Можно слиянием за 4 сравнения. Boвa(1053 знак., 16.04.2024 19:12)
- Без бранчей int max = a ^ ((a ^ b) & -(a < b)); Но GCC/ICC/ICX/Clang это раскусывает и генерит более быстрый и мелкий код с бранчами либо с conditional mov. - RxTx(13.04.2024 21:41)
- max=0 LordN(131 знак., 13.04.2024 10:33)
- Хранить не только максимальное, но и пред-максимальное. Сравнили с
максимальным, если больше - теперь новое максимальное, а старое
стало пред-макс. А хранить индексы или значения - как удобней. Dingo(312 знак., 13.04.2024 09:42)
- А со старым предмаксимальным пусть Пушкин сравнивает, да? :) - Cкpипaч(13.04.2024 09:46)
- Да. Если инициализировать INT_MIN, то даже если все значения ему
равны, его на выходе и получим. Если нет - на втором же обновлении макси получим корректную ситуацию. Прокрутите происходящее; если найдёте
ситуацию, когда предложенный способ даст сбой - welcome! - Dingo(13.04.2024 09:51)
- Все равно, непонятно. Инициализировали в 0. В ячейках: 3, 2, 1, 1.
После первого сравнения макс=3, предмакс=0. Так как в следующих яч.
меньше, то так всё и остаётся. Как в предмакс попадет 2? - Idler(13.04.2024 12:40)
- Да, ошибка. Спасибо. Скрипач был прав. - Dingo(13.04.2024 12:51)
- Что такое INT_MIN? Значения неизвестны! - Idler(13.04.2024 10:48)
- Файл дефайнов. Я рад, что работает. Использовать дефайн для разрядности вашей переменной. Dingo(33 знак., 13.04.2024 11:43, ссылка)
- Я тащусь, как удав по стекловате. У меня уже всё работает, а вы
продолжаете эту фигню обсуждать. Задачка-то школьного уровня, это у
меня уже маразм. - Idler(13.04.2024 10:47)
- На эту школьную задачку предложили уже 3 решения. Одно из них требует двойного перебора всего массива, есть которое повреждает исходные данные, есть которое требует дополнительную ячейку для результата. Для вас: работает и вам хорошо - пусть работает. А мы тут на вашем примере уже 功夫 кунг-фу показываем друг другу. - Dingo(13.04.2024 11:52)
- Все равно, непонятно. Инициализировали в 0. В ячейках: 3, 2, 1, 1.
После первого сравнения макс=3, предмакс=0. Так как в следующих яч.
меньше, то так всё и остаётся. Как в предмакс попадет 2? - Idler(13.04.2024 12:40)
- Да. Если инициализировать INT_MIN, то даже если все значения ему
равны, его на выходе и получим. Если нет - на втором же обновлении макси получим корректную ситуацию. Прокрутите происходящее; если найдёте
ситуацию, когда предложенный способ даст сбой - welcome! - Dingo(13.04.2024 09:51)
- А со старым предмаксимальным пусть Пушкин сравнивает, да? :) - Cкpипaч(13.04.2024 09:46)
- 1) "Самый быстрый способ" подразумевает как минимум оглашение марки
МК. 2) Погоня за "самым быстрым способом" - это спорт, имеющий
практическую ценность на уровне пинг-понга. Не ноль, но около того.
3) На практике обычно нужен "достаточно быстрый способ". - SciFi(12.04.2024 19:22)
- Да, нужен достаточно быстрый способ. Но при чем тут МК? Достаточно
быстрый - это всегда пропорционально производительности МК, т.е.
некое максимальное число тактов. Если на XMEGA@32MHz прерывание
UART занимает 2.5мкс, то на AT32F@240MHz я, естественно, хочу его
уложить в 350-400нс, и т.д. В среднем получается порядка 25нс на
С-строку. Но попалась библиотечная команда, жравшая 600нс. Пришлось
вынести её из основного рантайма в инициализацию и сохранить
результат в Idler(197 знак., 13.04.2024 11:13)
- Вопросов более не имею. - SciFi(13.04.2024 15:08)
- Самый быстрый способ - вывалить первые (любые) два значения. С вероятностью 8.3% получим желаемое. - Eddy_Em(12.04.2024 20:01)
- Да, нужен достаточно быстрый способ. Но при чем тут МК? Достаточно
быстрый - это всегда пропорционально производительности МК, т.е.
некое максимальное число тактов. Если на XMEGA@32MHz прерывание
UART занимает 2.5мкс, то на AT32F@240MHz я, естественно, хочу его
уложить в 350-400нс, и т.д. В среднем получается порядка 25нс на
С-строку. Но попалась библиотечная команда, жравшая 600нс. Пришлось
вынести её из основного рантайма в инициализацию и сохранить
результат в Idler(197 знак., 13.04.2024 11:13)
- Плюсую тупые сравнения. Это будет быстрей, чем сортировать. - Eddy_Em(12.04.2024 19:12)
- Ну пять сравнений - это ж легко. Находим максимальное - три
сравнения. Из оставшихся трех максимальное - два сравнения. - LightElf(12.04.2024 18:56)
- Не дошло. Плохо у меня с математикой. Как тремя сравнениями найти
максимальное? У трёх сравнений 9 вариантов комбинаций результатов.
Можно проверить (в худшем случае) все 9, но это уже будет 27
сравнений, а потом еще столько же... Не понимаю. - Idler(12.04.2024 19:09)
- Как-то так: LightElf(283 знак., 12.04.2024 19:15)
- Спасибо. Вроде, очевидно, но до меня долго бы доходило. Совсем я старый и тормозной стал... - Idler(12.04.2024 19:36)
- Как-то так: LightElf(283 знак., 12.04.2024 19:15)
- Не дошло. Плохо у меня с математикой. Как тремя сравнениями найти
максимальное? У трёх сравнений 9 вариантов комбинаций результатов.
Можно проверить (в худшем случае) все 9, но это уже будет 27
сравнений, а потом еще столько же... Не понимаю. - Idler(12.04.2024 19:09)
- Всего лишь найти? Самым быстрым способом разместить в
регистрах-переменных, сравнивая регистры-переменные между собой.
Закон малых чисел, прямые алгоритмы работают быстрее чем более
сложные. - RxTx(12.04.2024 18:55)
- Похоже, мне серьезно лечиться пора. Забыл само понятие промежуточного результата и, соответственно, весь класс итерационных задач/вычислений... Вроде, 60 не так много, но вот... - Idler(13.04.2024 11:59)
- Сравнить не проблема, дальше что? Я не понимаю, как из результатов отдельных сравнений получить максимальное... - Idler(12.04.2024 19:11)