?

Log in

No account? Create an account

Детская задачка для программистов - Ваши рубидии уже у кобальта во ртути

Jul. 8th, 2013

01:18 pm - Детская задачка для программистов

Previous Entry Share Next Entry

Или программистская для детей.

Дан список времен суток в формате HH:MM, от 00:00 до 23:59. Эти времена суть замеры момента, когда происходит некоторое событие или совершается некоторое действие.

1. Найти среднее арифметическое время события/действия.
2. Ну и медианное тоже, раз такое дело.

Comments:

[User Picture]
From:vgramagin
Date:July 8th, 2013 08:35 pm (UTC)
(Link)
Ну самое очевидное - перевести все в минуты, сложить, поделить и перевести обратно в часы

А почему именно эта задача?
(Reply) (Thread)
From:saccovanzetti
Date:July 8th, 2013 08:39 pm (UTC)
(Link)
можно и не умножать - все равно потом складывать и делить.
(Reply) (Parent) (Thread) (Expand)
[User Picture]
From:janatem
Date:July 8th, 2013 08:39 pm (UTC)
(Link)
Как определяется среднее арифметическое для кольца общего вида? По крайней мере, на котором дополнительно не задано отношение порядка.
(Reply) (Thread)
[User Picture]
From:spamsink
Date:July 8th, 2013 08:44 pm (UTC)
(Link)
Правильный вопрос; в этом и заключается задача, чтобы определить его разумным образом. Для удобства предположим, что моменты в списке находятся в общем положении, и вопросов типа "сколько будет среднее арифметическое между полуднем и полуночью", или "между полуднем, 4 утра и 8 вечера", не возникнет.
(Reply) (Parent) (Thread) (Expand)
[User Picture]
From:occam_aga
Date:July 8th, 2013 08:43 pm (UTC)
(Link)
var ticks = new[] { "00:00", "23:59", "01:59", "10:00" }.Select(s => TimeSpan.Parse(s).Ticks).Average();
var average = TimeSpan.FromTicks((long)ticks);

Только какой в этом смысл?

Что нужно узнать?
(Reply) (Thread)
[User Picture]
From:spamsink
Date:July 8th, 2013 08:45 pm (UTC)
(Link)
Смысла в этом никакого, если не описать алгоритм, реализованный в методе Average.
(Reply) (Parent) (Thread) (Expand)
[User Picture]
From:excubitus
Date:July 8th, 2013 08:48 pm (UTC)
(Link)
Перевести в часы с плавающей точкой, вычесть 12, найти среднее арифметическое, прибавить 12, перевести в часы с минутами.
(Reply) (Thread)
[User Picture]
From:spamsink
Date:July 8th, 2013 08:49 pm (UTC)
(Link)
Откуда вдруг магическое число 12?
(Reply) (Parent) (Thread) (Expand)
[User Picture]
From:kcmamu
Date:July 8th, 2013 09:01 pm (UTC)
(Link)
Имеешь в виду, что надо искать центр тяжести точек на окружности?
(Reply) (Thread)
[User Picture]
From:spamsink
Date:July 8th, 2013 09:03 pm (UTC)
(Link)
Ага. Но как это делать, народ пока не догадался. :)



Edited at 2013-07-09 12:00 am (UTC)
(Reply) (Parent) (Thread) (Expand)
[User Picture]
From:stas
Date:July 8th, 2013 11:03 pm (UTC)
(Link)
А перевести всё в минуты и сложить по модулю 1440 не покатит? Ну и потом, конечно, поделить соответственно.
(Reply) (Thread)
[User Picture]
From:spamsink
Date:July 8th, 2013 11:17 pm (UTC)
(Link)
Когда значения вокруг полуночи, хочется видеть среднее около полуночи, а не около полудня.
(Reply) (Parent) (Thread) (Expand)
From:qehgt
Date:July 9th, 2013 01:42 am (UTC)
(Link)
Времена надо рассматривать как единичные векторы с направлением от 0 (00:00) до 2*pi (24:00). После этого задача становится тривиальной.

Edited at 2013-07-09 01:43 am (UTC)
(Reply) (Thread)
[User Picture]
From:spamsink
Date:July 9th, 2013 01:54 am (UTC)
(Link)
Тогда см. выше. Среднее от 0, 2 и 10 часов получается 3, а хочется 4.
(Reply) (Parent) (Thread) (Expand)
[User Picture]
From:larisaka
Date:July 9th, 2013 01:42 am (UTC)
(Link)
Среднее арифметическое можно вычислить для результатов измерений. Измеряем мы что? Время от начала каждых суток до события? Тогда все так и получается, среднее между 00:01 и 23:59 - полдень примерно.
Но в вашей задаче, похоже, требуется не среднее арифметическое измерить, а типа распределение проанализировать. Тогда работаем с распределением. делим на часы или 0-1, 1-2, 2-3 и так далее. Или 11 - 1, 1-3 и т.д. Или по минутам. Суммируем по интервалам. Строим график, лучше круглый - не знаю, как называется, не торт, а как амеба такой.

Edited at 2013-07-09 01:44 am (UTC)
(Reply) (Thread)
[User Picture]
From:spamsink
Date:July 9th, 2013 01:54 am (UTC)
(Link)
В моей задаче требуется найти центроид на окружности.
(Reply) (Parent) (Thread)
[User Picture]
From:phoonzang
Date:July 9th, 2013 09:08 am (UTC)
(Link)
http://en.wikipedia.org/wiki/Directional_statistics

среднее считается как аргумент усредненного e^{i \phi_i}
(Reply) (Thread)
[User Picture]
From:phoonzang
Date:July 9th, 2013 09:09 am (UTC)
(Link)
а как считать медиану - надо сперва спросить автора задачи, как она определяется для циклических переменных
(Reply) (Parent) (Thread)
[User Picture]
From:beldmit
Date:July 9th, 2013 10:00 pm (UTC)

Как-то так

(Link)
1. Перевести в абсолютное время.
2. Вычислить среднее арифметическое.
3. Прибавить 12 часов к каждой точке, вычислить среднее арифметическое, вычесть 12 часов.
4. Если совпали, то на этом остановились.
5. Если не совпали, то сравниваем среднеквадратичное отклонение для полученных чисел.
6. Если оно одинаковое, то берем наименьшее число из полученных на шагах 3-4.
7. Если оно разное, то берем тот момент, для которого отклонение меньше.
(Reply) (Thread)
[User Picture]
From:spamsink
Date:July 9th, 2013 10:06 pm (UTC)

Re: Как-то так

(Link)
01:00, 23:00 - среднее 12:00.
13:00, 11:00 - среднее 12:00.

Совпали, остановились.


(Reply) (Parent) (Thread) (Expand)
[User Picture]
From:efix
Date:October 28th, 2013 01:55 pm (UTC)
(Link)
А вот такой вариант:
1) переводим время, допустим, в величину угла.
2) делим окружность на две части: от 0° до 180° (верх) и от 180° до 0° (низ)
3) значения в нижней части умножаем на -1
4) считаем среднее как обычно, получаем средний градус
5) переводим градус назад во время
(Reply) (Thread)
[User Picture]
From:spamsink
Date:October 28th, 2013 03:35 pm (UTC)
(Link)
Результаты будут зависеть от способа деления окружности на две части.
(Reply) (Parent) (Thread)