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

De GeoGebra Manual
Saltar a: navegación, buscar
m
 
(No se muestran 17 ediciones intermedias de 7 usuarios)
Línea 1: Línea 1:
{{tutorial|
+
 
title=Diversos Ordenamientos de Listas
+
{{DISPLAYTITLE: Tutorial:  Orden avanzado 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]]).
Para ordenar una lista de objetos de un modo tal que no lo hiciera posible el [[Comando Ordena]], pueden emplearse alternativas:
+
 
* para ordenar de modo descendiente en lugar de ascendiente, basta con incluir el [[Comando Invierte]] así, por ejemplo:
+
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.
** [[Comando Ordena|Ordena]] [ [[Comando Invierte|Invierte]] [ ''lista_a_ordenar_de_modo_descendiente'' ]]
 
* Si el tipo de objeto no es compatible con [[Comando Ordena|Ordena]] o el criterio de orden fuera  diferente, se puede apelar a 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 = Ordena[Secuencia[('''*número basado en la lista Elemento[lista, i]*''', i), i, 1, 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 = Secuencia[Elemento[lista, y(Elemento[lista_h, i])], i, 1, 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>.}}
 +
{{example|1=
 +
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>.}}
 +
{{example|1=
 +
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  <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.
  
{{example|1= 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>
+
== ¿Y qué sucede con los nombres? ==
En GeoGebra , <math>f</math> de un punto <code>A</code> sería <code>Distancia[A]</code>, por lo que la sección en negrita en el algoritmo sería <code>Distancia[Elemento[lista, i]]</code>.}}
+
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:
;
 
{{example|1=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>Radio[Elemento[lista, i]]</code>.}}
 
;
 
{{example|1=Una construcción completa para ordenar una lista de los números complejos por su argumento se puede encontrar en GeoGebra 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
+
# 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>
<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>
+
# 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>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} = 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.
  
Esta lista ordenada ahora nos permite construir <math>\sigma</math>.
+
{{example|1=
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.
+
El tercer ejemplo del algoritmo modificado para mostrar los nombres de los objetos puede encontrarse aquí:
 +
http://www.geogebra.org/material/show/id/7775
 +
}}
  
[[en:Tutorial:Advanced List Sorting]]
 
 
[[Category:Tutoriales Avanzados]]
 
[[Category:Tutoriales Avanzados]]

Revisión actual del 22:22 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
© 2024 International GeoGebra Institute