2011-09-15 11 views
11

Digamos que tenemos una lista de artículos, cada artículo tiene un número (desconocido) de atributos. Ordenar por atributo único es un algoritmo de ordenación simple. La pregunta es: ¿cómo ordenar el mismo orden de lista por todos los atributos? Cada atributo tiene un peso, por lo que podríamos ordenar por atributo menos importante primero y luego por atributo más importante utilizando algoritmo de ordenación estable, etc., pero esto claramente no es eficiente.¿Qué algoritmo de clasificación de múltiples criterios usar?

Gracias.

Respuesta

5

crear una función f: A1xA2x ..-> R [es decir dar un valor a cada elemento basado en las prioridades y atributos]. la función es muy dependiente de los atributos [por ejemplo, si los valores de los atributos están en el rango (0,9) dando un valor es simple: Sigma[val(i)*10^prio(i)] for each attribute i.

Iterate la lista, calcule el valor de la función y guarde en caché el resultado de esta función, y ordene de acuerdo con ella. la complejidad será O (nk + nlogn) donde k es el número de atributos, n es el número de elementos.

+2

Lo es 'prio (i)'? – Dima

+1

'prio (i)' es la prioridad del atributo i-ésimo, donde i = 0 es menos importante en este ejemplo. – amit

+1

hey! Acabo de ver tu respuesta (en 2 años tarde ...) ... y trato de entenderlo por casi dos días ... ¿Puedes tratar de explicar el algoritmo o vincularme con alguna referencia? –

1

La mayoría de los algoritmos de clasificación pueden tomar como entrada una única función de comparación, que puede combinar varios criterios de clasificación.

Al final, para poder ordenar en absoluto, debe haber una sola relación de ordenamiento entre todos los elementos (por ejemplo, A está definitivamente por delante del elemento B, o viceversa, o los dos son equivalentes; la relación debe satisfacer las propiedades transitiva/simétrica/reflexiva), por lo que esto implica que debe ser posible ordenar con una pasada de un algoritmo de clasificación, dada una función de comparación válida.

+1

Este también es O (k * n * logn) el peor de los casos, [k es el número de atributos yn es la cantidad de elementos], ya que necesita verificar k elementos en cada comparación. mismo límite que ordenar k veces con algoritmo estable. – amit

+1

sí, pero no necesita usar un tipo estable. –

+1

cierto, y el rendimiento probablemente será mejor que ordenar k veces, ya que no necesitará todas las comparaciones k para todos los elementos, simplemente apuntar será asintóticamente el mismo [al menos para el peor de los casos] – amit

10
SORT BY A,B,C 

Su comparación dentro de la clase hará lo siguiente: A, B, C están en más alto a prioerity más bajo

  • comparar una de Element 1 con el elemento 2 es un
    • Si es mayor o menor return resultado
    • Else Comparar B
      • Si el resultado de una mayor o menor rentabilidad
      • Else Comparar resultado C retorno

Esto se puede extrapolar a los criterios A..n con un bucle simple.

  • para cada criterio en la lista de criterios
    • Compare Criterios de Element 1 con el elemento 2 de
      • Si el resultado de una mayor o menor rentabilidad
      • bien continuar // para mayor claridad
  • retorno igual

Lo anterior tanto asumir su función de comparación se compara (element1, Element2)

+1

esto también es O (k * n * logn), donde k es el número de atributos yn es el número de elementos, el mismo límite que simplemente ordenar k veces. – amit

+0

el problema con esto es que un criterio, A, tiene un peso infinitamente mayor que todo lo demás. Supongamos que el alumno es bueno en matemáticas, y estoy buscando que alguien se una a mi equipo de robótica. Pero que los estudiantes apestan a la ética, el profesionalismo, la codificación, tienen problemas con las drogas y más, pero como las matemáticas están comenzando, factor importante algo sugerirá que el mejor estudiante es al menos él estará en los mejores estudiantes –

+1

@MuhammadUmer - quiere una * calificación * Algoritmo no es un algoritmo * sorting *. Entonces, querrías generar un puntaje para cada estudiante basado en lo que considerases admirable, luego ordenarías por ese puntaje. –

Cuestiones relacionadas