Php 一个数在一组数中的重要性

Php 一个数在一组数中的重要性,php,algorithm,numbers,Php,Algorithm,Numbers,我有一套数字 $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等。请注意,输出

我有一套数字

$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应该是最重要的。我想我需要某种线性解。

这个算法相当简单,但我认为它可以满足您的要求

$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);
假设您拥有上面描述的序列,并且它存储在名为
$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;
$a=array();

对于($i=0;$i这是否更符合您的想法?答案基于静止状态

$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);

你能添加一些实际的数字吗?根据什么规则,相关性将如何提高?我不确定我遗漏了什么,我在我的问题中列出了一组数字,左边的数字是最重要的,随着序列变长,重要性会下降。@Lizard是的,但是当一个数字提到ber?…编辑:啊,不,我现在明白了。我还以为还有一个怪癖没有出现。我们不确定您显示的数字是预运行还是后运行。我们也不确定数字在序列中的位置和重复有多重要。拥有预运行和后运行数组将帮助我们理解。好吧,考虑到这些输入,我想知道什么您期望的输出是多少(不必排序,只需输出顺序和背后的基本原理。您对
12344231
有何期望?
1234344
?问题是我认为4是最重要的,而不是1。您同意吗?只有当您以线性方式计算相关性时,您的陈述才是正确的,这意味着两个数字的相关性可能会发生冲突。看来线性就是我所追求的。在你的例子中你会做什么改变?我认为[4,1,1,…,1]数组没有办法让1的值通过4。
[4,1,1,1]
将导致
数组([4]=>4,[1]=>6)
因此1的数量将超过4。但这就是为什么我们需要澄清OP的权重系统的原因,因为
[4,1,1]
将导致
数组([4]=>3,[1]=>2)
。那么在这种情况下,哪一个占优势?位置还是计数?
$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
)