Diferencia entre revisiones de «Tutorial:Orden de Listas Avanzado»

De GeoGebra Manual
Saltar a: navegación, buscar
m (Revertidos los cambios de LailaTov (disc.) a la última edición de LilianaSaid)
(Ajustado a oficial)
Línea 1: Línea 1:
{{tutorial|title=Diversos Ordenamientos de Listas}}
+
Si deseas ordenar una lista de objetos en GeoGebra, es posible que el tipo de objeto no sea admitido por el comando [[Comando Ordena|Ordena]]. (Si simplemente quieres invertir los resultados, puedes usar <code>Ordena()</code> junto con [[Comando Invierte|Invierte]]).
{{Interfaz|Tutoriales}}
+
 
Para ordenar una lista de objetos de un modo tal que no lo hiciera posible el [[Comando Ordena]], pueden emplearse alternativas:
+
En caso de que el tipo de objeto no sea admitido por <code>Ordena()</code>, 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.
*se precisa el comando [[Comando Invierte|Invierte]] para el modo descendiente en lugar del ascendente. Como en:<br>
 
**[[Comando Ordena|Ordena]]'''('''[[Comando Invierte|Invierte]]'''(''' ''lista_a_ordenar_de_modo_descendiente'''''))'''
 
*objetos de tipo no compatible con [[Comando Ordena|Ordena]] o criterios diferentes de orden pueden requerir alguna de las maniobras detalladas a continuación.
 
  
 
== Algoritmo ==
 
== Algoritmo ==
# Se denomina <code>lista</code> la lista a ordenar.
+
# Sea <code>lista</code> la lista que queremos ordenar.
# <code>lista_h = [[Comando Ordena|Ordena]]'''('''[[Tutorial:Visibilidad_Condicional_y_Secuencias#Introducci.C3.B3n_a_Secuencias|Secuencia]]'''('''('''*número basado en la lista [[Comentarios:Comando Elemento|Elemento]]'''('''lista, i)*''', i), i, 1, [[Comentarios:Comando Longitud|Longitud]]'''('''lista''')'''))</code> <br /> Esto corresponde a <math>c</math> en la explicación (el  listado de ayudas). La sección en negrita se denomina  <math>f</math> en la explicación.
+
# <code>lista_h = Ordena(Secuencia[('''*número basado en Elemento(lista, i)*''', i), i, 1, Longitud(lista)))</code> <br /> Esto corresponde a <math>c</math> en la explicación (la lista auxiliar). La parte en negrita es llamada <math>f</math> en la explicación.
# <code>lista_s = [[Tutorial:Visibilidad_Condicional_y_Secuencias#Introducci.C3.B3n_a_Secuencias|Secuencia]]'''('''[[Comentarios:Comando Elemento|Elemento]]'''('''lista, y'''('''[[Comentarios:Comando Elemento|Elemento]]'''('''lista_h, i)''')'''), i, 1, [[Comentarios:Comando Longitud|Longitud]]'''('''lista))</code> <br /> Esta es la lista ordenada.
+
# <code>lista_s = Secuencia(Elemento(lista, y(Elemento(lista_h, i))), i, 1, Longitud(lista))</code> <br /> Esta es la lista ordenada.
  
 
== Explicación ==
 
== Explicación ==
Para aclarar la situación se formula la tarea matemáticamente:
+
Para clarificar la situación, formulemos el problema matemáticamente. Dada la lista <math>(a_1, a_2, \ldots, a_n) \subset X</math> y la relación <math>f: X \to \mathbb R</math>, queremos hallar una permutación <math>\sigma \in S_n</math> tal que <math>f(a_{\sigma(k)}) \leq f(a_{\sigma(l)}) \; \forall (k,l) \in \mathbb N^2: 1 \leq k \leq l \leq n</math>. Podemos interpretar la permutación <math>\sigma</math> como una renumeración tal que <math>(a_{\sigma(1)}, a_{\sigma(2)}, \ldots, a_{\sigma(n)})</math> será la lista ordenada.
* Dada una lista <math>(a_1, a_2, \ldots, a_n) \subset X</math> y una aplicación  <math>f: X \to \mathbb R</math>, se intenta encontrar una permutación <math>\sigma \in S_n</math> tal que <math>f(a_{\sigma(k)}) \leq f(a_{\sigma(l)}) \; \forall (k,l) \in \mathbb N^2: 1 \leq k \leq l \leq n</math>
+
De modo que, en primer lugar, necesitamos una relación <math>f</math> para el ordenamiento, por ejemplo:
Se puede pensar en la permutación <math>\sigma</math> como una renumeración tal que <math>(a_{\sigma(1)}, a_{\sigma(2)}, \ldots, a_{\sigma(n)})</math> resulte la lista ordenada.
 
  
Así que primero es preciso llegar a una asignación de <math>f</math> para el ordenamiento correcto. Como en los siguientes casos:
+
{{example|1=
 
+
Si deseas ordenar una lista de puntos según su distancia al origen ascendente, tenemos <math>X := \mathbb R^2</math> y <math>f((x,y)) := \sqrt{x^2 + y^2}</math>. En GeoGebra, <math>f</math> para un punto <code>A</code> será <code>Longitud(A)</code>, así que la parte en negrita del algoritmo lucirá <code>Longitud(Elemento(lista,i))</code>.}}
{{Examples|1=<br><br>Si se desea ordenar una lista de puntos tal que su distancia al origen sea creciente, se tiene que <math>X := \mathbb R^2</math> y <math>f((x,y)) := \sqrt{x^2 + y^2}</math>
+
{{example|1=
En GeoGebra , <math>f</math> de un punto <code>A</code> sería <code>Longitud[A]</code>, por lo que la sección en negrita en el algoritmo sería <code>[[Comentarios:Comando Longitud|Longitud]]'''('''[[Comentarios:Comando Elemento|Elemento]]'''('''lista, i))</code><br><br>Si se desea ordenar una lista de círculos por orden creciente de radios, la sección en negrita en el algoritmo sería <code>[[Comando Radio|Radio]]'''('''[[Comentarios:Comando Elemento|Elemento]]'''('''lista, i))</code>}}<br><br>
+
Si deseas ordenar una lista de círculos según su radio ascendente, la parte en negrita del algoritmo será  <code>Radio(Elemento(lista,i))</code>.}}
{{Note|1=Una construcción completa para ordenar una lista de los números complejos por su argumento se puede encontrar en [http://www.geogebra.org/material/show/id/7518 GeoGebra]}}
+
{{example|1=
<br>
+
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
La maniobra para resolver este problema en GeoGebra es utilizar el comando existente para ordenar una lista de puntos. En lugar de pensar en los puntos geométricamente, se los interpreta como pares de números. GeoGebra permite ordenar los puntos por sus abscisas para crear una lista de puntos
+
}}
<math>\tilde c = (\tilde c_1, \ldots, \tilde c_n)</math> con <math>\tilde c_k := (f(a_k), k)</math> y ordenar esta lista. Puede denominarse a la lista ordenada <math>c = (c_1, \ldots, c_n)</math>
+
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 <math>\tilde c = (\tilde c_1, \ldots, \tilde c_n)</math> con <math>\tilde c_k := (f(a_k), k)</math> y la ordenamos. Sea la lista ordenada <math>c = (c_1, \ldots, c_n)</math>. Esta lista nos permite construir <math>\sigma</math>, porque <math>y(c_{\sigma(k)}) = k</math>. Usando <math>\sigma</math> podemos generar la versión ordenada de nuestra lista original.
 
 
Esta lista ordenada ahora nos permite construir <math>\sigma</math>.
 
Porque <math>y(c_{\sigma(k)}) = k</math>. A partir de <math>\sigma</math> se puede construir la versión ordenada de la lista original.
 
 
 
== ¿Orden en los Nombres? ==
 
  
Si cinco puntos se denominan <code>A</code>, <code>B</code>, <code>C</code>, <code>D</code> y <code>E</code> se van a ordenar acorde a cierto criterio. Usando <code>lista = {A,B,C,D,E}</code> el algoritmo previo puede emplearse para ordenarlos según sus coordenadas.<br>Respecto de sus nombres, vale señalar que en ocasiones son significativos en el contexto de la construcción y, por lo tanto, para quienes se propongan interpretarla.<br>El algoritmo, levemente diferente al ya explicado, que opera sobre esos nombres sería:
+
== ¿Y qué sucede con los nombres? ==
 +
Supongamos que hemos construido cinco puntos llamados <code>A</code>, <code>B</code>, <code>C</code>, <code>D</code> y <code>E</code>, y que queremos ordenarlos según cierto criterio. Podemos hacerlo usando <code>lista = {A,B,C,D,E}</code> 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:
  
# Sea <code>lista_n</code> la de los ''nombres de los objetos'' a ordenas.<br />Por ejemplo: <code>lista_n = {"A", "B","C","D","E"}</code>. <small>Es preciso no omitir las comillas dado que se trata del orden de los nombres de los objetos y no de los propios objetos.</small>
+
# Sea <code>lista_n</code> la lista de los ''nombres de los objetos'' que queremos ordenar.<br />Por ejemplo: <code>lista_n = {"A", "B","C","D","E"}</code>. <small>No olvides las comillas, ya que necesitamos los nombres de los objetos y no los objetos en sí.</small>
# Definiendo <code>listado=[[Tutorial:Visibilidad_Condicional_y_Secuencias#Introducci.C3.B3n_a_Secuencias|Secuencia]]'''('''Objeto'''('''[[Comentarios:Comando Elemento|Elemento]]'''('''lista_n, k)), k, 1, [[Comentarios:Comando Longitud|Longitud]]'''('''lista_n))</code>.<br />Esto crea la lista de objetos a ordenar basándonos en la lista de los nombres.
+
# Definamos <code>lista=Secuencia(Objeto(Elemento(lista_n, k)), k, 1, Longitud(lista_n))</code>.<br />Esto crea la lista de objetos que queremos ordenar a partir de la lista de nombres.
# <code>list_h = [[Comando Ordena|Ordena]]'''('''[[Tutorial:Visibilidad_Condicional_y_Secuencias#Introducci.C3.B3n_a_Secuencias|Secuencia]]'''('''('''*número basado en [[Comentarios:Comando Elemento|Elemento]]'''('''listado, i''')'''*''', i), i, 1, [[Comentarios:Comando Longitud|Longitud]]'''('''listado)))</code> <br /> Esta sería la segunda etapa del algoritmo original.
+
# <code>lista_h = Ordena(Secuencia(('''*número basado en Elemento(lista, i)*''', i), i, 1, Longitud(lista)))</code> <br /> Este es el paso 2 de nuestro algoritmo original.
# <code>lista_{ns} = [[Tutorial:Visibilidad_Condicional_y_Secuencias#Introducci.C3.B3n_a_Secuencias|Secuencia]]'''('''[[Comentarios:Comando Elemento|Elemento]]'''('''lista_n, y([[Comentarios:Comando Elemento|Elemento]]'''('''lista_h, i])), i, 1, [[Comentarios:Comando Longitud|Longitud]]'''('''listado))</code> <br />Esto resulta así un listado ordenado de los nombres de los objetos, como <code>{"B", "A", "E", "F", "D"}</code>. Si en cambio se prefiriera la lista de los valores ordenados de los objetos, basta con emplear <code>lista_s</code> como en algoritmo explicado en sección previa.
+
# <code>lista_{ns} = Secuencia(Elemento(lista_n, y(Elemento(lista_h, i))), i, 1, Longitu(lista))</code> <br />Esta es ahora una lista con los nombres de los objetos ordenados, como <code>{"B", "A", "E", "F", "D"}</code>. Si también deseas la lista ordenada con los valores, puedes utilizar <code>list_s</code> tal como se definió en el algoritmo original.
  
 
{{example|1=
 
{{example|1=
El tercer ejemplo,  usando el algoritmo original levemente modificado (que también muestra los nombres de los objetos) puede apreciarse en [http://www.geogebra.org/material/show/id/7775 la correspondiente dirección]
+
El tercer ejemplo del algoritmo modificado para mostrar los nombres de los objetos puede encontrarse aquí:
 +
http://www.geogebra.org/material/show/id/7775
 
}}
 
}}
  
[[Category:Tutoriales Avanzados]]
+
[[Category:Advanced Tutorials]]

Revisión del 22:19 29 ene 2021

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