Вопрос про алгоритм нахождения среднего значения группы чисел.

алгоритмы

Само задание.
Напишите алгоритм подсчета среднего значения, или медианы, трех целых чисел. Входные данные для такого алгоритма распадаются на шесть групп; опишите их.


Собственно нам было сказано, пишите на любом языке, котором хотите. Пишу на php.
Хоть убейте, но скажем в простых кодах типа:

<?php
$arr=array(2,5,1);
foreach ($arr as $value)
{
$sum+=$value;
}
$c=count($arr);
echo 'Среднее значение= '.$sum/$c;
?>

или

<?php
$a1=2;
$a2=5;
$a3=1;
$a1=($a1+$a2+$a3)/3;
echo 'Среднее значение= '.$a1;
?>

я не вижу 6 различных классов входных данных.

В общем вопрос, где найти эти 6 классов и как написать код, чтобы эти 6 классов различались и действовали на скорость выполнения кода, т.к. в последующем вопрос идет такой "Какой случай для алгоритма является наилучшим? Наихудшим? Средним? (Если наилучший и наихудший случаи совпадают, то перепишите Ваш алгоритм с простыми условиями, не пользуясь временными переменными, так, чтобы наилучший случай был лучше наихудшего.)"

Я бы не писал сюда, но хоть убейте, не пойму, как можно оптимировать алгоритм или еще чего.
П.С классы - это группы данных. И при постановке этих групп в алгоритм - получается разная скорость выполнения алгоритма. Примерно так, кто не понял, что такое классы.

Примечание:
Может конечно на языке алгоритмов там можно различить, но просто на php не вижу разницы. Разве случаи, когда все данные равны между собой, когда не равны. И скажем зависимость от , так сказать, размера числа. Например будут числа 1 1 1 или 12232 123234 123324. Как то так....

Примечание:
Книжка эта под рукой.
В принципе оттуда знания и черпаю.
адания взято со второй главы. До нее все пробежал мельком, так как читать все не вижу смысла, суть глав ясна.

Примечание:
Только вот дело в том, что при любых входных данных выполняется одинаковое количество действий. Разве что зависит от величины числа, не более.

Примечание:
SashaSural , в принципе тоже возможно.
1. Проверить кратность трем, сократить, сложить, разделить на 3. Но тут уж точно код нагружен, правда если числа не огроменные. Хотя никто не говорил, какой именно алгоритм должен быть.
2. Числа все одинаковы, поэтому среднее не надо искать.
3. Числа разные и не кратны трем, обычное сложение и деление на 3.
Думаю в 4 группу нельзя записать скажем разниу чисел, в плане в одной ситуации число одно-двузначное, в другом трех-стозначное и т.д. Хотя кто их знает. А может и можно, тогда как раз получается 6 групп.
Т.е. что написано 3 штуки, их используем для больших чисел и для маленьких.

Примечание:
Хм, а может и врпавду.
Меня в основном смутило "или" в задании. Про среднее значение тоже сказано, а я так понимаю это разные вещи.
Или программа должна выполнить и то и то? ТОгда бы сказано было "и"

Примечание:
"11. Медиана
Не только среднее арифметическое показывает, где на числовой прямой располагаются числа какого-либо набора. Другим показателем является медиана — число, которое разделяет этот набор на две части, одинаковые по численности. Поясним на примерах, как найти медианы разных наборов чисел."

Выше верно подметили

Еще есть размышления в сторону медианы. Зависимость от чисел, скажем варианты такие
1. 1 2 3
2. 3 2 1
3. 1 1 2
4. 2 1 1
5. 1 2 1
6. 1 1 1
Может быть так? Ведь от сортировки тоже зависит скорость выполнения. Хотя в php есть функция сортировки, вот не знаю, самому сортировать или функцию использовать.

Примечание:
if (($arr[0]=$arr[1]) or ($arr[1]=$arr[2])) хотя такое условие обьединяет два случая
Ответы:
Лень разбираться в коде поэтому отвечу ток на это...
=Какой случай для алгоритма является наилучшим? Наихудшим?=
Основные критерии: скорость схождения (чем меньше тем лучше) и точность (чем выше тем лучше).
Как выбрать тестовые данные, чтобы хорошо протестировать метод? Возможных вариантов входных параметров слишком много, чтобы проверить работу метода на каждом из них (то есть, провести полное тестирование, которое гарантирует отсутствие ошибок). Да это и не нужно, поскольку чаще всего ошибки проявляются сразу на целом классе входных данных. Поэтому достаточно выбрать по одному представителю из каждого такого класса. И принять гипотезу тестирования о том, что если метод правильно работает на одном представителе класса входных данных, то он будет правильно работать и на любом другом наборе входных данных из того же класса. Поэтому такие классы входных данных иногда называют классами эквивалентности. Если тестирование не обнаружит ошибок, то реализацию метода можно считать соответствующей контракту в предположении о том, что принятая гипотеза верна.
Может, делимость на 3?
Основы современных алгоритмов: http://depositfiles.com/ru/files/2505398
Взята ссылка отсюда:
http://www.knigka.info/2007/11/28/osnovy-sovremennykh-algoritmov.html
По-моему, Вы не правильно поняли задание. Медиана трёх чисел - это не среднее арифметическое (которое Вы находите), а то число, которое больше наименьшего и меньше наибольшего. (Например для чисел 1, 2 и 6, среднее арифметическое (1+2+6)/3=3, а медиана равна числу 2). То есть, её надо не считать, а выбирать.
Тогда, наверное, и получатся разные классы. Типа, ситуация когда все числа равны - любое из них медиана, два числа равны - медианы в такой ситуации нет, и т.д.
Одно ясно: нельзя сначала суммировать - чревато ситуацией OVERFLOW, а также потерей значащих цифр (когда сумма окажется близкой к нулю).
Так что берём 1/3 от каждого, и медиана=сумме этих третьих долей.
Возможно, такие "классы эквивалентности" (группы):
1) все 3 близки (равны) нулю;
2) ни одно не близко к нулю (ну, допустим, больше 0,000001 по модулю);
3) одно --=--=--
4) два --=--=--
Насчёт ещё двух "групп" - мыслей нет. Может (исходя из 4 групп) учесть, С КАКОЙ СТОРОНЫ входные три числа близки к нулю... Но тогда групп больше получается:((
Стоп! Всё МОЁ чушь - числа-то ЦЕЛЫЕ!
И действительно, уточните определение медианы:)


16 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.