Cerca de algoritmos de clasificación - ¿Cuándo usar? -- algorithm campo con language-agnostic campo con sorting camp Relacionados El problema

Near Sorting Algorithms - When to use?


8
vote

problema

Español

De vez en cuando, navegue por la web y busco algoritmos interesantes y datos para poner en mi bolsa de trucos. Hace un año, me encontré con la Soft Heap Estructura de datos y aprendí sobre casi clasificación.

La idea detrás de esto es que es posible romper la barrera O (n log n) de comparar las clases basadas si puede vivir con el hecho de que el algoritmo de clasificación engaña un poco. Usted obtiene una lista casi ordenada, pero también tiene que vivir con algunos errores.

Jugué con los algoritmos en un entorno de prueba, pero nunca encontré un uso para ellos.

Así que la pregunta: ¿Alguien ha usado alguna vez cerca de la clasificación en la práctica? Si es así, ¿en qué tipo de aplicaciones? ¿Puedes pensar en un caso de uso en el que casi la clasificación es la cosa adecuada para hacer?

Original en ingles

From time to time I browse the web and look for interesting algorithms and datastructures to put into my bag of tricks. A year ago I came across the Soft Heap data-structure and learned about near sorting.

The idea behind this is that it's possible to break the O(n log n) barrier of compare based sorts if you can live with the fact that the sort algorithm cheats a bit. You get a almost sorted list but you have to live with some errors as well.

I played around with the algorithms in a test environement but never found a use for them.

So the question: Has anyone ever used near sorting in practice? If so in which kind of applications? Can you think up a use-case where near sorting is the right thing to do?

</div
        

Lista de respuestas

4
 
vote
vote
La mejor respuesta
 

Hay una gran cantidad de heurísticas "codiciosas" donde usted selecciona periódicamente el mínimo de un conjunto. La heurística codiciosa no es perfecta, por lo que incluso si elige el mínimo que no está garantizado para llegar a la mejor respuesta final. De hecho, el Grabir Meta-Heuristic, intencionalmente introduce un error aleatorio para que obtenga múltiples finales Soluciones y seleccione la mejor. En ese caso, introducir algún error en su tipo de rutina a cambio de la velocidad sería un buen intercambio.

 

There are a lot of "greedy" heuristics where you periodically select the minimum of a set. The greedy heuristic is not perfect, so even if you pick the minimum you aren't guaranteed to get to the best final answer. In fact, the GRASP meta-heuristic, you intentionally introduce random error so that you get multiple final solutions and select the best one. In that case, introducing some error in your sort routine in exchange for speed would be a good trade off.

</div
 
 
9
 
vote

Esta es una suposición total de vuelo, pero dada la subjetividad inherente de las medidas de "relevancia" al clasificar los resultados de búsqueda, se aventuraría que realmente no importa si están perfectamente ordenados o no. Lo mismo podría decirse de recomendaciones. Si puede organizar que cualquier otra parte de su algoritmo para esas cosas es O (n), entonces podría buscar una especie.

Sé consciente de que, en el peor de los casos, sus datos "casi ordenados" no se encuentran Cumplir una posible idea intuitiva de "casi ordenada", que es que solo tiene un pequeño número de inversiones. La razón de esto es solo que si sus datos solo tienen o (n) inversiones, puede terminar de clasificarlo en O (n) tiempo utilizando el tipo de inserción o un tipo de cóctel (es decir, tipo de burbuja burbujas de dos vías). De ello se deduce que posiblemente no puede haber alcanzado este punto desde la hora completamente inconformista, en O (N) (utilizando comparaciones). Por lo tanto, está buscando aplicaciones donde se clasifique un subconjunto mayoritario de los datos y el resto se dispersa, no para aplicaciones que requieren que cada elemento esté cerca de su posición correcta.

 

This is a total flying guess, but given the inherent subjectivity of "relevance" measures when sorting search results, I'd venture that it doesn't really matter whether or not they're perfectly sorted. The same could be said for recommendations. If you can somehow arrange that every other part of your algorithm for those things is O(n) then you might look to avoid a sort.

Be aware also that in the worst case your "nearly sorted" data does not meet one possible intuitive idea of "nearly sorted", which is that it has only a small number of inversions. The reason for this is just that if your data has only O(n) inversions, then you can finish sorting it in O(n) time using insertion sort or cocktail sort (i.e. two-way bubble sort). It follows that you cannot possibly have reached this point from completely unsorted, in O(n) time (using comparisons). So you're looking for applications where a majority subset of the data is sorted and the remainder is scattered, not for applications requiring that every element is close to its correct position.

</div
 
 
4
 
vote

Solo especulando aquí, pero una cosa que imagino es la optimización de la consulta de la base de datos.

Una consulta de la base de datos en un lenguaje declarativo, como SQL, debe traducirse en un programa paso a paso llamado "Plan de ejecución". Por lo general, una consulta de SQL se puede traducir a una serie de dichos planes de ejecución, que todos dan el mismo resultado, pero pueden tener un rendimiento muy variable. El optimizador de consulta tiene que encontrar el más rápido, o al menos uno que sea razonablemente rápido.

Los optimizadores de consulta basados ​​en costos tienen una "función de costo", que utilizan para estimar el tiempo de ejecución de un plan dado. Los optimizadores exhaustivos pasan por todos los planes posibles (por algún valor de "todos los posibles") y seleccione el más rápido. Para consultas complicadas, el número de planes posibles puede ser prohibitivamente grande, lo que lleva a tiempos de optimización demasiado largos (¡Antes de que incluso comience la búsqueda en la base de datos!) Por lo tanto, también hay optimizadores no exhaustivos. Solo miran algunos de los planes, tal vez con un elemento aleatorio para elegir cuáles. Esto funciona, ya que generalmente hay una gran cantidad de planes "buenos", y es posible que no sea tan importante encontrar lo mejor, es probable que sea mejor elegir un plan de 5 segundos en lugar del plan óptimo de 2 segundos , si requiere varios minutos de optimización para encontrar el plan de 2 segundos.

Algunos algoritmos de optimización utilizan una cola ordenada de los planes "prometedores" (parciales). Si realmente no importa si encuentra el mejor plan absolutamente, tal vez podría usar una cola casi ordenada?

Otra idea (y todavía estoy especulando) es un programador para procesos o hilos en un sistema de intercambio de tiempo, donde podría no ser importante si un determinado proceso o hilo obtiene su tiempo de tiempo un poco de milisegundos más tarde que si es estrictamente ordenado por prioridad.

 

Just speculating here, but one thing I imagine is database query optimization.

A database query in a declarative language such as SQL has to be translated into a step-by-step program called an "execution plan". One SQL query can typically be translated to a number of such execution plans, which all give the same result but can have very varying performance. The query optimizer has to find the fastest one, or at least one that is reasonably fast.

Cost-based query optimizers have a "cost function", which they use to estimate the execution time of a given plan. Exhaustive optimizers go through all possible plans (for some value of "all possible") and select the fastest one. For complicated queries the number of possible plans may be prohibitively large, leading to overly long optimization times (before you even begin the search in the database!) so there are also non-exhaustive optimizers. They only look at some of the plans, perhaps with a random element in choosing which ones. This works, since there is usually a large number of "good" plans, and it might not be that important to find the absolutely best one -- it is probably better to choose a 5-second plan instead of the optimal 2-second plan, if it requires several minutes of optimization to find the 2-second plan.

Some optimization algorithms use a sorted queue of "promising" (partial) plans. If it doesn't really matter if you find the absolutely best plan, maybe you could use an almost-sorted queue?

Another idea (and I'm still just speculating) is a scheduler for processes or threads in a time-sharing system, where it might not be important if a certain process or thread gets its timeslot a few milliseconds later than if strictly sorted by priority.

</div
 
 
 
 
2
 
vote

Una aplicación común para casi clasificación es cuando un humano está haciendo la comparación de pares y no quiere que tenga que hacerles tantas preguntas.

Di que tiene muchos artículos que le gustaría que un humano se clasifique a través de la comparación de pares. Puede reducir en gran medida el número de comparaciones que necesita que hagan si está dispuesto a aceptar que el pedido no sea exacto. Es posible que, por ejemplo, no se preocupe si los artículos adyacentes se han cambiado mucho, ya que los elementos preferidos están en la parte superior.

 

A common application for near-sorting is when a human is doing the pairwise comparison and you don't want to have to ask them as many questions.

Say you have a lot of items you'd like a human to sort via pairwise comparison. You can greatly reduce the number of comparisons you need them to do if you're willing to accept that ordering won't be exact. You might, for example, not care if adjacent items have been swapped a long as the preferred items are at the top.

</div
 
 
1
 
vote

en cualquier lugar

  1. se supone que debe reaccionar rápido,
  2. No es prometedor comportamiento exacto al cliente,
  3. pero internamente tienes algunas reglas

puedes usarlo. ¿Qué tal "no tan tan estricta" cola prioritaria basada en reglas? ¿Dónde sería eso útil? Tal vez hilo / proceso / programación de recursos. En la programación de hilos / procesos, realmente no promete, un hilo va a ir primero, segundo o último, pero generalmente desea darles a todos alguna oportunidad. Es posible que desee hacer cumplir la regla suelta, por lo que es preventivo, priorizado, Blabla.

Un ejemplo de programación de recursos estaría respondiendo a la entrega de pizza o las cajas de envío de libros a las personas, etc. No se puede usar donde se espera el resultado determinista, pero hay muchos de los siguientes ejemplo en la vida real donde las cosas no son tan deterministas / predecible.

 

Anywhere

  1. you are supposed to react fast,
  2. you are not promising exact behavior to the client,
  3. but internally you have some rules

you can use it. How about "not so strict" rule-based priority queue? Where would that be useful? Maybe thread/process/resource scheduling. In thread/process scheduling you are really not promising any one thread is going to go first, second, or last, but generally you want to give everyone some chance. You might want to enforce loose rule so it's preemptive, prioritized, blabla..

A resource schedule example would be responding to pizza delivery or shipping boxes of books to people etc. You can't use it where deterministic result is expected, but there are lots of example in real life where things are not so deterministic/predictable.

</div
 
 
-1
 
vote

o (n log n) ya es bastante rápido. No creo que nadie se inicie ", comience usando un algoritmo casi ordenado. Comenzaría con el código que solo hace un tipo completo (ya que su lenguaje de programación es probable que proporcione una función sort y no una función nearsort ), y cuando se encuentra empíricamente Que el tipo estaba tomando demasiado tiempo, comenzaría a preguntar si sus datos realmente deben estar completamente ordenados, y considere usar un ordenamiento cercano.

Básicamente, ni siquiera consideraría usar un tipo cercano a menos que primero descubriera la clasificación para ser un cuello de botella severo en tu programa.

 

O(n log n) is already pretty fast. I don't think anyone would ever start out using a near-sort algorithm. You would start out with code that just does a complete sort (since your programming language of choice likely provides a sort function and not a nearsort function), and when you found empirically that the sort was taking too long, you would start to question whether your data really needs to be fully-sorted, and consider using a near-sort.

Basically, you would never even consider using a near sort unless you first discovered sorting to be a severe bottleneck in your program.

</div
 
 

Relacionados problema

8  Cerca de algoritmos de clasificación - ¿Cuándo usar?  ( Near sorting algorithms when to use ) 
De vez en cuando, navegue por la web y busco algoritmos interesantes y datos para poner en mi bolsa de trucos. Hace un año, me encontré con la Soft Heap Est...

1  PHP: Ordenar datos de conjuntos anidados  ( Php sort data from nested sets ) 
Actualmente estamos construyendo un sitio web con una tabla MySQL categorizada que contiene varias competencias, y notamos que el modelo establecido anidado s...

828  ¿Cómo ordena un diccionario por valor?  ( How do you sort a dictionary by value ) 
A menudo tengo que ordenar un diccionario, que consiste en llaves y amplificador; Valores, por valor. Por ejemplo, tengo un hash de palabras y frecuencias res...

111  ¿Cómo ejecuto cualquier comando que edite su archivo (argumento) "en su lugar" usando Bash?  ( How do i execute any command editing its file argument in place using bash ) 
Tengo un archivo temp.txt, que quiero ordenar con el comando sort en Bash. Quiero los resultados ordenados para reemplazar el archivo original. Esto no ...

8  ¿Una forma más pitónica de escribir esta expresión?  ( A more pythonic way to write this expression ) 
Se supone que debo tomar una lista de palabras y ordenarla, excepto que necesito agrupar todas las cadenas que comienzan con 'X' primero. Aquí está lo que o...

3  Stl __merge_without_buffer algoritmo?  ( Stl merge without buffer algorithm ) 
¿Dónde puedo obtener una descripción de alto nivel decente del algoritmo utilizado en __merge_without_buffer() en el STL de C ++? Estoy tratando de reembols...

4  ¿Cómo puedo escribir un programa para generar un árbol de decisión de clasificación?  ( How can i write a program to generate a sorting decision tree ) 
En clase, nos dieron un simple árbol de decisiones para clasificar 3 elementos (A, B, C). (Fuente: brpreiss.com ) Mientras miras esto, tiene sentido ...

4  PHP: Ordenar una matriz  ( Php sort an array ) 
Tengo una matriz con datos de una tabla MySQL en un modelo establecido anidado, me gustaría ser ordenado, no solo alfabético, sino también con los nodos infan...

2  El analizador de Digit de Jquery Tablesorter no funciona  ( Jquery tablesorter comma digit parser not working ) 
Aquí está mi problema, Actualmente estoy usando el clasificador de la tabla de jQuery y encontré un analizador de coma-dígitos en la web. El problema que es...

30  ¿Cómo ordenar un sistema.collections.genic.list.list en vb.net?  ( How sort a system collections generic list in vb net ) 
i Usando una lista de genric (M_Equipment Lista) que es la colección de objetos (HORAR_PAYITEM). ¿Cómo se puede clasificar la lista de acuerdo con una protur...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos