2010-11-22 8 views
7

J'ai un ensemble de nombres, par ex.php importance d'un nombre dans un ensemble de nombres

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

Je suis en train de travailler sur l'importance de chaque numéro en fonction de la règle suivante:

Comme la séquence obtient plus les chiffres deviennent moins importants, et chaque fois qu'un nombre est mentionné il améliorera la pertinence (combien dépend de sa position dans la séquence ).

J'attends quelque chose comme:

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

Alors 4 est le plus inportant, suivi de 1 puis 7, etc. Notez que la sortie est complètement fabriqué, mais donne à croire que 4 devrait être le plus important. Je crois que je veux une solution linéaire.

+1

Pouvez-vous ajouter quelques chiffres réels? Comment sera améliorée la pertinence, selon quelle règle? –

+0

Je ne suis pas sûr de ce qui me manque, j'ai énuméré un ensemble de nombres dans ma question, le nombre de la gauche étant le plus important et descendant en importance au fur et à mesure que la séquence s'allonge. – Lizard

+0

@Lizard Oui, mais selon quelle formule l'importance sera-t-elle améliorée quand un numéro est mentionné? ... edit: ah, non, je comprends maintenant. Je pensais qu'il y avait une anomalie supplémentaire qui n'est pas là –

Répondre

2

Est-ce plus de ce que vous pensiez? Réponse basée sur stillstanding

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

Résultat:

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

Résultat:

Array 
(
    [1] => 15 
    [4] => 5040 
    [7] => 260 
    [9] => 11 
    [8] => 54 
    [6] => 8 
    [2] => 7 
    [5] => 2 
    [3] => 1 
) 
+0

Le problème est que je m'attendrais 4 pour être le plus important pas 1. Êtes-vous d'accord? – Lizard

+0

Votre déclaration n'est vraie que si vous calculez la pertinence de manière linéaire, ce qui signifie qu'il est possible que la pertinence de deux nombres entre en collision. – stillstanding

+0

Il semble que linéaire est ce que je suis après. Que changeriez-vous dans votre exemple? – Lizard

1

Cet algorithme est assez simpliste, mais je pense qu'il accomplit ce que vous cherchez.

Étant donné que vous avez la séquence que vous avez décrite ci-dessus et il est stocké dans un tableau appelé $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;