Tutorial: Orden avanzado de listas

De GeoGebra Manual
Revisión del 22:22 29 ene 2021 de Fvitabar (discusión | contribs.)
(difs.) ← Revisión anterior | Revisión actual (difs.) | Revisión siguiente → (difs.)
Saltar a: navegación, buscar


Si deseas ordenar una lista de objetos en GeoGebra, es posible que el tipo de objeto no sea admitido por el comando Ordena. (Si simplemente quieres invertir los resultados, puedes usar Ordena() junto con Invierte).

En caso de que el tipo de objeto no sea admitido por Ordena(), o si deses un criterio de ordenamiento totalmente diferente, este tutorial te ayudará. Si tienes inconvenientes con el algoritmo, puedes leer la explicación y los ejemplos más adelante.

Algoritmo

  1. Sea lista la lista que queremos ordenar.
  2. lista_h = Ordena(Secuencia[(*número basado en Elemento(lista, i)*, i), i, 1, Longitud(lista)))
    Esto corresponde a c en la explicación (la lista auxiliar). La parte en negrita es llamada f en la explicación.
  3. lista_s = Secuencia(Elemento(lista, y(Elemento(lista_h, i))), i, 1, Longitud(lista))
    Esta es la lista ordenada.

Explicación

Para clarificar la situación, formulemos el problema matemáticamente. Dada la lista (a_1, a_2, \ldots, a_n) \subset X y la relación f: X \to \mathbb R, queremos hallar una permutación \sigma \in S_n tal que f(a_{\sigma(k)}) \leq f(a_{\sigma(l)}) \; \forall (k,l) \in \mathbb N^2: 1 \leq k \leq l \leq n. Podemos interpretar la permutación \sigma como una renumeración tal que (a_{\sigma(1)}, a_{\sigma(2)}, \ldots, a_{\sigma(n)}) será la lista ordenada. De modo que, en primer lugar, necesitamos una relación f para el ordenamiento, por ejemplo:

Ejemplo: Si deseas ordenar una lista de puntos según su distancia al origen ascendente, tenemos X := \mathbb R^2 y f((x,y)) := \sqrt{x^2 + y^2}. En GeoGebra, f para un punto A será Longitud(A), así que la parte en negrita del algoritmo lucirá Longitud(Elemento(lista,i)).
Ejemplo: Si deseas ordenar una lista de círculos según su radio ascendente, la parte en negrita del algoritmo será Radio(Elemento(lista,i)).
Ejemplo: Una construcción completa para ordenar una lista de números complejos según su argumento puede encontrarse en http://www.geogebra.org/material/show/id/7518

El truco para resolver este problema en Geogebra consiste en aprovechar el comando existente para ordenar una lista de puntos. En lugar de pensar en los puntos geométricamente, pensamos en ellos simplemente como pares ordenados de números. GeoGebra nos permite ordenar esos puntos según sus abscisas, así que creamos la lista de puntos \tilde c = (\tilde c_1, \ldots, \tilde c_n) con \tilde c_k := (f(a_k), k) y la ordenamos. Sea la lista ordenada c = (c_1, \ldots, c_n). Esta lista nos permite construir \sigma, porque y(c_{\sigma(k)}) = k. Usando \sigma podemos generar la versión ordenada de nuestra lista original.

¿Y qué sucede con los nombres?

Supongamos que hemos construido cinco puntos llamados A, B, C, D y E, y que queremos ordenarlos según cierto criterio. Podemos hacerlo usando lista = {A,B,C,D,E} y el algoritmo anterior, pero obtendremos una lista ordenada con las coordenas de los puntos, no con sus nombres originales --lo que podría ser interesando en la construcción, o beneficioso para mostrárserlos al usuario--. Para poder acceder a esos nombres en orden deseado debemos extender nuestro algoritmo:

  1. Sea lista_n la lista de los nombres de los objetos que queremos ordenar.
    Por ejemplo: lista_n = {"A", "B","C","D","E"}. No olvides las comillas, ya que necesitamos los nombres de los objetos y no los objetos en sí.
  2. Definamos lista=Secuencia(Objeto(Elemento(lista_n, k)), k, 1, Longitud(lista_n)).
    Esto crea la lista de objetos que queremos ordenar a partir de la lista de nombres.
  3. lista_h = Ordena(Secuencia((*número basado en Elemento(lista, i)*, i), i, 1, Longitud(lista)))
    Este es el paso 2 de nuestro algoritmo original.
  4. lista_{ns} = Secuencia(Elemento(lista_n, y(Elemento(lista_h, i))), i, 1, Longitu(lista))
    Esta es ahora una lista con los nombres de los objetos ordenados, como {"B", "A", "E", "F", "D"}. Si también deseas la lista ordenada con los valores, puedes utilizar list_s tal como se definió en el algoritmo original.
Ejemplo: El tercer ejemplo del algoritmo modificado para mostrar los nombres de los objetos puede encontrarse aquí: http://www.geogebra.org/material/show/id/7775
© 2021 International GeoGebra Institute