php важность числа в наборе чисел - PullRequest
6 голосов
/ 22 ноября 2010

У меня есть набор чисел, например

$input = array(1, 4, 7, 4, 9, 4, 8, 6, 2, 8, 7, 7, 4, 5, 3);

Я пытаюсь понять важность каждого числа на основе следующего правила:

Поскольку последовательность становится длиннее, числа становятся менее значимыми, и каждый раз, когда число упоминается, оно повышает релевантность (насколько зависит от его положения в последовательность).

Я ожидаю что-то вроде:

Array(
   '4' => 90%
   '1' => 75%
   '7' => 60%
   ....
)

Таким образом, 4 является наиболее важным, затем следует 1, а затем 7 и т. Д. Обратите внимание, что выходные данные полностью сфабрикованы, но указывают, что 4 должно быть наиболее важным. Я верю, что хочу какое-то линейное решение.

Ответы [ 3 ]

2 голосов
/ 22 ноября 2010

Это больше того, о чем ты думал?Ответ основан на постоянном

$numbers = array(1, 4, 7, 4, 9, 4, 8, 6, 2, 8, 7, 7, 4, 5, 3);
$weight = array();
$count = count($numbers);

for ($i=0; $i<$count; $i++) {
  if (!isset($weight[$numbers[$i]])) $weight[$numbers[$i]] = 1;
  $weight[$numbers[$i]] += $count + pow($count - $i, 2);
}

$max = array_sum($weight);
foreach ($weight as &$w) {
  $w = ($w / $max) * 100;
}

arsort($weight);

результате:

Array
(
    [4] => 34.5997286296
    [7] => 17.3677069199
    [1] => 16.3500678426
    [8] => 10.0407055631
    [9] => 9.29443690638
    [6] => 5.42740841248
    [2] => 4.40976933514
    [5] => 1.35685210312
    [3] => 1.15332428765
)
2 голосов
/ 22 ноября 2010
$numbers=array(1, 4, 7, 4, 9, 4, 8, 6, 2, 8, 7, 7, 4, 5, 3);
$weight=array();
$count=count($numbers);
for ($i=0; $i<$count; $i++) {
    if (!isset($weight[$numbers[$i]]))
        $weight[$numbers[$i]]=1;
    $weight[$numbers[$i]]*=$count-$i;
}
var_dump($weight);

Результат:

Array
(
    [1] => 15
    [4] => 5040
    [7] => 260
    [9] => 11
    [8] => 54
    [6] => 8
    [2] => 7
    [5] => 2
    [3] => 1
)
1 голос
/ 22 ноября 2010

Этот алгоритм довольно прост, но я думаю, что он выполняет то, что вы ищете.

Учитывая, что у вас есть последовательность, описанная выше, и он хранится в массиве с именем $sequence

$a = array();
for($i=0;$i<count($sequence);$i++)
{
   //calculate the relevance = 1/position in array
   $relevance = 1/($i+1);

   //add $relevance to the value of $a[$sequence[$i]]
   if(array_key_exists((string)$sequence[$i],$a))
       $a[(string)$sequence[$i]] += $relevance;
   else
       $a[(string)$sequence[$i]] = $relevance;
}
return $a;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...