2010-11-22 12 views
7

Tengo un conjunto de números, p.php importancia de un número en un conjunto de números

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

estoy tratando de averiguar la importancia de cada número en base a la siguiente regla:

Como la secuencia se hace más largo los números se hacen menos importantes, y cada vez que un número consta entonces mejorará la relevancia (cuánto depende de su posición en la secuencia ).

estoy esperando algo como:

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

Así que 4 es el más importate, seguido de 1 y 7, etc. Tenga en cuenta que la salida está completamente fabricado, pero da en la indicación de que debe ser el 4 lo más importante. Creo que quiero algún tipo de solución lineal.

+1

¿Se puede añadir algunos números reales? ¿Cómo se mejorará la relevancia, de acuerdo con qué regla? –

+0

No estoy seguro de lo que me estoy perdiendo, he enumerado un conjunto de números en mi pregunta, el número de la izquierda es la más importante y está perdiendo importancia a medida que la secuencia se hace más larga. – Lizard

+0

@Lizard sí, pero ¿con qué fórmula se mejorará la importancia cuando se menciona un número? ... editar: ah, no, ahora entiendo. Pensé que había una peculiaridad adicional que no existe –

Respuesta

2

esto es más de lo que estabas pensando? Respuesta basada en 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); 

resultado:

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

Resultado:

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

El problema es esperar 4 a ser el más importante no 1. ¿Estás de acuerdo? – Lizard

+0

Su afirmación es verdadera solo si calcula la relevancia de forma lineal, lo que significa que existe la posibilidad de que la relevancia de dos números colisione. – stillstanding

+0

Parece que lineal es lo que busco en ese momento. ¿Qué cambiarías en tu ejemplo? – Lizard

1

Este algoritmo es bastante simplista, pero creo que logra lo que estás buscando.

Dado que tiene la secuencia que se describe anteriormente y se almacena en una matriz llamada $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; 
Cuestiones relacionadas