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

De GeoGebra Manual
Saltar a: navegación, buscar
m
 
(No se muestran 14 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 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>Longitud[Elemento[lista, i]]</code>.}}
+
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=
{{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>.}}
+
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
;
+
}}
{{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}}
+
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.
 
 
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>
 
 
 
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. 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. 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=Secuencia[Objeto[Elemento[lista_n, k]], k, 1, 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 = Ordena[Secuencia[('''*número basado en Elemento[listado, i]*''', i), i, 1, 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} = Secuencia[Elemento[lista_n, y(Elemento[lista_h, i])], i, 1, 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
 
}}
 
}}
  
[[de:Anleitungen:Listen von beliebigen Elementen sortieren]]
 
[[en:Tutorial:Advanced List Sorting]]
 
[[fr:Tutoriel:Tri pointu pour une liste]]
 
[[it:Tutorial:Ordinare gli elementi di una lista]]
 
 
[[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