[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Математическая задачка
dima4321
всем привет ХХХХЛОПЦЫ ))

Планируется, что в базу будут попадать цифры.

Простой пример


3
6
2
8
11

3
5
9
15
8
1




Можно ли создать условие, чтобы засечь максимальное движение цифр в одну сторону на убывание или наооброт на восхождение.

т.е. идея тренда


Например мне нужно четкое движение в одну строну более чем на 9 едениц.

Я выделил жирным.

Как создать условие ??


Буду рад любым советам и идеям.)



Спустя 1 час, 5 минут, 34 секунды (26.03.2011 - 17:59) panacea написал(а):
Распределение Гаусса чтоли?

Спустя 2 часа, 14 минут, 28 секунд (26.03.2011 - 20:13) dima4321 написал(а):
panacea

Да хрен знает как это называется.))

Нужно определение тренда

Спустя 16 минут, 18 секунд (26.03.2011 - 20:29) Trianon написал(а):
чем 3 5 9 15 не подошло?

Спустя 2 часа, 37 минут, 37 секунд (26.03.2011 - 23:07) dima4321 написал(а):
Trianon

Подошло )) Спасибо не заметил.

Есть идеи как реализовать

Чтобы было понятней:

2 6 14 ---это подьем вверх на 12 едениц (14-2=12)

1 3 5 7 это подъем вверх на 6 едениц (7-1=6)


вот набор 1- 3 -8-2 -16 -5- 7 -25-23-20-22

Здесь самый лучший восходящий тренд 5-7-25 ( берем крайние точки и получаем 25-5=20)



Т.е. мне нужен скрипт который будет ловить например 10 едениц 


2-8-12-3-1-6-16

подходят эти тренды

2-8-12

6-16

Спустя 55 минут, 18 секунд (27.03.2011 - 00:02) panacea написал(а):
Ну и вычитай $arr[$a]-$arr[$b]
где $b=$a-10

Спустя 43 минуты, 41 секунда (27.03.2011 - 00:46) Trianon написал(а):
а в ряду 1 3 5 5 5 7 3 1
Что должно найти?

Спустя 9 часов, 54 минуты, 54 секунды (27.03.2011 - 09:41) dima4321 написал(а):
Trianon


1 3 5 5 5 7---восходящий тренд на 6 единиц вверх

если бы искали еще и нисходящий тренд то в твоем примере подходит

7 3 1 низходящий тренд на 6 едениц

Жду предложений как и что в какую сторону копать

panacea не совсем тебя понял. Можно чуть подробней ))??





Спустя 54 минуты, 19 секунд (27.03.2011 - 10:35) quickxyan написал(а):
Цитата (dima4321 @ 26.03.2011 - 20:07)
Т.е. мне нужен скрипт который будет ловить например 10 едениц


2-8-12-3-1-6-16

подходят эти тренды

2-8-12

6-16


а почему 6-16, а не 1-6-16 - если я правильно понял логику!

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

Спустя 5 минут, 48 секунд (27.03.2011 - 10:41) kirik написал(а):
Задача интересна :)
вот моё "индорешение" для восходящих
// $ns = array(1,3,1,3,4,5,7,2,6,2);
// $ns = array(2,8,12,3,1,6,16);

$ns = array(1,3,8,2,16,5,7,25,23,20,22);

$trands = array();
$up_t = array();
// $down_t = array();


$pn = 0;
$tn = 1;
foreach($ns as $n) {
if($n < $pn) {
$tn++;
}
$trands[$tn][] = $n;
$up_t[$tn] = end($trands[$tn]) - $trands[$tn][0];
$pn = $n;
}

// print_r($trands); // наборы трэндов
// print_r($up_t); // на сколько восходят


arsort($up_t);
reset($up_t);
$k = key($up_t);

echo "\n<br />лучший трэнд:<br />\n";
echo str_replace(implode(',', $trands[$k]), '<b style="color:red">' . implode(',', $trands[$k]) . '</b>', implode(',', $ns)) . ' c разницей в ' . $up_t[$k];


Естественно нужно дорабатывать немного :)

UPD
Поправлен баг..

Спустя 31 минута, 15 секунд (27.03.2011 - 11:12) Trianon написал(а):
получившийся код...
<pre>
<?php
//0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
$list = array(1,3,5,5,5,7,3,1,1,3, 8, 2,16, 5, 7,25,23,20,22);

for($tr = array(), $v = 0, $c = $list[$s=$e=0], $i = 1, $n = count($list);
$i < $n;
$c = $list[$i++])
{
$x = $list[$i];
if($v < 0 && $x > $c || $v > 0 && $x < $c)
{
if($e > $s+1)
{
$t = array('start' => $s, 'end' => $e, 'trend' => $list[$e]-$list[$s] );
$tr[] = $t;
}
$c = $list[$s = $i-1];
$v = $x - $c;
}
if(!$v) $v = $x - $c;
if($x != $c) $e = $i;
}

print_r($tr);
?>


пример и отклик:

//0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
//1,3,5,5,5,7,3,1,1,3, 8, 2,16, 5, 7,25,23,20,22

Array (
[0] => Array ( [start] => 0 [end] => 5 [trend] => 6 )
[1] => Array ( [start] => 5 [end] => 7 [trend] => -6 )
[2] => Array ( [start] => 8 [end] => 10 [trend] => 7 )
[3] => Array ( [start] => 13 [end] => 15 [trend] => 20 )
[4] => Array ( [start] => 15 [end] => 17 [trend] => -5 )
)


собственно код не причесан. Только для иллюстрации логики.

Спустя 2 дня, 2 часа, 6 минут, 40 секунд (29.03.2011 - 13:19) dima4321 написал(а):
Вот, что получилось у меня ))

<?php
// тренд вверх
$array = array(3, 6,9,10,12, 2, 8, 11, 3, 5, 9, 15, 8, 1);


$cmax['last']=0;

for($i = 0; $i < count($array); $i++){
if($array[$i] > $cmax['last'])
{
$cmax['last'] = $array[$i];
$new[]=$array[$i]."-";
if(count($new)>3)
{
echo "<pre>";
print_r($new);
echo "</pre>";
}
}

else
{
unset($new);
$cmax['last'] = $array[$i];
$new[]=$array[$i]."-";

}
}




?>


_____________
Работаю за еду ! __))
И за плюсики !
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.