Foros-FIUBA Foros HostingPortal
 FAQ  •  Buscar  •  Wiki  •  Apuntes  •  Planet  •  Mapa  •  Eyeon  •  Chat
Preferencias  •  Grupos de Usuarios
Registrarse  •  Perfil  •  Entrá para ver tus mensajes privados  •  Login
Ver tema siguiente
Ver tema anterior

Responder al tema Ver tema anteriorEnviar por mail a un amigo.Mostrar una Lista de los Usuarios que vieron este TemaGuardar este Tema como un archivoPrintable versionEntrá para ver tus mensajes privadosVer tema siguiente
Autor Mensaje
7programador7
Nivel 2


Edad: 37
Registrado: 06 Abr 2011
Mensajes: 7
Ubicación: Jalisco
Carrera: Sistemas
mexico.gif
MensajePublicado: Mie Abr 06, 2011 10:01 am  Asunto:  Algoritmo para numeros entre rangos Responder citandoFin de la PáginaVolver arriba

Hola,

Necesito ayuda con este algoritmo:

Desarrolle un algoritmo que pida 10 números y permita determinar:

¿Cuáles son mayores de 100?
¿Cuáles están entre el 30 y 50?
¿Cuáles son menores de 30?

Por ejemplo si los numeros fueran: 70, 30, 150, 45, 10, 50, 400, 15, 66, 80

Me debe mostrar:
Mayores a 100 estan: 150, 400
Entre 30 y 50 estan: 30, 45, 50
Menores a 30 estan: 10, 15

Recordar que los números son introducidos por el usuario.

Muchas gracias de antemano.


Leo Género:Masculino Tigre OfflineGalería Personal de 7programador7Ver perfil de usuarioEnviar mensaje privado
Dx9
Moderador


Edad: 37
Registrado: 03 Ene 2007
Mensajes: 1552

Carrera: Informática
argentina.gif
MensajePublicado: Mie Abr 06, 2011 10:05 am  Asunto:  (Sin Asunto) Responder citandoFin de la PáginaVolver arriba

Contanos como intentaste encararlo, asi sabemos especificamente en que ayudarte Smile

_________________
Biblioteca Apuntes

Aries Género:Masculino Gato OcultoGalería Personal de Dx9Ver perfil de usuarioEnviar mensaje privadoVisitar sitio web del usuario
Ignium
Nivel 9


Edad: 38
Registrado: 29 Oct 2005
Mensajes: 2725
Ubicación: Rivadavia y Puan
Carrera: Civil
argentina.gif
MensajePublicado: Mie Abr 06, 2011 11:10 am  Asunto:  (Sin Asunto) Responder citandoFin de la PáginaVolver arriba

Supongo que hay dos formas.

Partiendo de un arreglo que contenga los números en el orden de ingreso (y sabiendo su dimensión)

* La trivial
Iterar posición por posición y hacer la cuentita de cuantos cumplen cada condición...

* La compleja y eficiente °°
Ordenar el arreglo (con un método piola).
Buscar por algún método log N la posición del item que arranca a cumplirlo y obtener el total por mera álgebra. (doble borde, doble búsqueda pero idem álgebra)

Tal vez exista una manera eficiente de ordenar un arreglo a medida que ingresan los datos. El problema de ordenar un arreglo de manera eficiente está super desarrollado en cualquier libro (quickshort, burbuja,..) El problema de hacer una búsqueda inteligente es trivial y consiste en dividir el intervalo en mitades y ver de que lado te queda el valor buscado hasta converger en un "punto".

**********

Por lo que estudiás, te recomiendo hacer la segunda, máxime que no es fecha de exámenes.

_________________
Centro de Estudiantes de Ingeniería - FIUBA

Grupo Google de la Comisión Curricular de Ing. Civil

Aquario Género:Masculino Bufalo OfflineGalería Personal de IgniumVer perfil de usuarioEnviar mensaje privadoEnviar emailMSN Messenger
Sebastian Santisi
Administrador Técnico


Edad: 42
Registrado: 23 Ago 2005
Mensajes: 17451


argentina.gif
MensajePublicado: Mie Abr 06, 2011 11:22 am  Asunto:  (Sin Asunto) Responder citandoFin de la PáginaVolver arriba

La trivial, va a tener complejidad [tex]\mathcal O(nc)[/tex] donde n es la cantidad de elementos y c la cantidad de condiciones. O sea, va a tener tiempo lineal.

La "eficiente", sólo por el hecho de ordenar, genéricamente debería tener un orden al menos [tex]\mathcal O(n \log n)[/tex]. Salvo que haya particularidades de tu conjunto de datos que te permita obtener un mejor tiempo del orden (que nunca va a ser menos que lineal); siempre va a ser peor que la trivial. Como mucho (restricciones sobre el conjunto de entrada), vas a poder hacer que sean iguales.

_________________
Image[tex] ${. \ \ \ \ \ \ \ \ \ .}$ [/tex][tex] ${\Large Usá \LaTeX, no seas foro...}$ [/tex]

Aries Género:Masculino Perro OfflineGalería Personal de Sebastian SantisiVer perfil de usuarioEnviar mensaje privadoVisitar sitio web del usuario
_nacho_
Nivel 9



Registrado: 08 Oct 2007
Mensajes: 1271

Carrera: No especificada
uruguay.gif
MensajePublicado: Mie Abr 06, 2011 11:46 am  Asunto:  (Sin Asunto) Responder citandoFin de la PáginaVolver arriba

Una no tan trivial sería armar una secuencia en que los valores que fueron rechazados en el primer test sean el input del segundo (siempre y cuando las condiciones lleven a conjuntos disjuntos, como en el ejemplo que diste).

_________________

 Género:Masculino  OfflineGalería Personal de _nacho_Ver perfil de usuarioEnviar mensaje privado
Sebastian Santisi
Administrador Técnico


Edad: 42
Registrado: 23 Ago 2005
Mensajes: 17451


argentina.gif
MensajePublicado: Mie Abr 06, 2011 12:04 pm  Asunto:  (Sin Asunto) Responder citandoFin de la PáginaVolver arriba

_nacho_ escribió:
Una no tan trivial sería armar una secuencia en que los valores que fueron rechazados en el primer test sean el input del segundo (siempre y cuando las condiciones lleven a conjuntos disjuntos, como en el ejemplo que diste).

En implementación, eso se marca usando un else antes del if; es optimización pero menor, te da un speedup pero no te cambia el orden.

_________________
Image[tex] ${. \ \ \ \ \ \ \ \ \ .}$ [/tex][tex] ${\Large Usá \LaTeX, no seas foro...}$ [/tex]

Aries Género:Masculino Perro OfflineGalería Personal de Sebastian SantisiVer perfil de usuarioEnviar mensaje privadoVisitar sitio web del usuario
Ignium
Nivel 9


Edad: 38
Registrado: 29 Oct 2005
Mensajes: 2725
Ubicación: Rivadavia y Puan
Carrera: Civil
argentina.gif
MensajePublicado: Mie Abr 06, 2011 12:22 pm  Asunto:  (Sin Asunto) Responder citandoFin de la PáginaVolver arriba

¿si el "log" n es menor que el número de restricciones? Las restricciones pueden ser en realidad un pedido a la base de datos.

Cita:

Image


Entiendo perfectamente tu punto pero supongo que depende de la relación entre el tamaño del arreglo y la cantidad de búsquedas que se haga. Tiré una solución "rica".
De hecho vos si sos profesional y docente. ¿Como se gestiona esto en una base de datos mas allá del "lenguaje"?

_________________
Centro de Estudiantes de Ingeniería - FIUBA

Grupo Google de la Comisión Curricular de Ing. Civil

Aquario Género:Masculino Bufalo OfflineGalería Personal de IgniumVer perfil de usuarioEnviar mensaje privadoEnviar emailMSN Messenger
Sebastian Santisi
Administrador Técnico


Edad: 42
Registrado: 23 Ago 2005
Mensajes: 17451


argentina.gif
MensajePublicado: Mie Abr 06, 2011 2:14 pm  Asunto:  (Sin Asunto) Responder citandoFin de la PáginaVolver arriba

Ignium escribió:
¿si el "log" n es menor que el número de restricciones? Las restricciones pueden ser en realidad un pedido a la base de datos.

Entiendo perfectamente tu punto pero supongo que depende de la relación entre el tamaño del arreglo y la cantidad de búsquedas que se haga. Tiré una solución "rica".

No sé si entiendo bien la pregunta, pero intento respondértela.

En el problema que plantea él, la idea es tener un par de búsquedas fijas y tener un conjunto variable de datos de entrada. Entonces, el tiempo de búsqueda no puede disociarse del tiempo de organización de los datos.

En el algoritmo que planteaste como trivial, por cada dato, hacés las restricciones, por lo que las operaciones que hiciste quedan función de los datos y las restricciones.

En la otra solución tenés dos partes. Una es ordenar, lo cual tiene un tiempo como mínimo n log n (no importa mucho el valor de n, para n > e, eso da más que lineal); y una vez que se hizo ese pre-procesamiento, cada búsqueda te va a llevar algo de orden log n con búsqueda binaria.

Entonces, la solución completa sería: n log n + c log n, donde c son otra vez, el número de restricciones. Si c < n, como cota puede dejarse n log n, y si c > n, como cota puede dejarse c log n. Como mínimo, entonces, el tiempo total va a ser n log n.

Si se ponen las dos curvas en función de c, se va a ver que las dos se cruzan. Para c chico, nc va a ser menor que n log n; para c grande, c log n va a ser menor que n c. Entonces, sí, si el caso fuera al revés, los datos están fijos y lo que uno va a variar son las consultas; puede convenir hacer el preprocesamiento.
Ignium escribió:
De hecho vos si sos profesional y docente. ¿Como se gestiona esto en una base de datos mas allá del "lenguaje"?

Ahí lo gestiona la base de datos; y ya es imposición que haya una carga previa en memoria de todos los valores.

Si creas una tabla indexada por el valor, va a crearse un índice donde buscar debería darte un orden logarítmico.

Un: "SELECT COUNT(*) FROM datos WHERE valor < 30;" dependiendo de la implementación del motor, podría partir de un mínimo de tiempo logarítimico hasta un máximo de lineal. Pero depende mucho de la implementación... por ejemplo, dudo mucho que eso en Access vaya a darte orden logarítmico.

_________________
Image[tex] ${. \ \ \ \ \ \ \ \ \ .}$ [/tex][tex] ${\Large Usá \LaTeX, no seas foro...}$ [/tex]

Aries Género:Masculino Perro OfflineGalería Personal de Sebastian SantisiVer perfil de usuarioEnviar mensaje privadoVisitar sitio web del usuario
7programador7
Nivel 2


Edad: 37
Registrado: 06 Abr 2011
Mensajes: 7
Ubicación: Jalisco
Carrera: Sistemas
mexico.gif
MensajePublicado: Mie Abr 06, 2011 5:37 pm  Asunto:  (Sin Asunto) Responder citandoFin de la PáginaVolver arriba

Hola Muchas gracias a todos por sus respuestas.

Pero les comento que estoy trabajando con diagramas de flujo, y no comprendo todo eso de los logaritmos.

Les explico lo que a mi se me ocurre:

Este sería el pseudocódigo:

Inicio
1.- Declaración de variables: n1, n2, n3, n4, n5, n6, n7, n8, n9, n10
2.- Escribir el mensaje: Teclea el 1er. número:
3.- Almacenar el numero en la variable n1
4.- Escribir el mensaje: Teclea el 2do. número:
5.- Almacenar el numero en la variable n2
.
.
.
Escribir el mensaje: Teclea el 10mo. número:
Almacenar el numero en la variable n10

ya de ahi no se como seguir...

Para comparar y ver en que rango esta un número se me ocurre esto:

Si n1 > 100
Entonces mayor1 = n1 (Almaceno el valor en una variable llamada mayor1)
Si n2 > 100
Entonces mayor2 = n2 (Almaceno el valor en una variable llamada mayor2)
.
.
Así sucesivamente con los demás.

Después tendria que volverlos a comparar pero ahora así:

Si n1 >= 30 AND n1 <50>= 30 AND n1 <=50
Entonces rango2 = n2
.
.
Así sucesivamente con los demás.

Y después tendría que comprararlos así:

Si n1 < 30
Entonces menor1 = n1
Si n2 < 30
Entonces menor2 = n2
.
.
Así sucesivamente con los demás.


Pero no se como implementarlo ya siguiendo este proceso tendria que agregar todas las comparaciones varias veces, es dedir todas las comparaciones anteriores dentro de cada comparación dando una cantidad gigantezca de comparaciones y para imprimirlos lo que haria dentro de camino del ciclo SI ( if ) es imprimir las variables de la siguiente forma:

Mayores a 100 estan: mayor1, mayor2, mayor3, ... , mayor10
Entre 30 y 50 estan: rango1, rango2, rango3, ... , rango 10
Menores a 30 estan: menor1, menor2, menor3, ... , menor10

Aqui supongo que no importa que se impriman todas las variables ya que al declararlas no se les asigno un valor y por lo tanto no tendrán nada, excepto a las que se les haya asignado un valor de los leidos despues de cumplirse una condición.

Muchas gracias.


Leo Género:Masculino Tigre OfflineGalería Personal de 7programador7Ver perfil de usuarioEnviar mensaje privado
Guido_Garrote
Moderador


Edad: 35
Registrado: 14 Oct 2007
Mensajes: 3319
Ubicación: AHÍ!
Carrera: Civil
haiti.gif
MensajePublicado: Mie Abr 06, 2011 5:45 pm  Asunto:  (Sin Asunto) Responder citandoFin de la PáginaVolver arriba

Yo usaría 4 vectores, en uno almacenas todos los números y después con un ciclo pasas por cada número y verificas las condiciones, cuando cumple una guardas ese número en el vector correspondiente a esa condición y al final imprimis el contenido de cada vector...

_________________
Image

Piscis Género:Masculino Serpiente OcultoGalería Personal de Guido_GarroteVer perfil de usuarioEnviar mensaje privadoVisitar sitio web del usuarioMSN Messenger
7programador7
Nivel 2


Edad: 37
Registrado: 06 Abr 2011
Mensajes: 7
Ubicación: Jalisco
Carrera: Sistemas
mexico.gif
MensajePublicado: Mie Abr 06, 2011 10:39 pm  Asunto:  (Sin Asunto) Responder citandoFin de la PáginaVolver arriba

Gracias por responder.

Y cuando tenga los números en un arreglo como lo recorro?, es decir como quedaría el ciclo para pasar por cada número? y las condiciones todas se verifican dentro del mismo ciclo?


Leo Género:Masculino Tigre OfflineGalería Personal de 7programador7Ver perfil de usuarioEnviar mensaje privado
Guido_Garrote
Moderador


Edad: 35
Registrado: 14 Oct 2007
Mensajes: 3319
Ubicación: AHÍ!
Carrera: Civil
haiti.gif
MensajePublicado: Mie Abr 06, 2011 10:45 pm  Asunto:  (Sin Asunto) Responder citandoFin de la PáginaVolver arriba

depende en qué programes :P

en pseudo-código (que ñoñez que estoy diciendo) seria:
For i=1 to 10
If Vec(i)>100 then...

y ahi pones todas las condiciones...

_________________
Image

Piscis Género:Masculino Serpiente OcultoGalería Personal de Guido_GarroteVer perfil de usuarioEnviar mensaje privadoVisitar sitio web del usuarioMSN Messenger
7programador7
Nivel 2


Edad: 37
Registrado: 06 Abr 2011
Mensajes: 7
Ubicación: Jalisco
Carrera: Sistemas
mexico.gif
MensajePublicado: Mie Abr 06, 2011 11:25 pm  Asunto:  (Sin Asunto) Responder citandoFin de la PáginaVolver arriba

Entonces por ejemplo usando Java que es del que conozco un poco

sería de esta forma:

Código:

for (i = 1; i <= 10; i++)
{
   if (Vec[i] > 100)
    Mayores[i] = Vec[i];
  else
    if (Vec[i] >= 30 && Vec[i] <= 50)
      Rango[i] = Vec[i];
    else
      if (Vec[i] < 30)
        Menores[i] = Vec[i];
}

System.out.println ("Mayores a 100 estan: " + Mayores[i]);
System.out.println ("Entre 30 y 50 estan: " + Rango[i]);
System.out.println ("Menores a 30 estan: " + Menores[i] );



¿Sería mas o menos así?
Muchas gracias.


Leo Género:Masculino Tigre OfflineGalería Personal de 7programador7Ver perfil de usuarioEnviar mensaje privado
7programador7
Nivel 2


Edad: 37
Registrado: 06 Abr 2011
Mensajes: 7
Ubicación: Jalisco
Carrera: Sistemas
mexico.gif
MensajePublicado: Jue Abr 07, 2011 12:32 am  Asunto:  (Sin Asunto) Responder citandoFin de la PáginaVolver arriba

Aunque esto creo que estas impresiones solo mostrarán un número, más bien creo que debería imprimirlos dentro de un ciclo Repita-hasta. Quedando así:

Código:

for (i = 1; i < 11; i++)
{
   if (Vec[i] > 100)
    Mayores[i] = Vec[i];
  else
    if (Vec[i] >= 30 && Vec[i] <= 50)
      Rango[i] = Vec[i];
    else
      if (Vec[i] < 30)
        Menores[i] = Vec[i];
}

do
{
  System.out.println ("Mayores a 100 estan: " + Mayores[i]);
  System.out.println ("Entre 30 y 50 estan: " + Rango[i]);
  System.out.println ("Menores a 30 estan: " + Menores[i] );
  Mayores[i] = Mayores[i] + 1;
  Rango[i] = Rango[i] + 1;
  Menores[i] = Menores[i] + 1;
}
while (Mayores[i] < 11 &&  Rango[i] < 11 && Menores[i] < 11)


¿creen que si funcione de esta forma?
Gracias de nuevo.


Leo Género:Masculino Tigre OfflineGalería Personal de 7programador7Ver perfil de usuarioEnviar mensaje privado
Guido_Garrote
Moderador


Edad: 35
Registrado: 14 Oct 2007
Mensajes: 3319
Ubicación: AHÍ!
Carrera: Civil
haiti.gif
MensajePublicado: Jue Abr 07, 2011 7:55 am  Asunto:  (Sin Asunto) Responder citandoFin de la PáginaVolver arriba

Asi vas a estar imprimiendo los 10 espacios de los 3 vectores, de los cuales varios van a estar vacios.
Quizas te conviene armar tres contadores dentro del ciclo for para almacenar la cantidad de números que cumple cada una de las condiciones y después saber cuantos exactamente imprimir (con otros 3 ciclos for).

_________________
Image

Piscis Género:Masculino Serpiente OcultoGalería Personal de Guido_GarroteVer perfil de usuarioEnviar mensaje privadoVisitar sitio web del usuarioMSN Messenger
Mostrar mensajes de anteriores:      
Responder al tema Ver tema anteriorEnviar por mail a un amigo.Mostrar una Lista de los Usuarios que vieron este TemaGuardar este Tema como un archivoPrintable versionEntrá para ver tus mensajes privadosVer tema siguiente

Ver tema siguiente
Ver tema anterior
Podés publicar nuevos temas en este foro
No podés responder a temas en este foro
No podés editar tus mensajes en este foro
No podés borrar tus mensajes en este foro
No podés votar en encuestas en este foro
No Podéspostear archivos en este foro
No Podés bajar archivos de este foro


Todas las horas son ART, ARST (GMT - 3, GMT - 2 Horas)
Protected by CBACK CrackerTracker
365 Attacks blocked.

Powered by phpBB2 Plus, phpBB Styles and Kostenloses Forum based on phpBB © 2001/6 phpBB Group :: FI Theme :: Mods y Créditos

Foros-FIUBA está hosteado en Neolo.com Cloud Hosting

[ Tiempo: 0.2462s ][ Pedidos: 20 (0.1695s) ]