Franz Kafka
Kafka nació el 3 de julio en el seno de una familia judía de clase media de habla alemana en Praga, Bohemia—en aquella época parte del Imperio Austro-Húngaro. Su padre se llamaba Hermann Kafka (1852-1931) y era comerciante al por menor. El nombre de su madre era Julie Kafka (1856-1934), Lowy su apellido de soltera. Tuvo dos hermanos, Georg y Heinrich, ninguno de los cuales alcanzó los dos años de vida, muriendo antes de que Kafka cumpliera los seis años; y tres hermanas, Elli, Valli y Ottla.Aunque su idioma materno fue el alemán, Kafka también aprendió Checo, ya que su padre procedía de Osek cerca de Písek, donde era un miembro de la comunidad judia checo parlante ("Kafka" significa "chova" en checo) y quería que su hijo hablara con fluidez ambos idiomas. Kafka también tenía conocimiento del idioma y la cultura francesa. Uno de sus autores favoritos fue Flaubert; asimismo sentía afecto por Napoleón.De 1889 a 1893, Kafka asistió a la escuela primaria (Deutsche Knabenschule) en la calle Masná St. (Fleischmarkt) en Praga y posteriormente al instituto en Staroměstské náměstí (situado en Kinsky Palace), donde completo su examen de Bachillerato en 1901. A continuación estudió derecho en la Universidad de Charles en Praga, y obtuvo el doctorado en leyes en 1906. Posteriormente trabajó durante un año de pasante sin ser retribuido en una agencia de seguros de accidentes laborales y fue entonces cuando comenzó a escribir. A menudo se refirió a este trabajo como "Brotberuf"- un empleo tan sólo para ganar dinero.En 1917 comenzó a padecer tuberculosis, lo que le obligó a mantener frecuentes periodos de convalecencia durante los cuales recibió el apoyo de su familia, en especial de su hermana Ottla, con quien tenía mucho en común.Estatua de bronce de Franz Kafka, en PragaDurante su periodo escolar tuvo un papel activo en la organización de actividades literarias y sociales, destacando la organización y promoción de representaciones para el teatro judeo-alemán, a pesar de los recelos de incluso sus amigos más íntimos, como por ejemplo Max Brod, quién habitualemente le apoyaba en todo lo demás. Contrariamente a su temor de ser percibido de manera repulsiva tanto física como mentalmente, impresionaba a los demás con su aspecto infantil, pulcro y austero, su conducta tranquila y fría y su inteligencia, además de con su sentido del humor.Un tema de gran importancia en su obra es su relación son un padre autoritario. A principios de 1920, mantuvo una influyente aventura amorosa con la escritora y periodista checa Milena Jesenská y en 1923 se mudó durante un corto periodo de tiempo a Berlín con la esperanza de distanciarse de la influencia de su familia y concentrarse en su obra. Fue en esta ciudad donde conoció a Dora Diamant, una joven de 19 años descendiente de una familia judia ortodoxa, quién era lo suficientemente independiente como para haber escapado de su pasado en el ghetto. Dora se convirtió en su amante y tuvo una gran influencia en el interés de Kafka por el Talmud.Todos coinciden en señalar que Kafka sufrió depresión clínica y ansiedad social a lo largo de toda su vida. Asimismo, también padeció migrañas, insomnio, estreñimiento, furúnculos y otras enfermedades, todas ellas normalmente causadas por un estrés y una tensión excesiva. Kafka intentó contrarrestar todos esos problemas de salud mediante tratamientos naturistas, como por ejemplo siguiendo una dieta vegetariana y consumiendo grandes cantidades de leche sin pasteurizar, lo cual pudo ser el factor desencadenante de su tuberculosis.Tumba de Franz Kafka en Prag-StraschnitzApesar de todo ello, el estado de salud de Kafka empeoró debido a la tuberculosis. Regresó a Praga, acudiendo posteriormente a un sanatorio cerca de Viena para recibir tratamiento. Fue aquí donde murió el 3 de junio de 1924 al parecer de inanición. Sus problemas físicos le causaron molestias en la garganta lo que hacía que el tragar los alimentos le resultara muy doloroso. Al no haber sido aún desarrollada la terapia intravenosa no existía ningún modo de alimentarle (guarda cierta semejanza con la descripción tanto de Gregor en la Metamorfosis y como el personaje principal en A Hunger Artist). Su cuerpo fue llevado a Praga, donde fue enterrado el 11 de junio de 1924 en el Nuevo Cementerio Judio de Praga-Žižkov.Su ObraKafka tan solo publicó algunas historias cortas durante toda su vida , una pequeña parte de su trabajo, por lo que su obra pasó prácticamente inadvertida hasta después de su muerte. Con anterioridad a su fallecimiento, dio instrucciones a su amigo y albacea literario Max Brod de que destruyera todos sus manuscritos. Su amante, Dora Diamant, cumplió sus deseos pero tan sólo en parte. Dora guardó en secreto la mayoría de sus últimos escritos en su poder, incuyendo 20 cuadernos y 35 cartas, hasta que fueron confiscados por la Gestapo en 1933. Actualmente se halla en curso una búsqueda de los papeles desaparecidos de Kafka a escala internacional. Brod hizo caso omiso de las instrucciones de Kafka y en su lugar supervisó la publicación de la mayor parte de la obra que obraba en su poder, la cual pronto comenzó a despertar el interés y a obtener alabanzas por parte de la crítica.Todas sus obras publicadas, excepto varias cartas en checo dirigidas a Milena, se encuentran escritas en alemán.En su obra a menudo el protagonista se enfrenta a un mundo complejo, que se basa en reglas desconocidas, que nunca llega a comprender. El adjetivo kafkiano se utiliza a menudo para describir situaciones similares.Interpretación críticaHa habido muchos críticos que han intentado encontrarle sentido a la obra de Kafka interpretándola en función de ciertas escuelas de crítica literaria—como por ejemplo la modernista, la mágica realista etc. La aparente desesperación y la absurdidad de la que su obra parece estar impregnada se consideran emblemáticas del existencialismo. Unos han intentado hallar la influencia marxista en la satirización de la burocracia en obras tales como En la colonia penitenciaria, El proceso y El castillo, mientras que otros apuntan al anarquismo como el fundamento de inspiración para el individualismo anti-burocrático de Kafka. Sin embargo, otros han interpretado su obra bajo el prisma del Judaismo (ya que era judío y demostró un interés por la cultura judía, aunque sólo lo cultivó a una edad avanzada)—Borges hizo algunos comentarios perspicaces a este respecto; también se ha intentado darle una interpretación a través del Freudismo (debido a sus conflictos familiares); o como alegorias de una búsqueda metafísica de Dios (Thomas Mann fue el que propuso esta teoría). Se pone énfasis repetidamente en el tema de la alineación y de la persecución, y dicho énfasis—principalmente en la obra de Marthe Robert— estaba inspirado n parte en la contra-crítica de Gilles Deleuze y Félix Guattari, quienes mantenían que Kafka representaba mucho más que el estereotipo de una figura solitaria que escribía movida por la angustia, y que su trabajo era mucho más deliberado, subversivo y no obstante más "alegre" de lo que parecía ser. Los biógrafos han comentado que Kafka tenía costumbre de leer capítulos del libro en el que estaba trabajando a sus amigos más íntimos. Estas lecturas se centraban en el constante, pero muy a menudo ignorado, lado humorístico de su prosa. Milan Kundera se refiere al humor fundamentalmente surrealista de Kafka como el principal predecesor de posteriores artistas como por ejemplo Federico Fellini, Gabriel García Márquez, Carlos Fuentes y Salman Rushdie. A Márquez, tal y como el dijo, la lectura de La metamorfosis de Kafka le mostró que "era posible escribir de una manera diferente".
Monday, January 09, 2006
Recursividad
Se dice que algo es recursivo si se define en función de sí mismo o a sí mismo. También se dice que nunca se debe incluir la misma palabra en la definición de ésta. El caso es que las definiciones recursivas aparecen con frecuencia en matemáticas, e incluso en la vida real. Un ejemplo: basta con apuntar una cámara al monitor que muestra la imagen que muestra esa cámara. El efecto es verdaderamente curioso, en especial cuando se mueve la cámara alrededor del monitor.
En matemáticas, tenemos múltiples definiciones recursivas:
- Números naturales:
(1) 1 es número natural. (2) el siguiente número de un número natural es un número natural
- El factorial: n!, de un número natural (incluido el 0):
(1) si n = 0 entonces: 0! = 1 (2) si n > 0 entonces: n! = n · (n-1)!
Asimismo, puede definirse un programa en términos recursivos, como una serie de pasos básicos, o paso base (también conocido como condición de parada), y un paso recursivo, donde vuelve a llamarse al programa. En un computador, esta serie de pasos recursivos debe ser finita, terminando con un paso base. Es decir, a cada paso recursivo se reduce el número de pasos que hay que dar para terminar, llegando un momento en el que no se verifica la condición de paso a la recursividad. Ni el paso base ni el paso recursivo son necesariamente únicos.
Por otra parte, la recursividad también puede ser indirecta, si tenemos un procedimiento P que llama a otro Q y éste a su vez llama a P. También en estos casos debe haber una condición de parada.
Existen ciertas estructuras cuya definición es recursiva, tales como los árboles, y los algoritmos que utilizan árboles suelen ser en general recursivos.
¿Cuándo utilizar la recursión?
Para empezar, algunos lenguajes de programación no admiten el uso de recursividad, como por ejemplo el ensamblador o el FORTRAN. Es obvio que en ese caso se requerirá una solución no recursiva (iterativa). Tampoco se debe utilizar cuando la solución iterativa sea clara a simple vista. Sin embargo, en otros casos, obtener una solución iterativa es mucho más complicado que una solución recursiva, y es entonces cuando se puede plantear la duda de si merece la pena transformar la solución recursiva en otra iterativa. Posteriormente se explicará como eliminar la recursión, y se basa en almacenar en una pila los valores de las variables locales que haya para un procedimiento en cada llamada recursiva. Esto reduce la claridad del programa. Aún así, hay que considerar que el compilador transformará la solución recursiva en una iterativa, utilizando una pila, para cuando compile al código del computador.Por otra parte, casi todos los algoritmos basados en los esquemas de vuelta atrás y divide y vencerás son recursivos, pues de alguna manera parece mucho más natural una solución recursiva.
Aunque parezca mentira, es en general mucho más sencillo escribir un programa recursivo que su equivalente iterativo. Si el lector no se lo cree, posiblemente se deba a que no domine todavía la recursividad. Se propondrán diversos ejemplos de programas recursivos de diversa complejidad para acostumbrarse a la recursión.
En matemáticas, tenemos múltiples definiciones recursivas:
- Números naturales:
(1) 1 es número natural. (2) el siguiente número de un número natural es un número natural
- El factorial: n!, de un número natural (incluido el 0):
(1) si n = 0 entonces: 0! = 1 (2) si n > 0 entonces: n! = n · (n-1)!
Asimismo, puede definirse un programa en términos recursivos, como una serie de pasos básicos, o paso base (también conocido como condición de parada), y un paso recursivo, donde vuelve a llamarse al programa. En un computador, esta serie de pasos recursivos debe ser finita, terminando con un paso base. Es decir, a cada paso recursivo se reduce el número de pasos que hay que dar para terminar, llegando un momento en el que no se verifica la condición de paso a la recursividad. Ni el paso base ni el paso recursivo son necesariamente únicos.
Por otra parte, la recursividad también puede ser indirecta, si tenemos un procedimiento P que llama a otro Q y éste a su vez llama a P. También en estos casos debe haber una condición de parada.
Existen ciertas estructuras cuya definición es recursiva, tales como los árboles, y los algoritmos que utilizan árboles suelen ser en general recursivos.
¿Cuándo utilizar la recursión?
Para empezar, algunos lenguajes de programación no admiten el uso de recursividad, como por ejemplo el ensamblador o el FORTRAN. Es obvio que en ese caso se requerirá una solución no recursiva (iterativa). Tampoco se debe utilizar cuando la solución iterativa sea clara a simple vista. Sin embargo, en otros casos, obtener una solución iterativa es mucho más complicado que una solución recursiva, y es entonces cuando se puede plantear la duda de si merece la pena transformar la solución recursiva en otra iterativa. Posteriormente se explicará como eliminar la recursión, y se basa en almacenar en una pila los valores de las variables locales que haya para un procedimiento en cada llamada recursiva. Esto reduce la claridad del programa. Aún así, hay que considerar que el compilador transformará la solución recursiva en una iterativa, utilizando una pila, para cuando compile al código del computador.Por otra parte, casi todos los algoritmos basados en los esquemas de vuelta atrás y divide y vencerás son recursivos, pues de alguna manera parece mucho más natural una solución recursiva.
Aunque parezca mentira, es en general mucho más sencillo escribir un programa recursivo que su equivalente iterativo. Si el lector no se lo cree, posiblemente se deba a que no domine todavía la recursividad. Se propondrán diversos ejemplos de programas recursivos de diversa complejidad para acostumbrarse a la recursión.
Listas ordenadas
Listas ordenadas
Las listas ordenadas son aquellas en las que la posición de cada elemento depende de su contenido. Por ejemplo, podemos tener una lista enlazada que contenga el nombre y apellidos de un alumno y queremos que los elementos -los alumnos- estén en la lista en orden alfabético.
La creación de una lista ordenada es igual que antes:
struct lista *L;
L = NULL;
Cuando haya que insertar un nuevo elemento en la lista ordenada hay que hacerlo en el lugar que le corresponda, y esto depende del orden y de la clave escogidos. Este proceso se realiza en tres pasos:1.- Localizar el lugar correspondiente al elemento a insertar. Se utilizan dos punteros: anterior y actual, que garanticen la correcta posición de cada enlace.2.- Reservar memoria para él (puede hacerse como primer paso). Se usa un puntero auxiliar (nuevo) para reservar memoria.3.- Enlazarlo. Esta es la parte más complicada, porque hay que considerar la diferencia de insertar al principio, no importa si la lista está vacía, o insertar en otra posición. Se utilizan los tres punteros antes definidos para actualizar los enlaces.
A continuación se expone un programa que realiza la inserción de un elemento en una lista ordenada. Suponemos claves de tipo entero ordenadas ascendentemente.
Las listas ordenadas son aquellas en las que la posición de cada elemento depende de su contenido. Por ejemplo, podemos tener una lista enlazada que contenga el nombre y apellidos de un alumno y queremos que los elementos -los alumnos- estén en la lista en orden alfabético.
La creación de una lista ordenada es igual que antes:
struct lista *L;
L = NULL;
Cuando haya que insertar un nuevo elemento en la lista ordenada hay que hacerlo en el lugar que le corresponda, y esto depende del orden y de la clave escogidos. Este proceso se realiza en tres pasos:1.- Localizar el lugar correspondiente al elemento a insertar. Se utilizan dos punteros: anterior y actual, que garanticen la correcta posición de cada enlace.2.- Reservar memoria para él (puede hacerse como primer paso). Se usa un puntero auxiliar (nuevo) para reservar memoria.3.- Enlazarlo. Esta es la parte más complicada, porque hay que considerar la diferencia de insertar al principio, no importa si la lista está vacía, o insertar en otra posición. Se utilizan los tres punteros antes definidos para actualizar los enlaces.
A continuación se expone un programa que realiza la inserción de un elemento en una lista ordenada. Suponemos claves de tipo entero ordenadas ascendentemente.
Listas
Listas
Son formas o métodos de manipular datos o información. Las estructuras ayudan a manipular datos en la memoria de manera más eficiente. Se utilizan variables escalares y variables arreglo.
Hay distintas formas o maneras de estructuras, las cuales son listas, pilas, colas, árboles, grafos. Estos se usan para manipular información. Ninguno de estos existen directamente, ya que solo se simulan.
Las listas se clasifican en tres:
* Enlazadas
* Enlazadas circulares
* Enlazadas circulares con cabecera
Y los árboles se clasifican en 2:
* Generales
* Binarios
Para cada estructura hay cuatro tipos de operaciones o procesos básicos, los cuales son:
* Recorrido
* Búsqueda
* Inserción
* Eliminación
Cada una de éstas, son básicas para muchas de las estructuras que mencionamos ya.
El recorrido consiste, como su nombre lo dice, en recorrer toda la lista o bien arreglo que se tenga. Este trabaja con dos arrays, info, enlace y comienzo. El info se le asigna o se le llama a los datos que tengamos en una lista, ya sea nombre, edad, sexo, etc. Al enlace le llamaremos al orden que se va llevando en apuntadores para desplegar los datos o información (info) que se tiene en la lista. Y a comienzo le llamaremos al primer dato que empezaremos.
Son formas o métodos de manipular datos o información. Las estructuras ayudan a manipular datos en la memoria de manera más eficiente. Se utilizan variables escalares y variables arreglo.
Hay distintas formas o maneras de estructuras, las cuales son listas, pilas, colas, árboles, grafos. Estos se usan para manipular información. Ninguno de estos existen directamente, ya que solo se simulan.
Las listas se clasifican en tres:
* Enlazadas
* Enlazadas circulares
* Enlazadas circulares con cabecera
Y los árboles se clasifican en 2:
* Generales
* Binarios
Para cada estructura hay cuatro tipos de operaciones o procesos básicos, los cuales son:
* Recorrido
* Búsqueda
* Inserción
* Eliminación
Cada una de éstas, son básicas para muchas de las estructuras que mencionamos ya.
El recorrido consiste, como su nombre lo dice, en recorrer toda la lista o bien arreglo que se tenga. Este trabaja con dos arrays, info, enlace y comienzo. El info se le asigna o se le llama a los datos que tengamos en una lista, ya sea nombre, edad, sexo, etc. Al enlace le llamaremos al orden que se va llevando en apuntadores para desplegar los datos o información (info) que se tiene en la lista. Y a comienzo le llamaremos al primer dato que empezaremos.
Tipos basicos de memoria RAM
Los tipos basicos de memoria ram
Es posible obtener memorias semiconductoras en una amplia gama de velocidades. Sus tiempos de ciclo varían desde unos cuantos cientos de nanosegundos, hasta unas cuantas decenas de nanosegundos. Cuando se presentaron por primera vez, a fines de la década de 1960, eran mucho más costosas que las memorias de núcleo magnético que reemplazaron. Debido a los avances de la tecnología de VLSI (Very Large Scale Integration – integración a muy gran escala), el costo de las memorias semiconductoras ha descendido en forma notable.
Existen dos tipos de memoria RAM: la SRAM o RAM estática; y la DRAM o RAM dinámica.
RAM estática o SRAM
El almacenamiento en RAM estática se basa en circuitos lógicos denominados flip-flop, que retienen la información almacenada en ellos mientras haya energía suficiente para hacer funcionar el dispositivo (ya sean segundos, minutos, horas, o aún dias). Un chip de RAM estática puede almacenar tan sólo una cuarta parte de la información que puede almacenar un chip de RAM dinámica de la misma complejidad, pero la RAM estática no requiere ser actualizada y es normalmente mucho más rápida que la RAM dinámica (el tiempo de ciclo de la SRAM es de 8 a 16 veces más rápido que las SRAM). También es más cara, por lo que se reserva generalmente para su uso en la memoria de acceso aleatorio(caché).
RAM dinámica o DRAM
Supongamos que nuestro programa debe manipular estructuras de datos de longitud desconocida. Un ejemplo simple podría ser el de un programa que lee las líneas de un archivo y las ordena. Por tanto, deberemos leer un número indeterminado de líneas, y tras leer la última, ordenarlas. Una manera de manejar ese ``número indeterminado'', sería declarar una constante MAX_LINEAS, darle un valor vergonzosamente grande, y declarar un array de tamaño MAX_LINEAS. Esto, obviamente, es muy ineficiente (y feo). Nuestro programa no sólo quedaría limitado por ese valor máximo, sino que además gastaría esa enorme cantidad de memoria para procesar hasta el más pequeño de los ficheros.
La solución consiste en utilizar memoria dinámica. La memoria dinámica es un espacio de almacenamiento que se solicita en tiempo de ejecución5.4. De esa manera, a medida que el proceso va necesitando espacio para más líneas, va solicitando más memoria al sistema operativo para guardarlas. El medio para manejar la memoria que otorga el sistema operativo, es el puntero, puesto que no podemos saber en tiempo de compilación5.5dónde nos dará huecos el sistema operativo (en la memoria de nuestro PC).
Las RAM dinámicas almacenan la información en circuitos integrados que contienen condensadores, que pueden estar cargados o descargados. Como éstos pierden su carga en el transcurso del tiempo, se debe incluir los circuitos necesarios para "refrescar" los chips de RAM cada pocos milisegundos, para impedir la pérdida de su información. Algunas memorias dinámicas tienen la lógica del refresco en la propia pastilla, dando así gran capacidad y facilidad de conexión a los circuitos. Estas pastillas se denominan casi estáticas. Mientras la RAM dinámica se refresca, el procesador no puede leerla. Si intenta hacerlo en ese momento, se verá forzado a esperar. Como son relativamente sencillas, las RAM dinámicas suelen utilizarse más que las RAM estáticas, a pesar de ser más lentas.
Es posible obtener memorias semiconductoras en una amplia gama de velocidades. Sus tiempos de ciclo varían desde unos cuantos cientos de nanosegundos, hasta unas cuantas decenas de nanosegundos. Cuando se presentaron por primera vez, a fines de la década de 1960, eran mucho más costosas que las memorias de núcleo magnético que reemplazaron. Debido a los avances de la tecnología de VLSI (Very Large Scale Integration – integración a muy gran escala), el costo de las memorias semiconductoras ha descendido en forma notable.
Existen dos tipos de memoria RAM: la SRAM o RAM estática; y la DRAM o RAM dinámica.
RAM estática o SRAM
El almacenamiento en RAM estática se basa en circuitos lógicos denominados flip-flop, que retienen la información almacenada en ellos mientras haya energía suficiente para hacer funcionar el dispositivo (ya sean segundos, minutos, horas, o aún dias). Un chip de RAM estática puede almacenar tan sólo una cuarta parte de la información que puede almacenar un chip de RAM dinámica de la misma complejidad, pero la RAM estática no requiere ser actualizada y es normalmente mucho más rápida que la RAM dinámica (el tiempo de ciclo de la SRAM es de 8 a 16 veces más rápido que las SRAM). También es más cara, por lo que se reserva generalmente para su uso en la memoria de acceso aleatorio(caché).
RAM dinámica o DRAM
Supongamos que nuestro programa debe manipular estructuras de datos de longitud desconocida. Un ejemplo simple podría ser el de un programa que lee las líneas de un archivo y las ordena. Por tanto, deberemos leer un número indeterminado de líneas, y tras leer la última, ordenarlas. Una manera de manejar ese ``número indeterminado'', sería declarar una constante MAX_LINEAS, darle un valor vergonzosamente grande, y declarar un array de tamaño MAX_LINEAS. Esto, obviamente, es muy ineficiente (y feo). Nuestro programa no sólo quedaría limitado por ese valor máximo, sino que además gastaría esa enorme cantidad de memoria para procesar hasta el más pequeño de los ficheros.
La solución consiste en utilizar memoria dinámica. La memoria dinámica es un espacio de almacenamiento que se solicita en tiempo de ejecución5.4. De esa manera, a medida que el proceso va necesitando espacio para más líneas, va solicitando más memoria al sistema operativo para guardarlas. El medio para manejar la memoria que otorga el sistema operativo, es el puntero, puesto que no podemos saber en tiempo de compilación5.5dónde nos dará huecos el sistema operativo (en la memoria de nuestro PC).
Las RAM dinámicas almacenan la información en circuitos integrados que contienen condensadores, que pueden estar cargados o descargados. Como éstos pierden su carga en el transcurso del tiempo, se debe incluir los circuitos necesarios para "refrescar" los chips de RAM cada pocos milisegundos, para impedir la pérdida de su información. Algunas memorias dinámicas tienen la lógica del refresco en la propia pastilla, dando así gran capacidad y facilidad de conexión a los circuitos. Estas pastillas se denominan casi estáticas. Mientras la RAM dinámica se refresca, el procesador no puede leerla. Si intenta hacerlo en ese momento, se verá forzado a esperar. Como son relativamente sencillas, las RAM dinámicas suelen utilizarse más que las RAM estáticas, a pesar de ser más lentas.
Alugunas aplicasiones de USB
Algunas aplicaciones del puerto USB
Este revolucionario disco usb le permite almacenar hasta 64 mb de datos, archivos e información. Es mas pequeño que un bolígrafo y es totalmente seguro. Puede grabarse millones de veces y es totalmente seguro. El ordenador lo ve como un disco mas al que puede leer, escribir, copiar y formatear. Compatible con PC y Macintosh. Windows 95,98,Me, 2000, NT y XP. Totalmente inmune a los campos magnéticos, el polvo, la suciedad, los golpes y las vibraciones. En Windows Millenium, 2000 y XP no necesita drivers. Precio : US 118 Pesos : 86000 aprox.
Ahora puede utilizar el monitor de su PC como monitor de vídeo. Admite señales de vídeo compuesto y SVHS tanto de PAL como de NTSC. Funciona incluso con el ordenador apagado.
Precio: US 124 Pesos : 91000 aprox.
GrabBee es un dispositivo de captura de vídeo y audio USB. Su tamaño es tan reducido que le cabrá en la palma de la mano, y resulta ideal tanto para equipos de sobremesa como para portátiles, ya que se alimenta directamente del bus USB. AHORA NUEVO MODELO CON AUDIO
Precio : US 85 Pesos : 54000 aprox.
PCBridge permite la transferencia instantánea de ficheros a alta velocidad ( 8 Mbps) entre dos ordenadores PC. Su conexión USB evita la necesidad de instalar tarjetas de red. Compatible con Windows 95, Windows 98 y NT
Precio : US 39 Pesos : 28000 aprox.
Este cable convertidor de usb a serie rs232, le permite conectar dispositivos serie en ordenadores que no tienen puerto serie o lo tienen ocupado. Funciona en Windows 98, Me, 2000. Velocidad del puerto: de 1200 a 115200 baudios.
Precio : US 29 Pesos : 21000 aprox.
Cable convertidor de usb a puerto paralelo, que permite conectar una impresora con conexión centronics a un ordenador que disponga de conexión usb. Compatible con Windows 95, 98, ME y 2000. Mac OS 8.6, OS 9.0 o superior. Se alimenta directamente desde el propio bus usb. Sencillísimo.
Precio : US 30 Pesos 22000 aprox.
USB
USB
USB Universal Serial Bus es una interfase plug&play entre la PC y ciertos dispositivos tales como teclados, mouses, scanner, impresoras, módems, placas de sonido, camaras,etc) .
Una característica importante es que permite a los dispositivos trabajar a velocidades mayores, en promedio a unos 12 Mbps, esto es más o menos de 3 a 5 veces más rápido que un dispositivo de puerto paralelo y de 20 a 40 veces más rápido que un dispositivo de puerto serial.
Como Funciona
Trabaja como interfaz para transmisión de datos y distribución de energía, que ha sido introducida en el mercado de PC´s y periféricos para mejorar las lentas interfaces serie (RS-232) y paralelo. Esta interfaz de 4 hilos, 12 Mbps y "plug and play", distribuye 5V para alimentación, transmite datos y está siendo adoptada rápidamente por la industria informática.
Es un bus basado en el paso de un testigo, semejante a otros buses como los de las redes locales en anillo con paso de testigo y las redes FDDI . El controlador USB distribuye testigos por el bus . El dispositivo cuya dirección coincide con la que porta el testigo responde aceptando o enviando datos al controlador . Este también gestiona la distribución de energía a los periféricos que lo requieran .
Emplea una topología de estrellas apiladas que permite el funcionamiento simultáneo de 127 dispositivos a la vez . En la raíz o vértice de las capas, está el controlador anfitrión o host que controla todo el tráfico que circula por el bus . Esta topología permite a muchos dispositivos conectarse a un único bus lógico sin que los dispositivos que se encuentran más abajo en la pirámide sufran retardo . A diferencia de otras arquitecturas, USB no es un bus de almacenamiento y envío, de forma que no se produce retardo en el envío de un paquete de datos hacia capas inferiores .
El sistema de bus serie universal USB consta de tres componentes:
Controlador
Hubs o Concentradores
Periféricos
Controlador
Reside dentro del PC y es responsable de las comunicaciones entre los periféricos USB y la CPU del PC . Es también responsable de la admisión de los periféricos dentro del bus, tanto si se detecta una conexión como una desconexión . Para cada periférico añadido, el controlador determina su tipo y le asigna una dirección lógica para utilizarla siempre en las comunicaciones con el mismo . Si se producen errores durante la conexión, el controlador lo comunica a la CPU, que, a su vez, lo transmite al usuario . Una vez se ha producido la conexión correctamente, el controlador asigna al periférico los recursos del sistema que éste precise para su funcionamiento .
El controlador también es responsable del control de flujo de datos entre el periférico y la CPU . Concentradores o hubs
Son distribuidores inteligentes de datos y alimentación, y hacen posible la conexión a un único puerto USB de 127 dispositivos . De una forma selectiva reparten datos y alimentación hacia sus puertas descendentes y permiten la comunicación hacia su puerta de retorno o ascendente . Un hub de 4 puertos, por ejemplo, acepta datos del PC para un periférico por su puerta de retorno o ascendente y los distribuye a las 4 puertas descendentes si fuera necesario .
Los concentradores también permiten las comunicaciones desde el periférico hacia el PC, aceptando datos en las 4 puertas descendentes y enviándolos hacia el PC por la puerta de retorno .
Además del controlador, el PC también contiene el concentrador raíz . Este es el primer concentrador de toda la cadena que permite a los datos y a la energía pasar a uno o dos conectores USB del PC, y de allí a los 127 periféricos que, como máximo, puede soportar el sistema . Esto es posible añadiendo concentradores adicionales . Por ejemplo, si el PC tiene una única puerta USB y a ella le conectamos un hub o concentrador de 4 puertas, el PC se queda sin más puertas disponibles . Sin embargo, el hub de 4 puertas permite realizar 4 conexiones descendentes . Conectando otro hub de 4 puertas a una de las 4 puertas del primero, habremos creado un total de 7 puertas a partir de una puerta del PC . De esta forma, es decir, añadiendo concentradores, el PC puede soportar hasta 127 periféricos USB .
La mayoría de los concentradores se encontrarán incorporados en los periféricos . Por ejemplo, un monitor USB puede contener un concentrador de 7 puertas incluido dentro de su chasis . El monitor utilizará una de ellas para sus datos y control y le quedarán 6 para conectar allí otros periféricos .
Periféricos
USB soporta periféricos de baja y media velocidad . Empleando dos velocidades para la transmisión de datos de 1 . 5 y 12 Mbps se consigue una utilización más eficiente de sus recursos . Los periféricos de baja velocidad tales como teclados, ratones, joysticks, y otros periféricos para juegos, no requieren 12 Mbps . Empleando para ellos 1,5 Mbps, se puede dedicar más recursos del sistema a periféricos tales como monitores, impresoras, módems, scanner, equipos de audio . . . , que precisan de velocidades más altas para transmitir mayor volumen de datos o datos cuya dependencia temporal es más estricta .
En las figuras 3 y 4 se puede ver cómo los hubs proporcionan conectividad a toda una serie de dispositivos periféricos
USB Universal Serial Bus es una interfase plug&play entre la PC y ciertos dispositivos tales como teclados, mouses, scanner, impresoras, módems, placas de sonido, camaras,etc) .
Una característica importante es que permite a los dispositivos trabajar a velocidades mayores, en promedio a unos 12 Mbps, esto es más o menos de 3 a 5 veces más rápido que un dispositivo de puerto paralelo y de 20 a 40 veces más rápido que un dispositivo de puerto serial.
Como Funciona
Trabaja como interfaz para transmisión de datos y distribución de energía, que ha sido introducida en el mercado de PC´s y periféricos para mejorar las lentas interfaces serie (RS-232) y paralelo. Esta interfaz de 4 hilos, 12 Mbps y "plug and play", distribuye 5V para alimentación, transmite datos y está siendo adoptada rápidamente por la industria informática.
Es un bus basado en el paso de un testigo, semejante a otros buses como los de las redes locales en anillo con paso de testigo y las redes FDDI . El controlador USB distribuye testigos por el bus . El dispositivo cuya dirección coincide con la que porta el testigo responde aceptando o enviando datos al controlador . Este también gestiona la distribución de energía a los periféricos que lo requieran .
Emplea una topología de estrellas apiladas que permite el funcionamiento simultáneo de 127 dispositivos a la vez . En la raíz o vértice de las capas, está el controlador anfitrión o host que controla todo el tráfico que circula por el bus . Esta topología permite a muchos dispositivos conectarse a un único bus lógico sin que los dispositivos que se encuentran más abajo en la pirámide sufran retardo . A diferencia de otras arquitecturas, USB no es un bus de almacenamiento y envío, de forma que no se produce retardo en el envío de un paquete de datos hacia capas inferiores .
El sistema de bus serie universal USB consta de tres componentes:
Controlador
Hubs o Concentradores
Periféricos
Controlador
Reside dentro del PC y es responsable de las comunicaciones entre los periféricos USB y la CPU del PC . Es también responsable de la admisión de los periféricos dentro del bus, tanto si se detecta una conexión como una desconexión . Para cada periférico añadido, el controlador determina su tipo y le asigna una dirección lógica para utilizarla siempre en las comunicaciones con el mismo . Si se producen errores durante la conexión, el controlador lo comunica a la CPU, que, a su vez, lo transmite al usuario . Una vez se ha producido la conexión correctamente, el controlador asigna al periférico los recursos del sistema que éste precise para su funcionamiento .
El controlador también es responsable del control de flujo de datos entre el periférico y la CPU . Concentradores o hubs
Son distribuidores inteligentes de datos y alimentación, y hacen posible la conexión a un único puerto USB de 127 dispositivos . De una forma selectiva reparten datos y alimentación hacia sus puertas descendentes y permiten la comunicación hacia su puerta de retorno o ascendente . Un hub de 4 puertos, por ejemplo, acepta datos del PC para un periférico por su puerta de retorno o ascendente y los distribuye a las 4 puertas descendentes si fuera necesario .
Los concentradores también permiten las comunicaciones desde el periférico hacia el PC, aceptando datos en las 4 puertas descendentes y enviándolos hacia el PC por la puerta de retorno .
Además del controlador, el PC también contiene el concentrador raíz . Este es el primer concentrador de toda la cadena que permite a los datos y a la energía pasar a uno o dos conectores USB del PC, y de allí a los 127 periféricos que, como máximo, puede soportar el sistema . Esto es posible añadiendo concentradores adicionales . Por ejemplo, si el PC tiene una única puerta USB y a ella le conectamos un hub o concentrador de 4 puertas, el PC se queda sin más puertas disponibles . Sin embargo, el hub de 4 puertas permite realizar 4 conexiones descendentes . Conectando otro hub de 4 puertas a una de las 4 puertas del primero, habremos creado un total de 7 puertas a partir de una puerta del PC . De esta forma, es decir, añadiendo concentradores, el PC puede soportar hasta 127 periféricos USB .
La mayoría de los concentradores se encontrarán incorporados en los periféricos . Por ejemplo, un monitor USB puede contener un concentrador de 7 puertas incluido dentro de su chasis . El monitor utilizará una de ellas para sus datos y control y le quedarán 6 para conectar allí otros periféricos .
Periféricos
USB soporta periféricos de baja y media velocidad . Empleando dos velocidades para la transmisión de datos de 1 . 5 y 12 Mbps se consigue una utilización más eficiente de sus recursos . Los periféricos de baja velocidad tales como teclados, ratones, joysticks, y otros periféricos para juegos, no requieren 12 Mbps . Empleando para ellos 1,5 Mbps, se puede dedicar más recursos del sistema a periféricos tales como monitores, impresoras, módems, scanner, equipos de audio . . . , que precisan de velocidades más altas para transmitir mayor volumen de datos o datos cuya dependencia temporal es más estricta .
En las figuras 3 y 4 se puede ver cómo los hubs proporcionan conectividad a toda una serie de dispositivos periféricos
busqueda binaria
5.2 Búsqueda binaria
Se puede aplicar tanto a datos en listas lineales como en árboles binarios de búsqueda. Los prerrequisitos principales para la búsqueda binaria son:
La lista debe estar ordenada en un orden especifíco de acuerdo al valor de la llave.
Debe conocerse el número de registros.
Algoritmo
Se compara la llave buscada con la llave localizada al centro del arreglo.
Si la llave analizada corresponde a la buscada fin de búsqueda si no.
Si la llave buscada es menor que la analizada repetir proceso en mitad superior, sino en la mitad inferior.
El proceso de partir por la mitad el arreglo se repite hasta encontrar el registro o hasta que el tamaño de la lista restante sea cero , lo cual implica que el valor de la llave buscada no esta en la lista.
El esfuerzo máximo para este algoritmo es de log2n. El mínimo de 1 y en promedio ½ log2 n.
Se puede aplicar tanto a datos en listas lineales como en árboles binarios de búsqueda. Los prerrequisitos principales para la búsqueda binaria son:
La lista debe estar ordenada en un orden especifíco de acuerdo al valor de la llave.
Debe conocerse el número de registros.
Algoritmo
Se compara la llave buscada con la llave localizada al centro del arreglo.
Si la llave analizada corresponde a la buscada fin de búsqueda si no.
Si la llave buscada es menor que la analizada repetir proceso en mitad superior, sino en la mitad inferior.
El proceso de partir por la mitad el arreglo se repite hasta encontrar el registro o hasta que el tamaño de la lista restante sea cero , lo cual implica que el valor de la llave buscada no esta en la lista.
El esfuerzo máximo para este algoritmo es de log2n. El mínimo de 1 y en promedio ½ log2 n.
busqueda hash
Búsqueda por hash
Hasta ahora las técnicas de localización de registros vistas, emplean un proceso de búsqueda que implica cierto tiempo y esfuerzo. El siguiente método nos permite encontrar directamente el registro buscado.
La idea básica de este método consiste en aplicar una función que traduce un conjunto de posibles valores llave en un rango de direcciones relativas. Un problema potencial encontrado en este proceso, es que tal función no puede ser uno a uno; las direcciones calculadas pueden no ser todas únicas, cuando R(k1 )= R(k2)
Pero : K1 diferente de K2 decimos que hay una colisión. A dos llaves diferentes que les corresponda la misma dirección relativa se les llama sinónimos.
A las técnicas de calculo de direcciones también se les conoce como :
Técnicas de almacenamiento disperso
Técnicas aleatorias
Métodos de transformación de llave - a- dirección
Técnicas de direccionamiento directo
Métodos de tabla Hash
Métodos de Hashing
Pero el término mas usado es el de hashing. Al cálculo que se realiza para obtener una dirección a partir de una llave se le conoce como función hash.
Ventaja
Se pueden usar los valores naturales de la llave, puesto que se traducen internamente a direcciones fáciles de localizar
Se logra independencia lógica y física, debido a que los valores de las llaves son independientes del espacio de direcciones
No se requiere almacenamiento adicional para los índices.
Desventajas
No pueden usarse registros de longitud variable
El archivo no esta clasificado
No permite llaves repetidas
Solo permite acceso por una sola llave
Costos
Tiempo de procesamiento requerido para la aplicación de la función hash
Tiempo de procesamiento y los accesos E/S requeridos para solucionar las colisiones.
La eficiencia de una función hash depende de:
La distribución de los valores de llave que realmente se usan
El numero de valores de llave que realmente están en uso con respecto al tamaño del espacio de direcciones
El numero de registros que pueden almacenarse en una dirección dad sin causar una colisión
La técnica usada para resolver el problema de las colisiones
Las funciones hash mas comunes son:
Residuo de la división
Medio del cuadrado
Pliegue
Hasta ahora las técnicas de localización de registros vistas, emplean un proceso de búsqueda que implica cierto tiempo y esfuerzo. El siguiente método nos permite encontrar directamente el registro buscado.
La idea básica de este método consiste en aplicar una función que traduce un conjunto de posibles valores llave en un rango de direcciones relativas. Un problema potencial encontrado en este proceso, es que tal función no puede ser uno a uno; las direcciones calculadas pueden no ser todas únicas, cuando R(k1 )= R(k2)
Pero : K1 diferente de K2 decimos que hay una colisión. A dos llaves diferentes que les corresponda la misma dirección relativa se les llama sinónimos.
A las técnicas de calculo de direcciones también se les conoce como :
Técnicas de almacenamiento disperso
Técnicas aleatorias
Métodos de transformación de llave - a- dirección
Técnicas de direccionamiento directo
Métodos de tabla Hash
Métodos de Hashing
Pero el término mas usado es el de hashing. Al cálculo que se realiza para obtener una dirección a partir de una llave se le conoce como función hash.
Ventaja
Se pueden usar los valores naturales de la llave, puesto que se traducen internamente a direcciones fáciles de localizar
Se logra independencia lógica y física, debido a que los valores de las llaves son independientes del espacio de direcciones
No se requiere almacenamiento adicional para los índices.
Desventajas
No pueden usarse registros de longitud variable
El archivo no esta clasificado
No permite llaves repetidas
Solo permite acceso por una sola llave
Costos
Tiempo de procesamiento requerido para la aplicación de la función hash
Tiempo de procesamiento y los accesos E/S requeridos para solucionar las colisiones.
La eficiencia de una función hash depende de:
La distribución de los valores de llave que realmente se usan
El numero de valores de llave que realmente están en uso con respecto al tamaño del espacio de direcciones
El numero de registros que pueden almacenarse en una dirección dad sin causar una colisión
La técnica usada para resolver el problema de las colisiones
Las funciones hash mas comunes son:
Residuo de la división
Medio del cuadrado
Pliegue
Busque secuencial
5.1 Búsqueda secuencial
La búsqueda es el proceso de localizar un registro (elemento) con un valor de llave particular. La búsqueda termina exitosamente cuando se localiza el registro que contenga la llave buscada, o termina sin éxito, cuando se determina que no aparece ningún registro con esa llave.
Búsqueda secuencial, también se le conoce como búsqueda lineal. Supongamos una colección de registros organizados como una lista lineal. El algoritmo básico de búsqueda secuencial consiste en empezar al inicio de la lista e ir a través de cada registro hasta encontrar la llave indicada (k), o hasta al final de la lista.
La situación óptima es que el registro buscado sea el primero en ser examinado. El peor caso es cuando las llaves de todos los n registros son comparados con k (lo que se busca). El caso promedio es n/2 comparaciones.
Este método de búsqueda es muy lento, pero si los datos no están en orden es el único método que puede emplearse para hacer las búsquedas. Si los valores de la llave no son únicos, para encontrar todos los registros con una llave particular, se requiere buscar en toda la lista.
Mejoras en la eficiencia de la búsqueda secuencial
1)Muestreo de acceso
Este método consiste en observar que tan frecuentemente se solicita cada registro y ordenarlos de acuerdo a las probabilidades de acceso detectadas.
2)Movimiento hacia el frente
Este esquema consiste en que la lista de registros se reorganicen dinámicamente. Con este método, cada vez que búsqueda de una llave sea exitosa, el registro correspondiente se mueve a la primera posición de la lista y se recorren una posición hacia abajo los que estaban antes que el.
3)Transposición
Este es otro esquema de reorganización dinámica que consiste en que, cada vez que se lleve a cabo una búsqueda exitosa, el registro correspondiente se intercambia con el anterior. Con este procedimiento, entre mas accesos tenga el registro, mas rápidamente avanzara hacia la primera posición. Comparado con el método de movimiento al frente, el método requiere mas tiempo de actividad para reorganizar al conjunto de registros . Una ventaja de método de transposición es que no permite que el requerimiento aislado de un registro, cambie de posición todo el conjunto de registros. De hecho, un registro debe ganar poco a poco su derecho a alcanzar el inicio de la lista.
4)Ordenamiento
Una forma de reducir el numero de comparaciones esperadas cuando hay una significativa frecuencia de búsqueda sin éxito es la de ordenar los registros en base al valor de la llave. Esta técnica es útil cuando la lista es una lista de excepciones, tales como una lista de decisiones, en cuyo caso la mayoría de las búsquedas no tendrán éxito. Con este método una búsqueda sin éxito termina cuando se encuentra el primer valor de la llave mayor que el buscado, en lugar de la final de la lista.
La búsqueda es el proceso de localizar un registro (elemento) con un valor de llave particular. La búsqueda termina exitosamente cuando se localiza el registro que contenga la llave buscada, o termina sin éxito, cuando se determina que no aparece ningún registro con esa llave.
Búsqueda secuencial, también se le conoce como búsqueda lineal. Supongamos una colección de registros organizados como una lista lineal. El algoritmo básico de búsqueda secuencial consiste en empezar al inicio de la lista e ir a través de cada registro hasta encontrar la llave indicada (k), o hasta al final de la lista.
La situación óptima es que el registro buscado sea el primero en ser examinado. El peor caso es cuando las llaves de todos los n registros son comparados con k (lo que se busca). El caso promedio es n/2 comparaciones.
Este método de búsqueda es muy lento, pero si los datos no están en orden es el único método que puede emplearse para hacer las búsquedas. Si los valores de la llave no son únicos, para encontrar todos los registros con una llave particular, se requiere buscar en toda la lista.
Mejoras en la eficiencia de la búsqueda secuencial
1)Muestreo de acceso
Este método consiste en observar que tan frecuentemente se solicita cada registro y ordenarlos de acuerdo a las probabilidades de acceso detectadas.
2)Movimiento hacia el frente
Este esquema consiste en que la lista de registros se reorganicen dinámicamente. Con este método, cada vez que búsqueda de una llave sea exitosa, el registro correspondiente se mueve a la primera posición de la lista y se recorren una posición hacia abajo los que estaban antes que el.
3)Transposición
Este es otro esquema de reorganización dinámica que consiste en que, cada vez que se lleve a cabo una búsqueda exitosa, el registro correspondiente se intercambia con el anterior. Con este procedimiento, entre mas accesos tenga el registro, mas rápidamente avanzara hacia la primera posición. Comparado con el método de movimiento al frente, el método requiere mas tiempo de actividad para reorganizar al conjunto de registros . Una ventaja de método de transposición es que no permite que el requerimiento aislado de un registro, cambie de posición todo el conjunto de registros. De hecho, un registro debe ganar poco a poco su derecho a alcanzar el inicio de la lista.
4)Ordenamiento
Una forma de reducir el numero de comparaciones esperadas cuando hay una significativa frecuencia de búsqueda sin éxito es la de ordenar los registros en base al valor de la llave. Esta técnica es útil cuando la lista es una lista de excepciones, tales como una lista de decisiones, en cuyo caso la mayoría de las búsquedas no tendrán éxito. Con este método una búsqueda sin éxito termina cuando se encuentra el primer valor de la llave mayor que el buscado, en lugar de la final de la lista.
Metodo quict sort
QUICKSORT
- Este Algoritmo es inestable ya que si se pueden producir intercambios de claves con datos iguales, es posible que se altere el orden relativo inicial del arreglo a ser ordenado.
- Este Algoritmo no requiere memoria adicional, ya que los subarreglos son ordenados In Situ.
-También apreciamos que funciona en base a comparaciones en los WHILEs dentro de PARTITION, ahí compara varias veces.
- El caso promedio La complejidad para dividir una lista de n es O(n). De cada sublista se crean en promedio dos sublistas más de largo n/2. Por lo tanto la complejidad se define en forma recurrente como:
f(1) = 1
f(2) = 2 + 2*f(1)
…..
Así llegamos a la recursividad:
f(n) = n + 2*f(n/2)
Y esto significa una complejidad de O( ).
- El Peor Caso de este Algoritmo es cuando la lista está ordenada (curiosamente) porque en cada llamada recursiva el arreglo es dividido en una parte que contiene todos los elementos del arreglo menos el pivote (que vendría siendo el mayor o el menor de la lista) y otra vacía. En este caso la complejidad del algoritmo es O( ).
- En el mejor caso el pivote es siempre la media de todos los elementos, de esta forma el arreglo se divide en dos partes equilibradas siendo la complejidad del algoritmo O( ).
- Este Algoritmo es inestable ya que si se pueden producir intercambios de claves con datos iguales, es posible que se altere el orden relativo inicial del arreglo a ser ordenado.
- Este Algoritmo no requiere memoria adicional, ya que los subarreglos son ordenados In Situ.
-También apreciamos que funciona en base a comparaciones en los WHILEs dentro de PARTITION, ahí compara varias veces.
- El caso promedio La complejidad para dividir una lista de n es O(n). De cada sublista se crean en promedio dos sublistas más de largo n/2. Por lo tanto la complejidad se define en forma recurrente como:
f(1) = 1
f(2) = 2 + 2*f(1)
…..
Así llegamos a la recursividad:
f(n) = n + 2*f(n/2)
Y esto significa una complejidad de O( ).
- El Peor Caso de este Algoritmo es cuando la lista está ordenada (curiosamente) porque en cada llamada recursiva el arreglo es dividido en una parte que contiene todos los elementos del arreglo menos el pivote (que vendría siendo el mayor o el menor de la lista) y otra vacía. En este caso la complejidad del algoritmo es O( ).
- En el mejor caso el pivote es siempre la media de todos los elementos, de esta forma el arreglo se divide en dos partes equilibradas siendo la complejidad del algoritmo O( ).
Metodo radix sort
RadixSort
- Vemos claramente que RadixSort es estable porque la función que procesa todo es “CountingSort” y la estabilidad de esta la analizamos en la pagina anterior. Además el FOR de RadixSort no influye en la estabilidad.
- También notamos que no se basa en la comparación para ordenar ya que CountingSort tampoco lo hace, solo con los FORs ordena pero sin comparar entre los valores de las claves. El FOR de RadixSort no hace comparaciones.
- Claramente este algoritmo utiliza memoria adicional, ya que se basa en la ejecución de CountingSort que ocupa un arreglo temporal que deber cargado en memoria para poder copiar los valores ordenadamente al output.
- Como habíamos demostrado antes el tiempo de ejecución de CountingSort es de O(n) entonces ahora CountingSort se ejecuta “d” veces con un d lista[j+1])
4. temp = lista[j];
5. lista[j] = lista[j+1];
6. lista[j+1] = temp;
1. for (i=0; i temp) && (j >= 0) )
5. lista[j+1] = lista[j];
6. j--;
7. lista[j+1] = temp;
- Vemos claramente que RadixSort es estable porque la función que procesa todo es “CountingSort” y la estabilidad de esta la analizamos en la pagina anterior. Además el FOR de RadixSort no influye en la estabilidad.
- También notamos que no se basa en la comparación para ordenar ya que CountingSort tampoco lo hace, solo con los FORs ordena pero sin comparar entre los valores de las claves. El FOR de RadixSort no hace comparaciones.
- Claramente este algoritmo utiliza memoria adicional, ya que se basa en la ejecución de CountingSort que ocupa un arreglo temporal que deber cargado en memoria para poder copiar los valores ordenadamente al output.
- Como habíamos demostrado antes el tiempo de ejecución de CountingSort es de O(n) entonces ahora CountingSort se ejecuta “d” veces con un d
4. temp = lista[j];
5. lista[j] = lista[j+1];
6. lista[j+1] = temp;
1. for (i=0; i
5. lista[j+1] = lista[j];
6. j--;
7. lista[j+1] = temp;
Metodo de la burbuja
BURBUJA.
El bubble sort, también conocido como ordenamiento burbuja, funciona de la siguiente manera: Se recorre el arreglo intercambiando los elementos adyacentes que estén desordenados. Se recorre el arreglo tantas veces hasta que ya no haya cambios. Prácticamente lo que hace es tomar el elemento mayor y lo va recorriendo de posición en posición hasta ponerlo en su lugar.
Procedimiento Bubble Sort
paso 1: [Inicializa i al final de arreglo] For i <- N down to 1 do
paso 2: [Inicia desde la segunda pos.] For j <- 2 to i do
paso 4: [Si a[j-1] es mayor que el que le sigue] If a[j-1] < a[j] then
paso 5: [Los intercambia] Swap(a, j-1, j).
paso 7: [Fin] End.
Tiempo de ejecución del algoritmo burbuja:
Para el mejor caso (un paso) O(n)
Peor caso n(n-1)/2
Promedio O(n2)
El bubble sort, también conocido como ordenamiento burbuja, funciona de la siguiente manera: Se recorre el arreglo intercambiando los elementos adyacentes que estén desordenados. Se recorre el arreglo tantas veces hasta que ya no haya cambios. Prácticamente lo que hace es tomar el elemento mayor y lo va recorriendo de posición en posición hasta ponerlo en su lugar.
Procedimiento Bubble Sort
paso 1: [Inicializa i al final de arreglo] For i <- N down to 1 do
paso 2: [Inicia desde la segunda pos.] For j <- 2 to i do
paso 4: [Si a[j-1] es mayor que el que le sigue] If a[j-1] < a[j] then
paso 5: [Los intercambia] Swap(a, j-1, j).
paso 7: [Fin] End.
Tiempo de ejecución del algoritmo burbuja:
Para el mejor caso (un paso) O(n)
Peor caso n(n-1)/2
Promedio O(n2)
Metodo shell sort
SHELLSORT.
Ordenamiento de disminución incremental.
Nombrado así debido a su inventor Donald Shell.
Ordena subgrupos de elementos separados K unidades (respecto de su posición en el arreglo) del arreglo original. El valor K es llamado incremento.
Después de que los primeros K subgrupos han sido ordenados (generalmente utilizando INSERCION DIRECTA), se escoge un nuevo valor de K más pequeño, y el arreglo es de nuevo partido entre el nuevo conjunto de subgrupos. Cada uno de los subgrupos mayores es ordenado y el proceso se repite de nuevo con un valor más pequeño de K.
Eventualmente el valor de K llega a ser 1, de tal manera que el subgrupo consiste de todo el arreglo ya casi ordenado.
Al principio del proceso se escoge la secuencia de decrecimiento de incrementos; el último valor debe ser 1.
"Es como hacer un ordenamiento de burbuja pero comparando e intercambiando elementos."
Cuando el incremento toma un valor de 1, todos los elementos pasan a formar parte del subgrupo y se aplica inserción directa.
El método se basa en tomar como salto N/2 (siendo N el número de elementos) y luego se va reduciendo a la mitad en cada repetición hasta que el salto o distancia vale 1.
Procedimiento Shell Sort;
const
MAXINC = _____;
incrementos = array[1..MAXINC] of integer;
var
j,p,num,incre,k:integer;
begin
for incre := 1 to MAXINC do begin /* para cada uno de los incrementos */
k := inc[incre]; /* k recibe un tipo de incremento */
for p := k+1 to MAXREG do begin /* inserción directa para el grupo que se encuentra cada K posiciones */
num := reg[p];
j := p-k;
while (j>0) AND (num < reg[j]) begin
reg[j+k] := reg[j];
j := j - k;
end;
reg[j+k] := num;
end
end
end;
Ejemplo:
Para el arreglo a = [6, 1, 5, 2, 3, 4, 0]
Ordenamiento de disminución incremental.
Nombrado así debido a su inventor Donald Shell.
Ordena subgrupos de elementos separados K unidades (respecto de su posición en el arreglo) del arreglo original. El valor K es llamado incremento.
Después de que los primeros K subgrupos han sido ordenados (generalmente utilizando INSERCION DIRECTA), se escoge un nuevo valor de K más pequeño, y el arreglo es de nuevo partido entre el nuevo conjunto de subgrupos. Cada uno de los subgrupos mayores es ordenado y el proceso se repite de nuevo con un valor más pequeño de K.
Eventualmente el valor de K llega a ser 1, de tal manera que el subgrupo consiste de todo el arreglo ya casi ordenado.
Al principio del proceso se escoge la secuencia de decrecimiento de incrementos; el último valor debe ser 1.
"Es como hacer un ordenamiento de burbuja pero comparando e intercambiando elementos."
Cuando el incremento toma un valor de 1, todos los elementos pasan a formar parte del subgrupo y se aplica inserción directa.
El método se basa en tomar como salto N/2 (siendo N el número de elementos) y luego se va reduciendo a la mitad en cada repetición hasta que el salto o distancia vale 1.
Procedimiento Shell Sort;
const
MAXINC = _____;
incrementos = array[1..MAXINC] of integer;
var
j,p,num,incre,k:integer;
begin
for incre := 1 to MAXINC do begin /* para cada uno de los incrementos */
k := inc[incre]; /* k recibe un tipo de incremento */
for p := k+1 to MAXREG do begin /* inserción directa para el grupo que se encuentra cada K posiciones */
num := reg[p];
j := p-k;
while (j>0) AND (num < reg[j]) begin
reg[j+k] := reg[j];
j := j - k;
end;
reg[j+k] := num;
end
end
end;
Ejemplo:
Para el arreglo a = [6, 1, 5, 2, 3, 4, 0]
Partes de un motor

DIFERENTES PARTES DEL MOTOR
1. Bomba de inyección rotativa.
2. Filtro fino de gasoil con separador de agua.
3. Bomba de alimentación con cebador manual.
4. Intercambiador de calor tubular.
5. Bomba de refrigeración de agua marina.
6. Filtro de aceite.
7 Filtro limpiable tipo tubular. S. Filtro de ventilación del cárter.
9. Silenciador de admisión con filtro recambiable.
10. Tubo de escape refrigerado por agua dulce.
11. Tubo de escape refrigerado por agua marina.
12. Inversor.
13. Silentb1ocs.
14. Alternador.
15. Motor de arranque.
Nota: El motor de la ilustración es un Volvo Penta MD31A
Ciclo otto o de 4 timepos
CICLO OTTO O DE 4 TIEMPOS
El ciclo de un motor de combustión interno puede definirse como la serie completa de acontecimientos que ocurren antes de que vuelvan a repetirse.
El motor con ciclo de 4 tiempos necesita 4 movimientos de cada pistón, dos hacia arriba y dos hacia abajo ( dos revoluciones completas del cigüeñal), para completar dicho siglo los tiempos, en el orden en que se reproducen se llaman :
Admisión
Compresión
Explosión o carrera de fuerza
Escape o descarga
PRIMER TIEMPO : ADMISIÓN
0º PMS
Admisión
270º 90º
180º PMI
La primera etapa del ciclo Otto, la de admisión, queda representada. Empieza cuando el pistón esta colocado en la parte superior del cilindro. Con la válvula de escape cerrada y la admisión abierta, el piston se mueve hacia abajo provocando la admisión al producirse un vació parcial en el interior del cilindro. La presión atmosférica , por ser mayor que la que existe en el interior del cilindro, hace que entre aire por el carburador, donde se mezcla en proporciones adecuadas con el combustible.
Esta mezcla pasa por el tubo de admisión múltiple al interior del cilindro.
Cuando el piston llega al punto muerto inferior (PMI) la presión en el interior del cilindro sigue siendo algo menor que la presión atmosférica exterior y la mezcla continua entrando en el cilindro. La válvula de admisión sigue abierta mientras que el piston inicia el movimiento hacia arriba hasta que la posición de la leva hace que la válvula se cierre. La distancia que recorre el piston hacia arriba hasta que cierra la válvula es realmente muy pequeña.
SEGUNDO TIEMPO: COMPRESIÓN
0º PMS
Compresión Admisión
270º 90º
180º PMI
La compresión en un motor de 4 tiempos, sigue inmediatamente la admisión.
Ambas válvulas están cerradas y la mezcla de combustible queda en el cilindro que ahora esta cerrada. El piston al moverse hacia arriba dentro del cilindro comprime la mezcla combustible al terminar esta etapa el piston ha completado dos movimientos, uno hacia abajo y el otro hacia arriba y el cigüeñal un circulo completo o sea 360º.
TERCER TIEMPO: EXPLOSION O CARRERA DE FUERZA
0º PMS
admisión
compresión
270º 90º
Explosión
180º PMI
Cuando el pistón ha llegado al punto muerto superior (PMS) la mezcla combustible que entró al cilindro durante la admisión ha quedado comprimida. En este momento del ciclo dicha carga combustible se inflama por medio de una chispa producida por la bujía y se verifica la combustión. Debido al calor generado por la combustión, (aproximadamente de 4000 a 4500 ºC igual a 2204 menos 2491ºC ). Se expanden los gases y se produce una alta presión en el interior del cilindro. Esta presión actúa en forma de “de empuje” contra la cabeza del pistón, obligando a bajar, como se ve, lo que constituye la trasmisión de la energía al cigüeñal en forma de fuerza de torsión o rotatoria.
CUARTO TIEMPO: ESCAPE O DESCARGA
0ºPMS
Admisión
compresión
Explosión
270º 90º
escape
180º PMI
Cuando el pistón se acerca al punto muerto inferior (PMI) la posición que corresponde al fin de la energía, la válvula de escape, se abre disminuyendo la presión en el interior del cilindro. Esta válvula permanece abierta mientras el piston se mueve hacia arriba, hasta que llega al punto muerto superior (PMS). Cuando el pistón alcanza la posición más alta se cierra la válvula de escape. En la mayoría de los motores la válvula de escape se cierra poco después de alcanzado el punto muerto superior (PMS), antes de que el pistón llegue a la parte superior en la admisión empieza a abrirse la válvula de admisión, esta permite que esté abierta totalmente cuando el pistón baja de nuevo para iniciar la admisión siguiente.
El ciclo de un motor de combustión interno puede definirse como la serie completa de acontecimientos que ocurren antes de que vuelvan a repetirse.
El motor con ciclo de 4 tiempos necesita 4 movimientos de cada pistón, dos hacia arriba y dos hacia abajo ( dos revoluciones completas del cigüeñal), para completar dicho siglo los tiempos, en el orden en que se reproducen se llaman :
Admisión
Compresión
Explosión o carrera de fuerza
Escape o descarga
PRIMER TIEMPO : ADMISIÓN
0º PMS
Admisión
270º 90º
180º PMI
La primera etapa del ciclo Otto, la de admisión, queda representada. Empieza cuando el pistón esta colocado en la parte superior del cilindro. Con la válvula de escape cerrada y la admisión abierta, el piston se mueve hacia abajo provocando la admisión al producirse un vació parcial en el interior del cilindro. La presión atmosférica , por ser mayor que la que existe en el interior del cilindro, hace que entre aire por el carburador, donde se mezcla en proporciones adecuadas con el combustible.
Esta mezcla pasa por el tubo de admisión múltiple al interior del cilindro.
Cuando el piston llega al punto muerto inferior (PMI) la presión en el interior del cilindro sigue siendo algo menor que la presión atmosférica exterior y la mezcla continua entrando en el cilindro. La válvula de admisión sigue abierta mientras que el piston inicia el movimiento hacia arriba hasta que la posición de la leva hace que la válvula se cierre. La distancia que recorre el piston hacia arriba hasta que cierra la válvula es realmente muy pequeña.
SEGUNDO TIEMPO: COMPRESIÓN
0º PMS
Compresión Admisión
270º 90º
180º PMI
La compresión en un motor de 4 tiempos, sigue inmediatamente la admisión.
Ambas válvulas están cerradas y la mezcla de combustible queda en el cilindro que ahora esta cerrada. El piston al moverse hacia arriba dentro del cilindro comprime la mezcla combustible al terminar esta etapa el piston ha completado dos movimientos, uno hacia abajo y el otro hacia arriba y el cigüeñal un circulo completo o sea 360º.
TERCER TIEMPO: EXPLOSION O CARRERA DE FUERZA
0º PMS
admisión
compresión
270º 90º
Explosión
180º PMI
Cuando el pistón ha llegado al punto muerto superior (PMS) la mezcla combustible que entró al cilindro durante la admisión ha quedado comprimida. En este momento del ciclo dicha carga combustible se inflama por medio de una chispa producida por la bujía y se verifica la combustión. Debido al calor generado por la combustión, (aproximadamente de 4000 a 4500 ºC igual a 2204 menos 2491ºC ). Se expanden los gases y se produce una alta presión en el interior del cilindro. Esta presión actúa en forma de “de empuje” contra la cabeza del pistón, obligando a bajar, como se ve, lo que constituye la trasmisión de la energía al cigüeñal en forma de fuerza de torsión o rotatoria.
CUARTO TIEMPO: ESCAPE O DESCARGA
0ºPMS
Admisión
compresión
Explosión
270º 90º
escape
180º PMI
Cuando el pistón se acerca al punto muerto inferior (PMI) la posición que corresponde al fin de la energía, la válvula de escape, se abre disminuyendo la presión en el interior del cilindro. Esta válvula permanece abierta mientras el piston se mueve hacia arriba, hasta que llega al punto muerto superior (PMS). Cuando el pistón alcanza la posición más alta se cierra la válvula de escape. En la mayoría de los motores la válvula de escape se cierra poco después de alcanzado el punto muerto superior (PMS), antes de que el pistón llegue a la parte superior en la admisión empieza a abrirse la válvula de admisión, esta permite que esté abierta totalmente cuando el pistón baja de nuevo para iniciar la admisión siguiente.
Sunday, January 08, 2006
Programa en C++"Calcula el voltaje de la corrinete y la resistencia dada"
#include
#include
#include
main()
{
float corriente[10],resistencia[10],voltios[10];
int a;
for(a=0;a<10;a++)
{
cout<<"Dame una corriente: ";
cin>>corriente[a];
}
for(a=0;a<10;a++)
{
cout<<"Dame una resistencia: ";
cin>>resistencia[a];
}
for(a=0;a<10;a++)
{
voltios[a]=0;
voltios[a]=corriente[a]*resistencia[a];
}
clrscr();
cout<<"Corriente: Resistencia: Voltios:"< for(a=0;a<10;a++)
{
cout<
#include
#include
main()
{
float corriente[10],resistencia[10],voltios[10];
int a;
for(a=0;a<10;a++)
{
cout<<"Dame una corriente: ";
cin>>corriente[a];
}
for(a=0;a<10;a++)
{
cout<<"Dame una resistencia: ";
cin>>resistencia[a];
}
for(a=0;a<10;a++)
{
voltios[a]=0;
voltios[a]=corriente[a]*resistencia[a];
}
clrscr();
cout<<"Corriente: Resistencia: Voltios:"<
{
cout<
Programa en C++ "Calcuala una tabla de multiplicar"
//determinar e imprimir la tabla de multiplicar
#include
#include
main()
{
clrscr();
int i,j,r,a=6;
gotoxy(5,5);cout<<"Tabla que desea multiplicar:";
cin>>i;
for (j=1;j<=10;j++)
{
r=i*j;
gotoxy(6,a);cout<a=a+1;
}
getch();
}
#include
#include
main()
{
clrscr();
int i,j,r,a=6;
gotoxy(5,5);cout<<"Tabla que desea multiplicar:";
cin>>i;
for (j=1;j<=10;j++)
{
r=i*j;
gotoxy(6,a);cout<a=a+1;
}
getch();
}
Programa en C++ "Fatctorial de un numero"
//factorial de un numero
#include
#include
main()
{
int n;
double fact=1;
cout<<("Escribe un numero:");
cin>>n;
int f=1;
for (int f=1;f<=n;f++)
fact*=f;
cout<<"El factorial"< getch();
}
#include
#include
main()
{
int n;
double fact=1;
cout<<("Escribe un numero:");
cin>>n;
int f=1;
for (int f=1;f<=n;f++)
fact*=f;
cout<<"El factorial"<
}
Programa C++ "Metodo Fivonazi"
#include
#include
class Fivonazi
{
private:
int a;
int b;
int c;
public:
Fivonazi(int a=1, int b=1, int c=0);
void ns();
};
Fivonazi::Fivonazi(int ax,int bx,int cx)
{
a=ax;
b=bx;
c=cx;
}
void Fivonazi::ns()
{
int i,num1,num2,numv;
cout<<"Dame el primer numero: "< cin>>num1;
cout<<"Dame el segundo numero: "< cin>>num2;
cout<<"Cuantas veces quieres que se repita: "< cin>>numv;
cout<<"la suma es:"< a=num1;
b=num2;
for(i=0;i {
c=a+b;
a=b;
b=c;
cout< }
return;
}
main()
{
int num1,num2,numv;
Fivonazi obj1;
obj1.ns();
getch();
}
#include
class Fivonazi
{
private:
int a;
int b;
int c;
public:
Fivonazi(int a=1, int b=1, int c=0);
void ns();
};
Fivonazi::Fivonazi(int ax,int bx,int cx)
{
a=ax;
b=bx;
c=cx;
}
void Fivonazi::ns()
{
int i,num1,num2,numv;
cout<<"Dame el primer numero: "<
cout<<"Dame el segundo numero: "<
cout<<"Cuantas veces quieres que se repita: "<
cout<<"la suma es:"<
b=num2;
for(i=0;i
c=a+b;
a=b;
b=c;
cout<
return;
}
main()
{
int num1,num2,numv;
Fivonazi obj1;
obj1.ns();
getch();
}
Subscribe to:
Posts (Atom)