2010-09-11 44 views
8

Me preguntaba si era posible encontrar el valor mediano de una matriz? Por ejemplo, supongamos que tengo una matriz de tamaño nueve. ¿Sería posible encontrar la ranura del medio de esta matriz?¿Encontrando el valor mediano de una matriz?

+2

Eso debería ser bastante trivial si sabes algo sobre el manejo de matrices. Tenga en cuenta que a menos que la matriz esté ordenada, la ranura del medio no es la mediana. ¿Es esta tarea? – teukkam

+2

Java o C++? Elegir uno. Y "valor mediano" y "espacio intermedio" no son lo mismo, elija uno. – GManNickG

Respuesta

21

Suponiendo la matriz x se clasifica y es de longitud n:

Si n es impar, entonces el promedio es de x [(n-1)/2].
Si n es par que la mediana es (x [n/2] + x [(n/2) -1])/2.

+0

Esto tomará tiempo de o (nlogn) al menos. – VishAmdi

1
vector<int> v; 
size_t len = v.size; 
nth_element(v.begin(), v.begin()+len/2,v.end()); 

int median = v[len/2]; 
4

en Java:

int middleSlot = youArray.length/2; 
yourArray[middleSlot]; 

o

yourArray[yourArray.length/2]; 

en una línea.

Eso es posible porque en Java las matrices tienen un tamaño fijo.

Nota:3/2 == 1


Recursos:

+1

Tu respuesta es incorrecta. Por ejemplo, considere una matriz con dos elementos: 3 y 75. Su respuesta da la mediana como 75. – Turtle

+3

¿Qué * es * la mediana de {3, 75}? –

+3

La mediana de 3 y 75 es 39 – Mason

0

La respuesta Java anterior sólo funciona si hay es un ammount impar de números aquí es la respuesta que obtuve a la solución:

if (yourArray.length % 2 == 0){ 

    //this is for if your array has an even ammount of numbers 
    double middleNumOne = yourArray[yourArray.length/2 - 0.5] 
    double middleNumTwo = yourArray[yourArray.length/2 + 0.5] 
    double median = (middleNumOne + middleNumTwo)/2; 
    System.out.print(median); 

}else{ 

    //this is for if your array has an odd ammount of numbers 
    System.out.print(yourArray[yourArray.length/2];); 
} 

y tenga en cuenta que esta es una prueba de concepto y de la mosca. Si crees que puedes hacerlo más compacto o menos intensivo, sigue adelante. Por favor, no lo critiquen.

6

Si desea utilizar cualquier biblioteca externa aquí es Apache commons math library utilizando puede calcular el Median.
Para más métodos y uso Tome mirar el API documentation

import org.apache.commons.math3.*; 
..... 
...... 
........ 
//calculate median 
public double getMedian(double[] values){ 
Median median = new Median(); 
double medianValue = median.evaluate(values); 
return medianValue; 
} 
....... 

Calcular en el programa

En general, se calcula la mediana utilizando la siguiente dos fórmulas given here

Si n es impar, entonces Mediana (M) = valor de ((n + 1)/2) el término del elemento.
Si n es par entonces Mediana (M) = valor de [((n)/2) -ésimo término elemento + ((n)/2 + 1) -ésimo término elemento]/2

Es muy fácil ya que tienes 9 elementos (número impar).
Encuentra el elemento medio de una matriz.
En su programa se puede declarar gama

//as you mentioned in question, you have array with 9 elements 
int[] numArray = new int[9]; 

entonces usted necesita para ordenar matriz mediante Arrays#sort

Arrays.sort(numArray); 
int middle = numArray.length/2; 
int medianValue = 0; //declare variable 
if (numArray.length%2 == 1) 
    medianValue = numArray[middle]; 
else 
    medianValue = (numArray[middle-1] + numArray[middle])/2; 
0

No hay otra alternativa - en general, las sugerencias aquí, o bien sugerir la clasificación de la serie después de tomar el mediana de tal matriz o confiando en una solución de biblioteca (externa). Los algoritmos de clasificación más rápidos en la actualidad son lineatmicos, en promedio, pero es posible hacerlo mejor que eso a los efectos del cálculo mediano.

El algoritmo más rápido para calcular la mediana a partir de una matriz no ordenada es QuickSelect, que, en promedio, encuentra la mediana en el tiempo proporcional a O (N). El algoritmo toma una matriz como argumento, junto con el valor int k (la estadística de orden, es decir, el k-ésimo elemento más pequeño de la matriz). El valor de k, en este caso, es simplemente N/2, donde N es la longitud de la matriz.

La implementación es un poco difícil de conseguir, pero aquí hay un ejemplo que se basa en la interfaz Comparable<T> y Collections.shuffle() sin dependencias externas.

public final class QuickSelectExample { 

    public static <T extends Comparable<? super T>> T select(T[] a, int k) { 
     if (k < 1) throw new IllegalStateException("Invalid k - must be in [1, inputLength]."); 
     if (k > a.length) throw new IllegalStateException("K-th element exceeds array length."); 
     Collections.shuffle(Arrays.asList(a)); 
     return find(a, 0, a.length - 1, k - 1); 
    } 

    private static <T extends Comparable<? super T>> T find(T[] a, int lo, int hi, int k) { 
     int mid = partition(a, lo, hi); 

     if (k == mid) return a[k]; 
     else if (k < mid) return find(a, lo, mid - 1, k); // search left subarray 
     else if (k > mid) return find(a, mid + 1, hi, k); // search right subarray 
     else throw new IllegalStateException("Not found"); 
    } 

    private static <T extends Comparable<? super T>> int partition(T[] a, int lo, int hi) { 
     T pivot = a[lo]; 
     int i = lo + 1; 
     int j = hi; 

     while (true) { // phase 1 
      while (i <= hi && (less(a[i], pivot) || eq(a[i], pivot))) // is a[i] >= pivot? 
       i++; 

      while (j >= i && !less(a[j], pivot)) // is a[j] <= pivot? 
       j--; 

      if (i >= j) break; 
      exch(a, i, j); 
     } 
     exch(a, lo, j); // phase 2 
     return j; 
    } 

    private static <T extends Comparable<? super T>> boolean less(T x, T y) { 
     return x.compareTo(y) < 0; 
    } 

    private static <T extends Comparable<? super T>> boolean eq(T x, T y) { 
     return x.compareTo(y) == 0; 
    } 
} 

El código produce las siguientes estadísticas de orden para estas matrices de entrada:

  "     Input Array     |               Actual Output [format: (index k -> array element)]               ", // 
      "             |                                          ", // 
      "  [S, O, R, T, E, X, A, M, P, L, E]   |       [(1 -> A), (2 -> E), (3 -> E), (4 -> L), (5 -> M), (6 -> O), (7 -> P), (8 -> R), (9 -> S), (10 -> T), (11 -> X)]       ", // 
      " [P, A, B, X, W, P, P, V, P, D, P, C, Y, Z] |   [(1 -> A), (2 -> B), (3 -> C), (4 -> D), (5 -> P), (6 -> P), (7 -> P), (8 -> P), (9 -> P), (10 -> V), (11 -> W), (12 -> X), (13 -> Y), (14 -> Z)]   " // 
0

Hágalo en una línea como un profesional:

return (arr[size/2] + arr[(size-1)/2])/2; 

fundido a una double si estás esperando un double, etc.

Cuestiones relacionadas