Centro uiversitario salina cruz
Post on 05-Aug-2016
233 Views
Preview:
DESCRIPTION
Transcript
CENTRO UIVERSITARIO SALINA CRUZ
ALUMANA: RUBI ALEJANDRA HERNANDEZ TRINIDAD
MATERIA: TEORÍA DE ALGORITMO
INDICE
CONTENIDO
ESTRUCTURA DE DATOS EXTERNAS, ARCHIVOS
BÚSQUEDA Y ORDENAMIENTO
PROGRAMACIÓN DE APLICACIONES
CONTENIDO
1.-Estructura de Datos Externas, Archivos
1.1 Conceptos y Definiciones
1.2 Características
1.2.1 Residencia
1.2.2 Permanencia
1.2.3 Portabilidad
1.2.4 Capacidad
1.3 Clasificación
1.3.1 Permanentes
1.3.1.1 Constantes
1.3.1.2 Maestros
1.3.1.3 Históricos
1.3.2 De movimiento
1.3.3 De maniobra o trabajo
1.4 Organización
1.4.1 Secuencia
1.4.2 Random o directo
1.4.3 Indexada
2.- Búsqueda y Ordenamiento
2.1 Algoritmo de búsqueda
2.1.1 Secuencial
2.1.2 Binaria
2.1.3 Calculo de dirección
2.2 Ordenamiento
2.2.1 Optimo teórico para ordenamiento de tablas
2.2.2 Intercambio simple
2.2.3 Algoritmo de la burbuja
2.2.4 Shell sort
2.2.5 Quicksort
2.2.6 Tree sort o Heap sort
2.2.7 Ordenamiento pot intercalation
2.2.8 Ordenamiento por distribución
2.3 Ordenamiento externo
2.3.1 El torneo de tenis para ordenamiento externo
2.3.2 Intercalación con lotes. Algoritmo balanceado
2.3.3 El algoritmo poli fase para intercalación por lotes
2.3.4 El algoritmo de cascada
ENTREGAR EL DIA 7 DEJULIO DEL 2016 TEORIA DE ALGORITMOS 2
2.4 Arboles balanceados
2.4.1 Definiciones
2.4.2 Arboles AVL
2.4.3 Arboles B
2.5 Dispersión al azar, desmenuzamiento o hassing
2.5.1 Algoritmos
2.5.2 Funciones de dispersión
2.5.3 Manejo de colisiones
2.5.4 Manejo de sobre flujo
2.5.5 Un corrector de ortografía
ESTRUCTURA DE DATOS ESTERNA DE ARCHIVOS DEFINICIÓN: es una estructura externa de datos, constituida por un conjunto de elementos todos del mismos tipos, organizados en unidades de acceso llamadas registros. 1.2 CARACTERÍSTICAS Las principales características son: • RESIDENCIA: soporte de almacenamiento externo la información se almacena de forma permanente. • PERMANENCIA: alta capacidad de almacenamiento de datos. • PORTABILIDAD: USB, DVD, CD, Blutooth y Correo Electrónico. • CAPACIDAD 1.2.1 RESIDENCIA
Es la ubicación de información en dispositivos o en otro medio donde que se pueden localizar o almacenar datos como memorias secundarias que es el caso de cintas y discos duros. 1.2.2 PERMANENCIA Significa que toda la información que se ha almacenado en la memoria central desaparece cuando se ejecuta el programa que lo maneja, pero para eso se requiere realizar un proceso de borrado para eliminar un archivo.1.2.3 PORTABILIDAD Es el medio por el cual podemos llevar de un lugar a otro aquellos datos para manejarlos o utilizarlos en otra parte. Esto se hace mediante dispositivos externos. 1.2.4CAPACIDAD La capacidad de almacenamiento podría ser ilimitada pero debido a que existe una memoria central este le impide o le establece un límite, conforme a la capacidad de la memoria será el límite de almacenamiento. 1.3 CLASIFICACIÓN Las diferentes clases de archivos se clasifican en:
• PERMANENTES
• CONSTANTES • MAESTROS • HISTÓRICOS • DE MOVIMIENTO • DE MANIOBRA O TRABAJO 1.3.1PERMANENTES Los archivos permanentes son aquellos en los que la información a lo largo del tiempo cambia o varía poco de forma que permanecen casi intactos. 1.3.1.1 CONSTANTES Estos son aquellos archivos que no sufren movimiento alguno, estos son utilizados como archivos de consulta. Un archivo de este tipo podría ser la red del metro de una ciudad que contiene su descripción, características, etc., de cada día. 1.3.1.2 MAESTROS Son colecciones de registros que afectan a una organización. Los datos de estos archivos pueden construir una revisión histórica de eventos. Estos archivos contienen datos primordiales para la operación continua de la organización. Constantemente debe ser actualizados o revisados en busca de posibles errores o cambios que se desean realizar. 1.3.1.3HISTÓRICOS: Nunca se modifican (Rentas de años anteriores). DE MOVIMIENTOS: Información para la actualización de ficheros
permanentes (Compra, Ventas Diarias). DE TRABAJO: Creados por el sistema compilaor (back). SEGÚN SU ORGANIZACIÓN:
SECUENCIAL: Fichero secuencial
DIRECTA: Fichero directo
SECUENCIA – INDEXADA: Fichero secuencial – indexado.
ACCESO SECUELCIAL:
Para acceder a un registro en particular deben ser accedidos
todos los registros que le proceden.
Este modo de acceso se permite en soporte direccionables o no.
Por ejemplo: archivo de canciones almacenadas en cinta magnética no tiene más remedio que organizarse de manera secuencial y accederse de igual forma.
ACCESO DIRECTO:
Permite acceder a un registro directamente, sin tener que acceder antes a todos los registros que le proceden.
Sólo se permite esté modo de acceso en soportes direccionables, disquetes, discos duros, etc.
El acceso puede realizarse bien por el número de registro o por la clave de acceso.
Por ejemplo: archivos almacenados en nuestro pan drive. F. SECUENCIALES INDEXADOS: Cada registros se identifica unívocamente con una clave única, conocida como la clave primaria y esta clave pertenece al registro. ORGANIZADA EN TRES ZONAS: ÁREA DE INDICES: Organizada secuencialmente y actualizada pertenece. Cada registro contiene la dirección de comienzo de un bloque y la clave más alta que contiene. ÁREA PRIMARIA: Zona dividida en segmento que contiene, organizados secuencialmente más de un registró. ÁREA DE EXCEDENTES: Contendrá aquellos registros que no caben en el área principal.
BÚSQUEDA Y ORDENAMIENTO
Algoritmos de Búsqueda
• Los procesos de búsqueda involucran recorrer un arreglo
completo con el fin de encontrar algo. Lo más común es buscar el
menor o mayor elemento (cuando es puede establecer un orden), o
buscar el índice de un elemento determinado.
• Para buscar el menor o mayor elemento de un arreglo, podemos
usar la estrategia, de suponer que el primero o el último es el menor
(mayor), para luego ir comparando con cada uno de los elementos,
e ir actualizando el menor (mayor). A esto se le llama Búsqueda
Lineal.
Algoritmos de Búsqueda
• Definición: – Para encontrar un dato dentro de un arreglo, para
ello existen diversos algoritmos que varían en complejidad,
eficiencia, tamaño del dominio de búsqueda.
• Algoritmos de Búsqueda:
– Búsqueda Secuencial
– Búsqueda Binaria
BÚSQUEDA SECUENCIAL:
• Consiste en ir comparando el elemento que se busca con cada
elemento del arreglo hasta CUÁNDO SE ENCUENTRA:
• Busquemos el elementos ‘u’
Algoritmos por direcciones
Print ( bin (lista l), n° a buscar
Retornar índice que coincide con números que buscar si no está
retorna -1 tiempo (log n).
ORDENAMIENTO:
En computación y matematicas un algoritmo de ordenamiento es
un algoritmo que pone elementos de una lista o un vectoren una
secuencia dada por una relación de orden, es decir, el resultado de
salida ha de ser una permutación —o reordenamiento— de la
entrada que satisfaga la relación de orden dada. Las relaciones de
orden más usadas son el orden numérico y el orden lexicográfico.
Ordenamientos eficientes son importantes para optimizar el uso de
otros algoritmos (como los de búsqueda y fusión) que requieren
listas ordenadas para una ejecución rápida. También es útil para
poner datos en forma canónica y para generar resultados legibles
por humanos.
OPTIMO TEÓRICO PARA ORDENAMIENTO DE TABLAS
INTRODUCCIÓN: A la hora de tratar datos, muchas veces nos
conviene que estén ordenados. Estos métodos nos pueden resultar
eficientes cuando hacemos las búsquedas. ORDENACIÓN: Consiste
en organizar un conjunto de datos en un orden determinado según
un criterio. La ordenación puede ser interna o externa: • Interna: La
hacemos en memoria con arryas. Es muy rápida. • Externa: La
hacemos en dispositivos de almacenamiento externo con ficheros.
Para determinar lo bueno que es un algoritmo de ordenación hay
que ver la complejidad del algoritmo (cantidad de trabajo de ese
algoritmo), se mide en el número de operaciones básicas que realiza
un algoritmo. La operación básica de un algoritmo es la operación
fundamental, que es la comparación. Existen diferentes algoritmos
de ordenación elementales o básicos cuyos detalles de
implementación se pueden encontrar en diferentes libros de
algoritmos. La enciclopedia de referencia es [KNUTH 1973]1 y sobre
todo la 2.a edición publicada en el año 1998 [KNUTH 1998]2. Los
algoritmos presentan diferencias entre ellos que los convierten en
más o menos eficientes y prácticos según sea la rapidez y eficiencia
demostrada por cada uno de ellos. Los algoritmos básicos de
ordenación más simples y clásicos son: • Ordenación por selección.
• Ordenación por inserción. • Ordenación por burbuja. Los métodos
más recomendados son: selección e inserción, aunque se estudiará
el método de burbuja, por aquello de ser el más sencillo aunque a la
par también es el más ineficiente; por esta causa no recomendamos
su uso, pero sí conocer su técnica. Los datos se pueden almacenar
en memoria central o en archivos de datos externos guardados en
unidades de almacenamiento magnético (discos, cintas, disquetes,
CD-ROM, DVD, discos flash USB, etc.) Cuando los datos se guardan
en listas y en pequeñas cantidades, se suelen almacenar de modo
temporal en arrays y registros; estos datos se almacenan
exclusivamente para tratamientos internos que se utilizan en
gestión masiva de datos y se guardan en arrays de una o varias
dimensiones. Los datos, sin embargo, se almacenan de modo
permanente en archivos y bases de datos que se guardan en discos y
cintas magnéticas.
ALGORITMOS DE ORDENAMIENTO POR INTERCAMBIO
El algoritmo del intercambio aunque es el más sencillo de
implementar es uno de los mas pobres en rendimiento, se basa en la
idea de buscar cada vez el menor elemento del conjunto y ubicarlo
al principio del mismo, repitiendo este proceso cada vez con el
conjunto sin su primer elemento (el menor del conjunto anterior),
hasta llegar a un conjunto de un solo elemento que por definición ya
está ordenado.
En cada paso del algoritmo se compara el primer elemento del
conjunto x[i], con los demás elementos del mismo x[j] (j=i+1 .. n) y
cuando x[i] es mayor que x[j], se intercambian sus valores. Cuando
se termina de recorrer el arreglo el proceso nos garantiza que en x[i]
está el menor elemento del conjunto.
Teniendo en cuenta que el algoritmo de ordenamiento por
intercambio se realiza siempre de la misma manera independiente
de los datos que estén almacenados, no existe un mejor, peor o
caso promedio y su complejidad siempre será O(n^2)
ALGORITMOS DE ORDENACIÓN POR INTERCAMBIO
METODO BURBUJA
El método de ordenamiento rápido o método quicksort, es una
técnica basada en otra conocida con el nombre divide y vencerás,
que permite ordenar una cantidad de elementos en un tiempo
proporcional a n2 en el peor de los casos o a n log n en el mejor de
los casos. El algoritmo original es recursivo, como la técnica en la
que se basa.
METODO QUICKSORT
Es un algoritmo de ordenamiento que ordena enteros procesando
sus dígitos de forma individual. Como los enteros pueden
representar cadenas de caracteres (por ejemplo, nombres o fechas)
y, especialmente, números en punto flotante especialmente
formateados, radix sort no está limitado sólo a los enteros.
METODO RADIX
DENTRO DEL ALGORITMO DE ORDENACIÓN POR INTERCAMBIO SE
ENCUENTRAN 4 MÉTODOS:
-METODO DE LA BURBUJA
-METODO QUICKSORT
-METODO SHELLSORT
-METODO RADIX
El método de ordenación shellsort es una versión mejorada del
método de ordenación por inserción directa, que se utiliza cuando el
número de elementos es grande. Este método recibe su nombre
gracias a su creados Donald L. Shell, también se conoce con el
nombre inserción con incrementos decrecientes.
En el método de ordenación por inserción directa, cada elemento se
compara con los elementos contiguos de su izquierda de uno por
uno, para lograr su ordenamiento; si por ejemplo, el elemento a
comparar es el más pequeño y se encuentra en la última posición
del arreglo, hay que ejecutar muchas comparaciones antes de
colocar el elemento en su lugar de forma definitiva.
El método de ordenación shellsort mejora el ordenamiento por
inserción comparando elementos separados por un espacio de
varias posiciones. Esto permite que un elemento haga pasos más
grandes hacia la posición que debe ocupar. Los pasos múltiples
sobre los elementos se hacen con tamaños de espacio cada vez más
pequeños y el último paso del método es un simple ordenamiento
por inserción directa, pero para entonces, los elementos de arreglo
ya casi están ordenados.
Para determinar el tamaño de los incrementos (saltos) constantes, el
primero debe ser generado a partir del tamaño del arreglo entre
dos, obteniendo solo su parte entera de la división o redondeando
el resultado de la misma, y posteriormente ir reduciendo a la mitad
el incremento en cada repetición, hasta que el incremento sea un
uno.
METODO SHELL SORT
UNIDAD 6
ORDENACIÓN INTERNA O DE ARREGLOS
LA ORDENACIÓN INTERNA O DE ARREGLOS, RECIBE ESTE NOMBRE
YA QUE LOS ELEMENTOS O COMPONENTES DEL ARREGLO SE
ENCUENTRA EN LA MEMORIA PRINCIPAL DE LA COMPUTADORA,
QUE ES LA MEMORIA RAM.
LOS MÉTODOS DE ORDENACIÓN INTERNA SE CLASIFICAN EN DOS:
- MÉTODOS DIRECTOS
- MÉTODOS LOGARÍTMICOS
MÉTODOS DIRECTOS
Son los más simples y fáciles de entender, son eficientes cuando se
trata de una cantidad de datos pequeña.
EJEMPLO:
(n^2)
MÉTODOS LOGARÍTMICOS
Son más complejos, difíciles de entender y son eficientes en grandes
cantidades de datos.
EJEMPLO:
(n * log n)
LOS MÉTODOS DIRECTOS MAS CONOCIDOS SON:
- Ordenación por intercambio.
- Ordenación por inserción.
- Ordenación por selección.
INTRODUCCIÓN
Como sabemos, ordenar significa reagrupar o reorganizar un
conjunto de objetos en una secuencia específica y pueden ser
Ascendentes (De menor a mayor) y Descendentes (De mayor a
menor) y se clasifica en 2 métodos de ordenación:
- INTERNOS (De arreglos)
- EXTERNOS (De archivos)
El primer procedimiento del método de la burbuja es:
1-Generar un ciclo que inicie desde uno hasta el número de
elementos del arreglo.
2-Generar un segundo ciclo dentro del anterior que inicie desde
cero hasta el número de elementos del arreglo menos dos.
3-Dentro del segundo ciclo debe existir una comparación que
determina el tipo de ordenamiento (ascendente o descendente)
entre el primer elemento (posición generado por el segundo ciclo) y
el segundo elemento (el que le sigue), si la respuesta a la condición
es verdadera se realiza un intercambio entre los dos elementos.
4-Para realizar el intercambio se genera un almacenamiento
temporal, el cual guarda el dato del primer elemento, el segundo
elemento toma el lugar del primero y en el lugar del segundo se
coloca lo que contiene el almacenamiento temporal.
Una vez que los ciclos terminan la estructura debe quedar ordenada
de forma ascendente o descendente, pero este procedimiento es
considerado como el pero de los casos ya que si el número de
elementos de la estructura es de 100, se tienen que realizar 9900
comparaciones entes de terminar la ejecución del método.
Un segundo procedimiento del método de la burbuja es:
1-Generar un ciclo que inicie desde cero hasta el número de
elementos menos dos.
2-Generar un segundo ciclo desde el valor del ciclo anterior mas uno
hasta el número de elementos menos uno;
3-Dentro del segundo ciclo debe existir una comparación que
determina el tipo de ordenamiento (ascendente o descendente)
entre el primer elemento (posición generada por el primer ciclo) y el
segundo elemento (posición generada por el segundo ciclo), si la
respuesta a la condición es verdadera se realiza un intercambio
entre los dos elementos.
4-Para realizar el intercambio se genera un almacenamiento
temporal, el cual guarda el dato del primer elemento, el segundo
elemento toma el lugar del primero y en el lugar del segundo se
coloca lo que contiene el almacenamiento temporal.
Una vez que los ciclos terminan la estructura debe quedar
ordenada, la diferencia con el procedimiento anterior radica en el
número de comparaciones y posibles intercambios que se
presentan, en este segundo procedimiento, es menor ya que cada
pasada que se le da al arreglo se realiza una comparación menos
que en la pasada anterior.
El tercer procedimiento del método de la burbuja es :
1-Generar un ciclo que inicie desde uno hasta el número de
elementos menos uno.
2-Generar un segundo ciclo que inicie desde el número de
elementos menos uno y mientras que ese valor sea mayor o igual al
del ciclo anterior (con decrementos).
3-Dentro del segundo ciclo debe existir una comparación que
determina el tipo de ordenamiento (ascendente o descendente)
entre el primer elemento (posición generada por el segundo ciclo) y
el segundo elemento (posición generada por el segundo ciclo menos
uno), si la respuesta a la condición es verdadera se realiza un
intercambio entre los dos elementos.
4-Para realizar el intercambio se genera un almacenamiento
temporal, el cual guarda el dato del primer elemento, el segundo
elemento toma el lugar del primero y en el lugar del segundo se
coloca lo que contiene el almacenamiento temporal
Este tercer procedimiento es muy similar al anterior con la
diferencia que el elemento que va quedando es su lugar el primero
no el último como en el caso anterior.
El método de ordenación por intercambio directo o método de la
burbuja, es el más simple y consiste en comparar dos elementos
adyacentes para determinar si se realiza un intercambio entre los
mismos, esto en caso de que el primero sea mayor que el segundo
(forma ascendente) o el caso de que el primero sea menor que el
segundo (forma descendente).
PROCEDIMIENTO DEL METODO BURBUJA
El procedimiento del algoritmo para el método de ordenamiento
quicksort es la siguiente:
1-Debe elegir uno de los elementos del arreglo al que llamaremos
pivote.
2-Debe acomodar los elementos del arreglo a cada lado del pivote,
de manera que del lado izquierdo queden todos los menores al
pivote y del lado derecho los mayores al pivote; considere que en
este momento, el pivote ocupa exactamente el lugar que le
corresponderá en el arreglo ordenado.
3-Colocado el pivote en su lugar, el arreglo queda separado en dos
subarreglos, uno formado por los elementos del lado izquierdo del
pivote, y otro por los elementos del lado derecho del pivote.
4-Repetir este proceso de forma recursiva para cada sub arreglo
mientras éstos contengan más de un elemento. Una vez terminado
este proceso todos los elementos estarán ordenados.
Para elegir un pivote se puede aplicar cualquiera de las siguientes
tres opciones:
1-El pivote será el primer elemento del arreglo.
2-El pivote será el elemento que está a la mitad del arreglo. O
3-Que el pivote se elija de entre tres elementos del arreglo
(cualesquiera), los cuales se deben comparar para seleccionar el
valor intermedio de los tres y considerarlo como el pivote.
La forma o técnica de reacomodo de los elementos del lado
izquierdo y derecho del pivote, aplica el siguiente procedimiento
que es muy efectivo. Se utilizan dos índices: izq, al que llamaremos
índice inicial, y der, al que llamaremos índice final. Conociendo estos
elementos el algoritmo quedaría de la siguiente manera:
1-Recorrer el arreglo simultáneamente con izq y der: por la
izquierda con izq (desde el primer elemento), y por la derecha con
der (desde el último elemento).
2-Mientras el arreglo en su posición izq. (Arreglo [izq.]) sea menor
que el pivote, continuamos el movimiento a la derecha.
3-Mientras el arreglo en su posición der (arreglo [der]) sea mayor
que el pivote, continuamos el movimiento a la izquierda.
4-Terminando los movimientos se comparan los índices y si izq es
menor o igual al der, se intercambian los elementos en esas
posiciones y las posiciones se cambian izq a la derecha y der a la
izquierda.
5-Repetir los pasos anteriores hasta que se crucen los índices (izq
sea menor o igual a der).
6-El punto en que se cruzan los índices es la posición adecuada para
colocar el pivote, porque sabemos que a un lado los elementos son
todos menores y al otro son todos mayores (o habrían sido
intercambiados).
PROCEDIMIENTO DEL METODO QUICKSORT
EJEMPLO:
Vector original:
25 57 48 37 12 92 86 33
Asignamos los elementos en colas basadas en el dígito menos
significativo de cada uno de ellos.
0:
1:
2:12 92
3:33
4:
5:25
6:86
7:57 37
8:48
9:
Después de la primera pasada, la ordenación queda:
12 92 33 25 86 57 37 48
Colas basadas en el dígito más significativo.
0:
1:12
2:25
3:33 37
4:48
5:57
6:
7:
8:86
9:92
Lista ordenada:
12 25 33 37 48 57 86 92
PROCEDIMIENTO DEL METODO SHELL SORT
El procedimiento para aplicar el algoritmo de shell sort es el
siguiente:
1-Generar un ciclo que se encargue de controlar el tamaño que
deben tener los incrementos.
2-Este ciclo debe iniciar con la división del tamaño del arreglo entre
dos.
3-Mientras que el incremento sea mayor a cero debe continuar.
4-El cambio de incremento se elige de entre dos opciones: un uno o
la división del incremento anterior entre dos.
5-Un segundo ciclo dentro del anterior, controla el número de
comparaciones que se deben hacer según el tamaño del
incremento.
6-El control de este ciclo debe iniciar con el incremento generado
anteriormente.
7-Mientras el control del ciclo sea menor que el tamaño del arreglo.
El control debe cambiar de uno en uno.
8-Un tercer ciclo dentro del segundo controla en qué momento se
detienen las comparaciones o se hacen los posibles intercambios
entre los elementos.
9-El control de este ciclo debe iniciar con el valor del ciclo anterior.
10-Mientras que el control sea mayor o igual al incremento del
primer ciclo y el elemento del arreglo de la posición del control de
este ciclo menos el incremento, sea mayor que el elemento del
arreglo de la posición control de este ciclo, realice los intercambios
entre estas posiciones.
11-Y el control se decremente con el valor del incremento.
TREE SORT O HEAP SORT
En ciencias de la computación , heapsort es una basada en la comparación algoritmo de ordenación . Heapsort puede ser pensado como una mejora de la especie de selección : al igual que el algoritmo, que divide su entrada en una región sin ordenar una basura así, y se contrae de forma iterativa la región no seleccionados mediante la extracción del elemento más grande y que se mueve a la región ordenados. La mejora consiste en el uso de
un montón estructura de datos en lugar de una búsqueda en tiempo lineal para encontrar el máximo. [2]
Aunque algo más lento en la práctica, en la mayoría de las máquinas que un bien implementado clasificación rápida , tiene la ventaja de un peor de los casos más favorables O ( n log n ) tiempo de ejecución. Heapsort es un algoritmo en el lugar , pero no es una especie estable .
Heapsort fue inventado por JWJ Williams en 1964. [3] Esto también fue el nacimiento del montón, ya presentó por Williams como una estructura de datos útiles en su propio derecho. [4] En el mismo año, RW Floyd publicó una versión mejorada que podría ordenar un arreglo en el lugar, continuando con su investigación anterior en el Treesort algoritmo.
En este método de ordenamiento existen dos archivos con llaves
ordenadas, los
Cuales se mezclan para formar un solo archivo.
1.-La longitud de los archivos puede ser diferente.
2.-El proceso consiste en leer un registro de cada archivo y
compararlos, el
Menor es almacenando en el archivo de resultado y el otro se
compara con el
Siguiente elemento del archivo si existe. El proceso se repite hasta
que alguno
De los archivos quede vacío y los elementos del otro archivo se
almacenan
Directamente en el archivo resultado.
ORDENACIÓN POR INTERCALACIÓN
(Mergesort) Características. • Es un algoritmo recursivo con un
número de comparaciones mínimo. El tiempo de ejecución
promedio es O(N log(N)). • Su desventaja es que trabaja sobre un
array auxiliar lo cual tiene dos consecuencias: uso de memoria extra
y trabajo extra consumido en las copias entre arreglos (aunque es
un trabajo de tiempo lineal). • Es una aplicación clásica de la
estrategia para resolución de algoritmos "divide y vencerás". Esta
estrategia plantea el hecho de que un problema puede ser dividido
en varios sub problemas y una vez resueltos estos se puede
proceder a unir las soluciones para formar la solución del problema
general. La solución de los sub problemas más pequeños se realiza
de la misma manera: es decir, se van resolviendo problemas cada
vez más pequeños (hasta encontrarnos con un caso base: problema
no divisible con solución tribial). En cada recursión se toma un array
de elementos desordenados. Se lo divide en dos mitades, se aplica la
recursión en cada una de estas y luego (dado que al finalizar estas
recursiones tenemos las dos mitades ordenadas) se intercalan
ambas para obtener el array ordenado. Intercalar. Es la operación
que le da el nombre a este algoritmo. La intercalación toma dos
secuencias (arrays) de elementos y a partir de estas construye una
tercera secuencia que contiene todos los elementos de estas en
orden. Implementación de la intercalación. Sean dos arrays
ordenados A y B (cuyas longitudes pueden ser distintas). Sea el array
C tal que |C|>=|A|+|B| (tiene capacidad para almacenar todos los
elementos de ambas listas A y B). Sean los contadores ap., bp y cp
con valor inicial 0 (se ponen al inicio de sus arreglos respectivos). Lo
que hace intercalar es copiar el menor de A[ap] y B[bp] en C[cp] y
avanzar los contadores apropiados. Cuando se agota cualquier lista
de entrada (A o B), los datos que quedan en la otra lista se copian en
C.
Esperamos que al leer el código, el lector entienda los detalles
menores tanto de la rutina recursiva del algoritmo de recursión
como de la rutina intercala (). void ord_intercalacion (Dato * A, Dato
* tmp, int izq, int der); /* Función recursiva! A es el array de datos.
tmp debe ser un array de tamaño mayor o igual a A. izq y der son los
extremos del sub arreglo sobre el cual trabajaremos en esta
recursión. */ void intercalar (Dato * A, Dato * tmp, int izq, int centro,
int der); /* lo que hace esta rutina es intercalar las particiones
[A[izq], ..., A[centro-1] ] y [ A[centro], ..., A[der] ] (que deberían estar
ya ordenadas) en el subarray [ tmp[izq], ..., tmp[der] ] y luego copiar
los elementos nuevamente a A, en el subarray [ A[izq], ..., A[der] ] */
void mergesort (Dato * A, int N) { Dato *tmp = crear (N); /* creamos
un array auxiliar del mismo tamaño que A */ ord_intercalacion (A,
tmp, 0, N - 1); } void ord_intercalacion (Dato * A, Dato * tmp, int izq,
int der) { if (izq < der) /* este if comprueba el caso base que es
cuando la partición pasada no tiene elementos. */ { /* dividimos a la
mitad el subarray [A[izq],...,A[der]] */ int centro = (izq + der) / 2; /*
aplicamos la recursión en ambas mitades */ ord_intercalacion (A,
tmp, izq, centro); ord_intercalacion (A, tmp, centro + 1, der); /* a
este punto ambas mitades deberían estar ordenadas por lo que las
intercalamos para unirlas en una sola secuencia ordenada. */ 12
Algoritmos de ordenación intercalar (A, tmp, izq, centro + 1, der); } }
void intercalar (Dato * A, Dato * tmp, int izq, int centro, int der) { /*
mis particiones serán [izq,...,centro-1] y [centro,...,der] */ /*
contadores para la primera mitad, la segunda y para la intercalación
respectivamente. */ int ap = izq, bp = centro, cp = izq.; while ((ap <
centro) && (bp <= der)) { if (A[ap] <= A[bp]) { tmp[cp] = A[ap]; ap++;
} else { tmp[cp] = A[bp]; bp++; } cp++; } /* terminamos de intercalar,
ahora metemos los elementos restantes de la lista que aún no ha
terminado de ser procesada. */ while (ap < centro) { tmp[cp] =
A[ap]; cp++; ap++; } while (bp <= der) { tmp[cp] = A[bp]; cp++; bp++;
13 Algoritmos de ordenación } /* ahora que tenemos la
intercalación finalizada en tmp, la pasamos a A */ for (ap = izq.; ap
<= der; ap++) A[ap] = tmp[ap]; } Observar como la función principal
mergesort() solamente es un manejador de la función
ord_intercalacion() en la cual se realiza todo el trabajo
recursivamente. Si bien el algoritmo puede parecer largo, es más
fácil (desde nuestro punto de vista) entenderlo que otros algoritmos
más cortos pero más complejos como por ejemplo la ordenación de
Shell. La única parte difícil es entender cómo funciona la recursión
ya que el algoritmo intercalar es bastante fácil.
ORDENAMIENTO POR DISTRIBUCIÓN
Los algoritmos de ordenamiento por distribución, ordenan el arreglo tomando cada número e insertándolo en la posición que toma su valor, es decir, si se tiene un cinco se coloca en la posición cinco del arreglo, algo así como: “lo que valgas en esa posición te pongo”. Esto indica que no se podrán ordenar los arreglos que tengan valores repetidos y el arreglo necesita el tamaño del número más grande que se encuentre en él.
Lo que debemos hacer cuando se repitan los datos es incrementar la capacidad de la posición (urna). Para lograrlo podemos hacer lo siguiente:
1. Definir un arreglo en el que cada posición puede ser ocupada por más de un elemento (arreglo bidimensional) puede darse la situación de ser insuficiente la cantidad de posiciones adicionales o de existir demasiado desperdicio de memoria.
2. Definir el tamaño de la urna variable a través del uso de estructuras de datos como las listas simples enlazadas.
Los algoritmos de ordenamiento por distribución se clasifican en:
- CountingSort. - RadixSort. - BucketSort.
Radix.
El método de ordenación radix es un algoritmo que ordena datos
procesando sus elementos de forma individual, según la posición que ocupan dentro del dato. Los datos numéricos los por dígitos y los datos alfabéticos por letras.
ORDENACIÓN EXTERNA
Los algoritmos de ordenación externa son necesarios cuando los datos que se quiere ordenar no cabe en la memoria principal (RAM) de la computadora y por tal motivo se encuentran almacenados en un dispositivo secundario externo (el disco duro, cinta, memoria usb, etc.). La mayoría de estos algoritmos utilizan la técnica de divide y vencerás y la intercalación de archivos, para aplicar el ordenamiento.
Por intercalación de archivos se entiende la unión o fusión de dos o más archivos, previamente ordenados, en un solo archivo, el cual debe quedar ordenado al hacer la intercalación.
Si se cuenta con dos archivos con datos previamente ordenados, el proceso de intercalación entre los dos archivos, consiste en extraer el primer elemento de cada archivo y determinar cuál es el menor, para colocarlo en el tercer archivo, extraer el siguiente elemento del archivo y compararlo nuevamente contra el otro elemento que ya se tenía del otro archivo, para determinar cuál ingresa al tercer archivo, este proceso se repita hasta que uno de los archivos originales l legue hasta el fin, en este caso, solo resta transcribir los números del archivo que no se ha llegado a su fin al tercer archivo.
Los algoritmos de ordenación externa más comunes son dos:
- Intercalación directa o mezcla directa y - Mezcla natural o mezcla equilibrada.
Intercalación directa.
La intercalación directa o mezcla directa es un algoritmo de ordenación externa, que permite organizar los elementos de un archivo, de forma ascendente o descendente.
EL TORNEO DE TENIS PARA ORDENAMIENTO EXTERNO
La técnica de dividir para vencer tiene varias aplicaciones. No sólo en el diseño de algoritmos. Si no también en el diseño de circuitos, construcción de demostraciones matemáticas y en otros campos del quehacer humano. Se brinda un ejemplo para ilustrar esto. Considérese el diseño del programa de un torneo de tenis para n =Zk jugadores. Cada jugador debe enfrentarse a todos los demás. Y debe tener un encuentro diario durante n - I días, que es el número mínimo de días necesarios para completar el torneo. El programa del torneo
es una tabla den filas por n - 1 columnas cuya posición en fila i y columna j es el jugador con quien debe contender i el j-ksimo día. El enfoque dividir para vencer construyen un programa para la mitad de los jugadores. Que está diseñado por una aplicación recursiva del algoritmo buscando un programa para una mitad de esos jugadores, y así sucesivamente. Cuando se llega hasta dos jugadores, se tiene el caso base y simplemente se emparejan. Supóngase que hay ocho jugadores. El programa para los jugadores 1 a 4 ocupa la esquina superior izquierda (4 filas por 3 columnas) del programa que se está consumiendo. La esquina inferior izquierda (4 filas por 3 columnas) debe enfrentar a los jugadores con numeración más alta (5 a 8). Este subprograma se obtiene agregando 4 a cada entrada de la esquina superior izquierda. Ahora se ha simplificado el problema, y lo único que falta es enfrentar a los jugadores de baja numeración con los de alta numeración. Esto es fácil si los jugad* res 1 a 4 contienden con los 5 a 8, respectivamente, en el día4, y se permutan cíclicamente 5 a 8 en los días siguientes. El proceso se ilustra en la figura 10.4.
INTERACCIÓN CON LOTES. ALGORITMO BALANCEADO
Los árboles AVL están siempre equilibrados de tal modo que para todos los nodos, la altura de la rama izquierda no difiere en más de una unidad de la altura de la rama derecha o viceversa. Gracias a esta forma de equilibrio (o balanceo), la complejidad de una búsqueda en uno de estos árboles se mantiene siempre en orden de complejidad O (log n).
EL ALGORITMO POLI FASE PARA INTERACCIÓN POR LOTE
La ordenación de datos por intercalación es un proceso muy frecuente en programación. Esta operación es también un proceso que las personas encuentran comúnmente en sus rutinas diarias. Por ejemplo, cada elemento de la colección de datos de una agenda telefónica tiene un campo nombre, dirección y un número de teléfono. Una colección de datos clasificados se puede almacenar en un archivo, un vector o tabla, una lista enlazada o un árbol. Cuando
los datos están almacenados en vectores, tablas (arrays), listas enlazadas o árboles, la ordenación se denomina ordenación interna. Cuando los datos a clasificar se encuentran almacenados en archivos, en soporte de almacenamiento masivo (cintas o discos) el proceso de ordenación se denomina ordenación externa. Es un proceso utilizado en sistema de actualización, y en casos en que es necesario varias listas ordenadas. También es la única forma que hay para el ordenamiento de archivos, debido a la imposibilidad de almacenarlos en memoria y a limitaciones en el tiempo, por la cantidad de elementos a ordenar. El método de ordenación por intercalación es utilizado por los jugadores de cartas o naipes para ordenar sus barajas. Consiste en mirar las cartas una a unay cuando se ve cada
nueva carta se inserta en el lugar adecuado. Para desarrollar el
algoritmo imaginemos que las cartas se encuentran situadas en una fila encima del tapete; a medida que se ve una carta nueva, ésta se compara con la fila y se debe empujar alguna de ellas a la derecha para dejar espacio e insertar la nueva. Consideremos un vector de n posiciones. Comencemos con el subíndice i en la segunda posición incrementando en 1, el elemento del subíndice del vector se elimina de la secuencia y se reinserta en el vector en la posición adecuada.
EL ALGORITMO DE CASCADA
En numerosos casos en el desarrollo de la solución de problemas, encontramos que luego de tomar una decisión y marcar el camino correspondiente a seguir, es necesario tomar otra decisión. Luego de evaluar las condiciones, se señala nuevamente la rama correspondiente a seguir y nuevamente podemos tener que tomar otra decisión. El proceso puede repetirse numerosas veces. En el siguiente ejemplo tenemos una estructura selectiva SI ENTONCES que contiene dentro de ella otra estructura selectiva SI ENTONCES / SINO.
PROGRAMACIÓN DE PLICACIONES
ES UN PROGRAMA DISEÑADO PARA CUMPLIR UNA TAREA ESPECIFICA DENTRO DE ALGUNA DE LAS TANTAS RAMAS O CATEGORIAS DE LA INFORMATICA.. POR EJEMPLOS HAY PROGRAMAS DE APLICACION ESPECIFICA PARA EDICION DE AUDIO Y VIDEO, HABRA OTROS PARA TRABAJAR CON FOTOGRAFIAS, ETC
La interfaz de programación de aplicaciones, abreviada
como API1 (del inglés: Application Programming Interface), es el conjunto de subrutinas, funciones y procedimientos (o métodos, en la programación orientada a objetos) que ofrece cierta biblioteca para ser utilizado por otro software como una capa de abstracción.
Son usadas generalmente en las bibliotecas de programación.
CARACTERÍSTICAS
Una API representa la capacidad de comunicación entre componentes de software. Se trata del conjunto de llamadas a ciertas bibliotecas que ofrecen acceso a ciertos servicios desde los procesos y representa un método para conseguir abstracción en la programación, generalmente (aunque no necesariamente) entre los niveles o capas inferiores y los superiores del software. Uno de los principales propósitos de una API consiste en proporcionar un conjunto de funciones de uso general, por ejemplo, para dibujar ventanas oiconos en la pantalla. De esta forma, los programadores se benefician de las ventajas de la API haciendo uso de su funcionalidad, evitándose el trabajo de programar todo desde el principio. Las API asimismo son abstractas: el software que proporciona una cierta API generalmente es llamado la implementación de esa API.
Por ejemplo, se puede ver la tarea de escribir "Hola Mundo" sobre la pantalla en diferentes niveles de abstracción:
1. Haciendo todo el trabajo desde el principio:
1. Traza, sobre papel milimetrado, la forma de las letras (y espacio) "H, o, l, a, M, u, n, d, o".
2. Crea una matriz de cuadrados negros y blancos que se asemeje a la sucesión de letras.
3. Mediante instrucciones en ensamblador, escribe la
información de la matriz en la memoria intermedia (buffer) de pantalla.
4. Mediante la instrucción adecuada, haz que la tarjeta gráfica realice el volcado de esa información sobre la pantalla.
2. Por medio de un sistema operativo para hacer parte del trabajo:
1. Carga una fuente tipográfica proporcionada por el sistema operativo.
2. Haz que el sistema operativo borre la pantalla.
3. Haz que el sistema operativo dibuje el texto "Hola Mundo" usando la fuente cargada.
3. Usando una aplicación (que a su vez usa el sistema operativo) para realizar la mayor parte del trabajo:
4. Escribe un documento HTML con las palabras "Hola Mundo" para que un navegador web como Firefox, Chrome, Opera, Safari, Midori, Iceweasel, Web o Internet Explorer pueda representarlo en el monitor.
Como se puede ver, la primera opción requiere más pasos, cada uno de los cuales es mucho más complicado que los pasos de las
opciones siguientes. Además, no resulta nada práctico usar el primer planteamiento para representar una gran cantidad de información, como un artículo enciclopédico sobre la pantalla, mientras que el segundo enfoque simplifica la tarea eliminando un paso y haciendo el resto más sencillos y la tercera forma simplemente requiere escribir "Hola Mundo". Sin embargo, las API de alto nivel generalmente pierden flexibilidad; por ejemplo, resulta mucho más difícil en un navegador web hacer girar texto alrededor de un punto con un contorno parpadeante que programarlo a bajo nivel. Al elegir usar una API se debe llegar a un cierto equilibrio entre su potencia, simplicidad y pérdida de flexibilidad.
DEFINICIÓN DE ALGORITMO.
"Un algoritmo se define como un método que se realiza paso a paso para solucionar un problema que termina en un número finito de pasos".
Las características fundamentales que debe cumplir todo algoritmo son:
Debe ser preciso. e indicar el orden de realización de cada paso.
Debe ser definido. Si se sigue un algoritmo dos veces, se debe obtener el mismo resultado cada vez.
Debe ser finito. Si se sigue un algoritmo, se debe terminar en algún momento ; o sea debe tener un número finito de pasos.
La definición de un algoritmo debe describir tres partes : Entrada, Proceso y Salida.
Diseñar un algoritmo para cambiar una llanta a un coche.
Inicio.
Traer gato.
Levantar el coche con el gato.
Aflojar tornillos de las llantas.
Sacar los tornillos de las llantas.
Quitar la llanta.
Poner
ESTRUCTURA DE UN PROGRAMA Y REGLAS SINTÁCTICAS
Un lenguaje de programación es un lenguaje formal diseñado para
realizar procesos que pueden ser llevados a cabo por máquinas como las computadoras.
Pueden usarse para crear programas que controlen el comportamiento físico y lógico de una máquina, para expresar algoritmos con precisión, o como modo de comunicación humana.1
Está formado por un conjunto de símbolos y reglas sintácticas y semánticas que definen su estructura y el significado de sus elementos y expresiones. Al proceso por el cual se escribe, se prueba, se depura, se compila (de ser necesario) y se mantiene el código fuente de un programa informático se le llama programación.
También la palabra programación se define como el proceso de creación de un programa de computadora, mediante la aplicación de procedimientos lógicos, a través de los siguientes pasos:
El desarrollo lógico del programa para resolver un problema en particular.
Escritura de la lógica del programa empleando un lenguaje de programación específico (codificación del programa).
Ensamblaje o compilación del programa hasta convertirlo en lenguaje de máquina.
Prueba y depuración del programa.
Desarrollo de la documentación.
Existe un error común que trata por sinónimos los términos
'lenguaje de programación' y 'lenguaje informático'. Los lenguajes informáticos engloban a los lenguajes de programación y a otros más, como por ejemplo HTML (lenguaje para el marcado de páginas web que no es propiamente un lenguaje de programación, sino un conjunto de instrucciones que permiten estructurar el contenido de los documentos).
Permite especificar de manera precisa sobre qué datos debe operar
una computadora, cómo deben ser almacenados o transmitidos y qué acciones debe tomar bajo una variada gama de circunstancias. Todo esto, a través de un lenguaje que intenta estar relativamente próximo al lenguaje humano o natural. Una característica relevante de los lenguajes de programación es precisamente que más de un programador pueda usar un conjunto común de instrucciones que sean comprendidas entre ellos para realizar la construcción de un programa de forma colaborativa.
PALABRA RESERVADA:
En los lenguajes informáticos, una palabra reservada es una palabra que tiene un significado gramatical especial para ese lenguaje y no puede ser utilizada como un identificador de objetos en códigos del mismo, como pueden ser las variables.
Por ejemplo, en SQL, un usuario no puede ser llamado "group",
porque la palabra group es usada para indicar que un identificador
se refiere a un grupo, no a un usuario. Al tratarse de una palabra clave su uso queda restringido.
Ocasionalmente la especificación de un lenguaje de programación puede tener palabras reservadas que están previstas para un posible
uso en futuras versiones. En Javaconst y goto son palabras
reservadas — no tienen significado en Java, pero tampoco pueden ser usadas como identificadores. Al reservar los términos pueden ser implementados en futuras versiones de Java, si se desea, sin que el código fuente más antiguo escrito en Java deje de funcionar.
VARIABLE
Una variable es un objeto o partida de datos cuyo valor puede cambiar durante el desarrollo del algoritmo o ejecución del programa. Dependiendo del lenguaje, hay diferentes tipos de variables, tales como enteras, reales, carácter, lógicas y de cadena. Una variable que es de un cierto tipo puede tomar únicamente valores de ese tipo. Una variable de carácter, por ejemplo, puede tomar como valor sólo caracteres, mientras que una variable entera puede tomar sólo valores enteros.
Si se intenta asignar un valor de un tipo de una variable de otro tipo se producirá un error de tipo. Una variable se identifica por los siguientes atributos: nombre que lo asigna y tipo que describe el uso de la variable.
Los nombres de las variables, a veces conocidos como identificadores, suelen constar de varios caracteres alfanuméricos, de los cuales el primero normalmente es una letra. No se deben utilizar –aunque lo permita el lenguaje- como nombres de identificadores palabras reservadas del lenguaje de programación. Nombres válidos de variables son:
A510
NOMBRES
NOTAS
NOMBRE_APELLIDOS
Los nombres de las variables elegidas para el algoritmo o el
programa deben ser significativos y tener relación con el objeto que representan, como pueden ser los casos siguientes:
NOMBRE para representar nombres de personas
PRECIOS para representar los precios de diferentes artículos
NOTAS para representar las notas de una clase
EXPRESIONES
En programación, una variable está formada por un espacio en el sistema de almacenaje (memoria principal de un ordenador) y un nombre simbólico (un identificador) que está asociado a dicho espacio. Ese espacio contiene una cantidad o información conocida o desconocida, es decir un valor. El nombre de la variable es la forma usual de referirse al valor almacenado: esta separación entre nombre y contenido permite que el nombre sea usado independientemente de la información exacta que representa. El identificador, en el código fuente de la computadora puede estar ligado a un valor durante el tiempo de ejecución y el valor de la variable puede por lo tanto cambiar durante el curso de la ejecución del programa. El concepto de variables en computación puede no corresponder directamente al concepto de variables en matemática. El valor de una variable en computación no es
necesariamente parte de una ecuación o fórmula como en matemáticas. En computación una variable puede ser utilizada en un proceso repetitivo: puede asignársele un valor en un sitio, ser luego utilizada en otro, más adelante reasignársele un nuevo valor para
más tarde utilizarla de la misma manera. Procedimientos de este
tipo son conocidos con el nombre de iteración. En programación de computadoras, a las variables, frecuentemente se le asignan nombres largos para hacerlos relativamente descriptivas para su uso, mientras que las variables en matemáticas a menudo tienen nombres escuetos, formados por uno o dos caracteres para hacer breve en su transcripción y manipulación.
El espacio en el sistema de almacenaje puede ser referido por distintos identificadores diferentes. Esta situación es conocida entre los angloparlantes como "aliasing" y podría traducirse como "sobre nombramiento" para los hispanoparlantes. Asignarle un valor a una variable utilizando uno de los identificadores cambiará el valor al que se puede acceder a través de los otros identificadores.
Los compiladores deben reemplazar los nombres simbólicos de las variables con la real ubicación de los datos. Mientras que el nombre, tipo y ubicación de una variable permanecen fijos, los datos almacenados en la ubicación pueden ser cambiados durante la ejecución del programa.
Las variables pueden ser de longitud:
Fija.- Cuando el tamaño de la misma no variará a lo largo de la
ejecución del programa. Todas las variables, sean del tipo que sean tienen longitud fija, salvo algunas excepciones — como las colecciones de otras variables (arrays) o las cadenas.
Variable.- Cuando el tamaño de la misma puede variar a lo largo de la ejecución. Típicamente colecciones de datos.
TIPO DE DATOS
Debido a que las variables contienen o apuntan a valores de tipos
determinados, las operaciones sobre las mismas y el dominio de sus propios valores están determinadas por el tipo de datos en cuestión. Algunos tipos de datos usados:
Tipo de dato lógico.
Tipo de dato entero.
Tipo de dato de coma flotante (real, con decimales).
Tipo de dato carácter.
Tipo de dato cadena
INSTRUCCIONES ASOCIADAS A
Un programa informático o programa de computadora es una secuencia de instrucciones, escritas para realizar una tarea específica en una computadora.1 Este dispositivo requiere programas para funcionar, por lo general, ejecutando las instrucciones del programa en un procesador central.2 El programa tiene un formato ejecutable que la computadora puede utilizar directamente para ejecutar las instrucciones. El mismo programa en su formato de código fuente legible para humanos, del cual se derivan los programas ejecutables(por ejemplo, compilados), le permite a un programador estudiar y desarrollar sus algoritmos. Una colección de programas de computadora y datos relacionados se
conoce como software.
Generalmente, el código fuente lo escriben profesionales conocidos como programadores de computadora.3 Este código se escribe en un lenguaje de programación que sigue uno de los siguientes dos paradigmas: imperativo o declarativo, y que posteriormente puede ser convertido en un archivo ejecutable (usualmente llamado
un programa ejecutable o un binario) por un compilador y más tarde
ejecutado por una unidad central de procesamiento. Por otra parte, los programas de computadora se pueden ejecutar con la ayuda de un intérprete, o pueden ser empotrados directamente en hardware.
De acuerdo a sus funciones, los programas informáticos se clasifican en software de sistema y software de aplicación. En las computadoras de 2015, al hecho de ejecutar varios programas de forma simultánea y eficiente, se lo conoce como multitarea.
DATOS, TIPOS DE DATOS Y OPERACIONES PRIMITIVAS
DATOS, TIPOS DE DATOS Y OPERACIONES PRIMITIVAS El primer objetivo de toda computadora es el manejo de la información o datos. Estos datos pueden ser las cifras de ventas de un supermercado o las calificaciones de una clase. Un dato es la expresión general que describe los objetos con los cuales opera una computadora. La mayoría de las computadoras pueden trabajar con varios tipos (modos) de datos. Los algoritmos y los programas correspondientes operan sobre esos tipos de datos.
La acción de las instrucciones ejecutables de las computadoras se reflejan en cambios en los valores de las partidas de datos. Los datos de entrada se transforman por el programa, después de las etapas
intermedias, en datos de salida.
En el proceso de resolución de problemas el diseño de la estructura
de datos es tan importante como el diseño del algoritmo y del programa que se basa en el mismo.
Existen dos tipos de datos: simples (sin estructura) y compuestos (estructurados). Los datos estructurados son conjuntos de partidas de datos simples con relaciones definidas entre ellos.
Los distintos tipos de datos se representan en diferentes formas en la computadora. A nivel de máquina, un dato es un conjunto o secuencia de bits (dígitos 0 o 1). Los lenguajes de alto nivel permiten basarse en abstracciones e ignorar los detalles de la representación interna. Aparece el concepto de tipo de datos, así como su representación. Los tipos de datos simples son los siguientes:
Numéricos (integer, real) Lógicos (boolean) Carácter (char, string) Existen algunos lenguajes de programación que admiten otros tipos de datos; complejos, que permiten tratar los números complejos, y otros lenguajes que también permiten declarar y definir sus propios tipos de datos: enumerados (enumerated) y subrango (subrange).
ESTRUCTURAS DE CONTROL
OPERACIONES ARITMETICAS
Las operaciones aritméticas son: suma, resta, multiplicación, división, potenciación, división entera. +, -, *, /, ^, %/% or %%
Las operaciones aritméticas básicas.
Los números representan unidades de cosas; pero es posible utilizarlos como solamente números; y de esa forma, realizar con ellos diversas operaciones que sirven para realizar cálculos que
son muy útiles; y que se llaman operaciones aritméticas.
Esas operaciones son:
— La SUMA — (también llamada ADICIÓN), que se representa con el signo de MÁS: +
— La RESTA — (también llamada SUSTRACCIÓN o DIFERENCIA) que se representa con el signo de MENOS: –
— La MULTIPLICACIÓN — que se representa con el signo de POR: ×
— La DIVISIÓN — que se representa con el signo de DIVIDIDO: ÷
El resultado de las operaciones, se representa utilizando el signo de IGUAL: =
Ir al principio
La suma.
La SUMA es la operación aritmética mediante la cual, teniendo dos o más números, se acumula la cantidad de unidades que cada
uno representa, para obtener otro número que representa la cantidad de todos ellos.
Cada uno de los números que representan las unidades de uno y otro grupo, se denominan SUMANDOS.
1 2 + 1 2 = 1 2 3 4
Esa operación se representa colocando solamente el número
que representa el total de las unidades de cada sumando y también el que representa el resultado de la suma:
2 + 2 = 4
5 + 2 = 7
Ir al principio
La resta.
La RESTA es la operación aritmética mediante la cual, teniendo dos números, se quita de la que tiene más cantidad de unidades,
la que tiene menos cantidad de unidades, para obtener otro número que representa la diferencia de cantidad entre ellos.
El mayor de los números se denomina MINUENDO; y el menor se denomina SUSTRAENDO.
1 2 3 4 5 – 1 2 = 1 2 3
Esta operación también se representa colocando solamente el
número que representa el total de las unidades de cada término y también el que representa el resultado de la resta:
5 – 2 = 3
9 – 4 = 5
Ir al principio
La multiplicación.
La MULTIPLICACIÓN es la operación aritmética en la cual, se suma varias veces el mismo número. El número se
denomina MULTIPLICANDO; y el otro número, que representa la cantidad de veces que el multiplicando es sumado, se
denomina MULTIPLICADOR. El resultado de la multiplicación, se denomina PRODUCTO
1 2 + 1 2 + 1 2 + 1 2 = 1 2 3 4 5 6 7 8
Cuando se representa la multiplicación utilizando solamente el
número que representa el multiplicando y el que representa el multiplicador, se utiliza el signo de POR:
2 × 4 = 8
3 × 3 = 9
Ir al principio
La división.
La DIVISIÓN es la operación aritmética en la cual, teniendo un número mayor que UNO, se le hace con él varias partes iguales.
El número se denomina DIVIDENDO; y la cantidad de partes iguales que pueden hacerse, se denomina DIVISOR.
1 2 3 4 5 6 7 8 – 1 2 = 1 2 3 4 5 6
1 2 3 4 5 6 – 1 2 = 1 2 3 4
1 2 3 4 – 1 2 = 1 2
1 2 – 1 2 = 0
Esta división se representa utilizando solamente el número que representa el dividendo y el que representa el divisor, y se
utiliza el signo de DIVIDIDO:
8 ÷ 4 = 2
9 ÷ 3 = 3
La división es como una multiplicación hecha “al revés”; por lo cual se dice que es la inversa de la multiplicación. Esto permite
hacer una prueba para saber si el resultado de la división que se obtuvo es el correcto; que consiste en multiplicar ese resultado
por el divisor, y si la división estuvo bien hecha, dará como resultado el dividendo.
8 ÷ 4 = 2
4 × 2 = 8
FUNCIONES MATEMÁTICAS.
Casi cualquier lenguaje de programación tiene incorporadas ciertas funciones matemáticas, de modo que nos permita calcular raíces cuadradas, logaritmos, senos y cosenos, etc.
Lo mismo ocurre en muchas variantes de pseudocódigo. Por ejemplo, PseInt incluye las siguientes funciones matemáticas:
Función Significado
RC(X) o RAIZ(x) Raíz Cuadrada de X
ABS(X) Valor Absoluto de X
LN(X) Logaritmo Natural de X
EXP(X) Función Exponencial de X
SEN(X) Seno de un ángulo X (medido en radianes)
COS(X) Coseno de un ángulo X (medido en radianes)
TAN(X) Tangente de un ángulo X (medido en radianes)
ASEN(X) Arco seno de X
ACOS(X) Arco coseno de X
ATAN(X) Arco tangente de X
TRUNC(X) Parte entera de X
REDON(X) Entero más cercano a X
AZAR(X) Entero aleatorio entre 0 y x-1
(Si no sabes qué hace alguna de estas funciones, no te preocupes mucho, es señal de que hasta ahora no la has necesitado... ; -) Las más importantes de ellas las probaremos directamente como parte de los ejercicios)
Ejercicio de repaso propuesto 10.1: Crea un programa que genere un
número al azar entre el 1 y el 100. El usuario tendrá 7 oportunidades para adivinarlo. Tras cada intento, se le dirá si se ha pasado o se ha quedado corto.
Ejercicio de repaso propuesto 10.2: Haz un programa que calcule raíces cuadradas: el usuario introducirá un número y se le mostrará su raíz cuadrada. Se repetirá hasta que introduzca el número 0 (para el que no se deberá mostrar su raíz). Si introduce un valor negativo, se deberá mostrar un aviso en vez de intentar calcular su raíz.
Ejercicio de repaso propuesto 10.3: PseInt no incluye ninguna función para calcular raíces cúbicas ni con ningún otro índice distinto de 2, pero esto es algo fácil de solucionar: para hallar la raíz cúbica de un número basta con elevar a (1/3). Pruébalo con un programa que calcule la raíz cúbica de un número introducido por el usuario (puedes comprobar que funciona correctamente si pruebas con el número 8, cuya raíz cúbica es 2).
Ejercicio de repaso propuesto 10.4: Si has estudiado trigonometría, quizá te suene que el seno de un ángulo de 45 grados es (raíz de 2) / 2. Haz un programa que muestre los resultados de ambas operaciones, para ver si parecen iguales. Recuerda que el ángulo se ha de indicar en radianes y que puedes convertir de grados a radianes multiplicando por PI y dividiendo por 180: SEN(45*PI/180).
Ejercicio de repaso propuesto 10.5: Pide al usuario dos números y muestra la "distancia" entre ellos (el valor absoluto de su diferencia, de modo que el resultado sea siempre positivo).
Ejercicio de repaso propuesto 10.6: Pide al usuario dos pares de números x1,y2 y x2,y2, que representen dos puntos en el plano. Calcula y muestra la distancia entre ellos (raíz cuadrada de ((x1-x2)2 + (y1-y2)2).
Manejo de Caracteres en Java
El manejo de caracteres es un conjunto de métodos y sentencias del Lenguaje Java que nos permite operar(reconocer, transformar, verificar, comparar, etc.) con los caracteres de una cadena de texto, ciertos parámetros que señalamos, de todos, los más comunes e importantes los listo a continuación: String toLowerCase(); Nos permite transformar todos los caracteres de una cadena en Minúsculas. Ejm: String sCadena = "CADENA DE PRUEBA GL"; System.out.println(sCadena.toLowerCase()); //cadena de prueba gl String toUpperCase(); Nos permite transformar todos los caracteres de una cadena en Mayúsculas.
Ejm: String sCadena = "Cadena de Prueba GL"; System.out.println(sCadena.toUpperCase()); //CADENA DE PRUEBA GL String trim();
Método que elimina los espacios en blanco iniciales y finales de la
cadena de caracteres, retornando una copia de la misma. Ejm: String sCadena = " Esto Es Una Cadena" ; System.out.println(sCadena.trim()); //Devuelve "Esto Es Una Cadena" String replace(char oldChar, char newChar) Este método lo utilizamos siempre y cuando deseamos remplazar un carácter por otro. Se reemplazarán todos los caracteres encontrados. Una implementación práctica de esto se encuentra en Microsoft Office Word, que nos permite buscar cierto caracter o cadena de caracteres y reemplazarlos automáticamente con otro, incluso lo podemos dejar en blanco. Sintaxis a seguir: public String replace(char caracter_antiguo, char caracter_nuevo) public String replace(CharSequence target, CharSequence replacement) Ejm: String cadena = new String("Falta de sexo"); System.out.println(cadena.replace('x','s'); //Reemplaza todas las 'x'
por 's' //Por tanto imprime: Falta de seso String valueOf(); Este conjunto de métodos de la Clase String nos permite convertir cualquier tipo de dato básico (int, double, float,etc. ) a cadena; en el caso de que tengamos con arrary de caracteres para convertir en una cadena, podemos tener una excepción IndexOutOfBoundsException en el caso de que intentemos acceder
a un elemento que no exista. , a continuación los método que nos
permite utilizar valueOf : String valueOf(boolean b); String valueOf(int i); String valueOf(long l); String valueOf(float f);, String valueOf(double d); String valueOf(Object obj); Detalles de los Parámetros para valueOf: b, valor booleano a convertir en cadena. c, caracter a convertir en cadena. i, numero entero a convertir en cadena. l, long a convertir en cadena. f, decimal a convertir en cadena. d, double a convertir en cadena. data, array a convertir en cadena. offset, desplazamiento a partir va a empezar la conversión. count, número de caracteres a convertir de la cadena. obj, objeto a convertir en cadena. Excepción para ValueOf: Indica que el índice pasado como parámetro está fuera de rango (que no existe). Esto aplica a elementos como Array, Vector, String,
etc. Sintaxis a seguir: public IndexOutOfBoundsException() Constructores: IndexOutOfBoundsException() IndexOutOfBoundsException(String s)
Ejm:
String cadena = new String("Mi cadena");//Aquí solo hay 9 elementos char caracter = ; try{ caracter = cadena.charAt('40');//Al tratar de acceder al elemento 40 de nuestra cadena, nos da error ya que no existe. } catch (IndexOutOfBoundsException ioobe){ System.out.println("No existe un carácter en esa posición"); }
ESTRUCTURA DE DATOS
En programación, una estructura de datos es una forma particular de organizar datos en una computadora para que pueda ser utilizado de manera eficiente.
Diferentes tipos de estructuras de datos son adecuados para diferentes tipos de aplicaciones, y algunos son altamente especializados para tareas específicas.
Las estructuras de datos son un medio para manejar grandes cantidades de datos de manera eficiente para usos tales como grandesbases de datos y servicios de indización de Internet. Por lo general, las estructuras de datos eficientes son clave para diseñar algoritmoseficientes. Algunos métodos formales de diseño y lenguajes de programación destacan las estructuras de datos, en lugar de los algoritmos, como el factor clave de organización en el diseño de software.
OPERACIONES ESPECIALES
RESOLUCIÓN DE PROBLEMAS QUE IMPLICAN LA REALIZACIÓN DE DOS
OPERACIONES
En el algoritmo ABN surgen varias operaciones que simplifican y la
resolución de problemas que requieren varias operaciones
y que tras la realización de la primera el dato obtenido nos permita
realizar la siguiente operación. Este tipo de problemas
contienen un grado de complejidad, sobre todo de comprensión,
que desde el algoritmo ABN se simplifica sustancialmente,
además de permitir reaizarlas en un nivel inferior al que se realian
en el algoritmo tradicional. Se de una particularidad exclusiva
del método ABN que le facilita al niño resolver estas situaciones.
Estas operaciónes son: (Hacer clic en el nombre para
profundizar en la operación)
1- La "sumirresta": Problemas que implican sumar y restar. Ejemplo:
2- "Pedro tiene 28 cromos en una cajita y
3- 12 que acaba de comprar, si regala a un amigo, 16 que tiene
4- repetidos. ¿Con cuantos se queda?
Los pasos son múltiples, a continuación dejamos una de ellas, en la que en
el primer paso hemos retirado 10 de los cromos
que va a regalar del grupo de 12, quedando 28 y 2 cromos y aún por quitar 6.
En el segundo paso retiramos 6 cromos de los veintiocho (podríamos
hacer cualquier convinación como por ejemplo
quitar cuatro de 28 y dos del 2) quedando 24 y 2.
En el último paso, como ya hemos retirado los que ha regalado, sólo
queda sumar los que tienen 22 + 2
Subrutina,procedimiento y funciones
Diagrama del funcionamiento de una subrutina.
En informática, una subrutina o subprograma (también llamada procedimiento, función , rutina o método), como idea general, se presenta como un subalgoritmo que forma parte del algoritmo principal, el cual permite resolver una tarea específica. Algunos lenguajes de programación, como Visual Basic .NET o Fortran, utilizan el nombre función para referirse a subrutinas que devuelven un valor.
SUBPROGRAMAS / SUBPROCEDIMIENTOS / SUBRUTINAS ¿Por qué
los utilizamos? Estas son unas de las razones: 1. Modularización.
Cada subprograma tiene una misión muy concreta, de modo que
nunca tiene un número de líneas excesivo y siempre se mantiene
dentro de un tamaño manejable. Además, un mismo subprograma
puede ser llamado muchas veces en un mismo programa, e incluso
puede ser reutilizadp por otros programas. 2. Ahorro de memoria y
tiempo de desarrollo. En la medida en que un mismo subprograma
es utilizado muchas veces, el número total de líneas de código del
programa disminuye, y también lo hace la probabilidad de introducir
errores en el programa. 3. Independencia de datos. Existen 2 tipos
de Subprogramas: FUNCIONES y PROCEDIMIENTOS FUNCIONES
PROCEDIMIENTOS SINTAXIS Sintaxis: Function miFuncion ([
parámetros]) [As tipo] [ sentencias] [ miFuncion = expresion] End
Function El nombre de la función, que es el valor de retorno, actúa
como una variable dentro del cuerpo de la función. (*) Mirar teoría
Parámetros Sintaxis: Sub nombre ([parámetros]) [instrucciones] End
Sub (*) Mirar teoría Parámetros VALORES DEVUELTOS Las funciones
DEVUELVEN SIEMPRE un valor. Por eso a la hora de INVOCARLAS se
encuentran SIEMPRE a la derecha de una expresión (no pueden
aparecer “solas”): En ejecución, la llamada a la función se sustituye
por el valor que devuelve dicha función Ej:
Pagar=CalculoIVA(importe, iva) No se invocan con CALL Los
procedimientos NO DEVUELVEN NUNCA ningún valor. Por eso a la
hora de INVOCARLOS aparecen “solos”, sin estar contenidos en
ninguna expresión: Ej1: Call calcularRectangulo Ej2: Call
calcularTriangulo Ej3 Call miProcedimiento(dato1) Se invocan con
CALL Fundamentos de Informática. PARÁMETROS Admiten el paso
de PARÁMETROS, tanto por VALOR como por REFERENCIA. Admiten
el paso de PARÁMETROS, tanto por VALOR como por REFERENCIA.
EJEMPLOS PROGRAMAS Option Explicit Private Function
Factorial(ByVal X As Integer) As Long Dim i As Integer, xfact As Long
xfact =1 for i=1 to x step 1 xfact = xfact * i next i Factorial = xfact End
Function Private Sub cmdPulsame_Click() Dim A As Integer Dim B As
Integer,resultado As Single Dim A_Fact,B_Fact,A_menos_B_Fact As
Long A = InputBox(“Introduce un número:”) B = InputBox(“Introduce
un número:”) A_Fact = Factorial(A) B_Fact = Factorial(B)
A_Menos_B_Fact = Factorial(A-B) resultado = A_fact / (B_Fact *
A_Menos_B_Fact) MsgBox(“El resultado de la combinación : “ &
resultado) End Sub Option Explicit Dim opcion Private Sub
cmdCalcular_Click() If opcion = 1 Then Call calcularRectangulo Else
Call calcularTriangulo End If End Sub Sub calcularRectangulo()
txtArea.Text = Val(txtBase.Text)*Val(txtAltura.Text) End Sub Sub
calcularTriangulo() txtArea.Text = (Val(txtBase.Text) *
Val(txtAltura.Text) / 2) End Sub Private Sub cmdSeleccionar_Click()
opcion = InputBox("Seleccione una de estas:" + _ vbCrLf + "1.-
Rectangulo" + vbCrLf + _ "2.- Triangulo", "Introduzca una opcion")
End Sub PROCEDIMIENTOS Y FUNCIONES DE VB 2 Fundamentos de
Informática. EJEMPLOS PROGRAMAS Function Raiz (N As Double) As
Double If N < 0 Then Exit Function Else Raiz = Sqr(N) End Function
Cuadrada = Raiz(Num)
FUNCIONES
Desde el punto de vista matemático, una función es una operación
que toma uno
o varios operandos, y devuelve un resultado. Y desde el punto de
vista
algorítmico, es un subprograma que toma uno o varios parámetros
como entrada
y devuelve a la salida un único resultado.
Pascal: En las funciones se puede devolver más de un único resultado
mediante
parámetros.
C: Se devuelve todo por parámetros.
Este único resultado irá asociado al nombre de la función. Hay dos
tipos de
funciones:
Internas: Son las que vienen definidas por defecto en el lenguaje.
Externas: Las define el usuario y les da un nombre o identificador.
Para llamar a una función se da su nombre, y entre paréntesis van los
argumentos o parámetros que se quieren pasar.
Declaración de una función:
La estructura de una función es semejante a la de cualquier
subprograma. Tendrá
una cabecera (con el nombre y los parámetros) y un cuerpo (con la
declaración
de los parámetros de la función y las instrucciones).
Sintaxis:
Función <nombre_funcion> (n_parametro: tipo, n_parametro:
tipo): tipo función
Var <variables locales función>
<acciones>
retorno <valor>
fin <nombre_funcion>
La lista de parámetros es la información que se le tiene que pasar a la
función.
Los parámetros luego dentro de la función los podemos utilizar igual
que si
fueran variables locales definidas en la función y para cada parámetro
hay que
poner su nombre y tipo.
El nombre de la función lo da al usuario y tiene que ser significativo.
En las variables locales se declaran las variables que se pueden usar
dentro de
la función.
Entre las acciones tendrá que existir entre ellas una del tipo retorno
<valor>.
Esta sentencia pondrá fin a la ejecución de la función y devolverá el
valor de la
función, es decir, como valor asociado al nombre de mismo tipo que
el tipo de
datos que devuelve a la función, este valor por tanto tiene que ser del
mismo tipo
que el tipo de datos que devuelve la función, que es el que habremos
indicado al
declarar la función en la parte final de la cabecera.
No se permiten funciones que no devuelvan nada.
Los parámetros que aparecen en la declaración de la función se
denominan
parámetros formales, y los parámetros que yo utilizo cuando llamo a
la función se
denominan parámetros actuales o reales.
Invocación de una función:
Para llamar a una función se pone el nombre de la función, y entre
paréntesis los
parámetros reales, que podrán ser variables, expresiones,
constantes,... pero
siempre del mismo tipo que los parámetros normales asociados
<nombre_funcion> (parámetros reales)
La función puede ser llamada desde el programa principal o desde
cualquier otro
subprograma.
Para llamar a la función desde cualquier parte, implica el
conocimiento previo de
que ésta función existe.
A través de los parámetros reales de la llamada se proporciona a la
función la
información que necesita, para ello, al hacer la llamada lo que se
produce es una
asociación automática entre parámetros reales y parámetros
formales. Esta
asociación se realiza según el orden de la aparición y de izquierda y
derecha.
Si el parámetro formal y real no es del mismo tipo, en Pascal se
produce un
error, y en C se transforman los tipos si es posible.
La llamada a una función, siempre va a formar parte de una
expresión, de
cualquier expresión en la que en el punto en la que se llama a la
función, pudiera
ir colocado cualquier valor del tipo de datos que devuelve la función,
esto se
debe a que el valor que devuelve una función está asociado a su
nombre.
Pasos para hacer la llamada a una función:
Al hacer la llamada y ceder el control a la función, se asocia (asigna
el valor)
de cada parámetro real a cada parámetro formal asociado, siempre
por orden de
ESTRUCTURA DE LOS DATOS INTERNOS
Operaciones Con Arreglos
Las operaciones en arreglos pueden clasificarse de la siguiente forma:
• Lectura
• Escritura • Asignación • Actualización • Ordenación • Búsqueda
a) LECTURA Este proceso consiste en leer un dato de un arreglo y
asignar un
Valor a cada uno de sus componentes. La lectura se realiza de la
siguiente
Manera: para i desde 1 hasta N haz x<-- arreglo[i]
b) ESCRITURA Consiste en asignarle un valor a cada elemento del
arreglo. La
Escritura se realiza de la siguiente manera: para i desde 1 hasta N haz
Arreglo[i]<-- x
c) ASIGNACIÓN No es posible asignar directamente un valor a todo el
arreglo,
Por lo que se realiza de la manera siguiente: para i desde 1 hasta N
haz
Arreglo[i]<-- algún_valor
d) ACTUALIZACIÓN Dentro de esta operación se encuentran las
operaciones de
Eliminar, insertar y modificar datos. Para realizar este tipo de
operaciones se
Debe tomar en cuenta si el arreglo está o no ordenado.
vectores
MATRICES
BUSQUEDA
Un algoritmo de búsqueda es aquel que está diseñado para localizar un elemento con ciertas propiedades dentro de una estructura de datos; por ejemplo, ubicar el registro correspondiente a cierta persona en una base de datos, o el mejor movimiento en una partida de ajedrez.
La variante más simple del problema es la búsqueda de un número en un vector.
Búsqueda dicotómica
Elementos necesarios en una búsqueda :
log2(n) donde n = elementos de la búsqueda
Ejemplo: log2(1.000.000) ≈ 20
Búsqueda secuencial
Se utiliza cuando el vector no está ordenado o no puede ser ordenado previamente. Consiste en buscar el elemento comparándolo secuencialmente (de ahí su nombre) con cada elemento del vector hasta encontrarlo, o hasta que se llegue al final. La existencia se puede asegurar cuando el elemento es localizado, pero no podemos asegurar la no existencia hasta no haber analizado todos los elementos del vector. A continuación se muestra el pseudocódigo del algoritmo:[cita requerida]
Datos de entrada: vec: vector en el que se desea buscar el dato tam: tamaño del vector. Los subíndices válidos van desde 0 hasta tam-1 inclusive. Puede representarse así: vec[0...tam) o vec[0...tam-1]. dato: elemento que se quiere buscar. Variables
pos: posición actual en el vector
pos = 0 while pos < tam: if vec[pos] == dato: Retorne verdadero y/o pos, else: pos = pos + 1 Fin (while) Retorne falso,
C
int busquedaSimple(int vector[n], int n, int dato) { int i; for(i=0; i<n; i++){ if(dato==vector[i]) { return i; break;
} } return -1; }
Búsqueda dicotómica (binaria)
Se utiliza cuando el vector en el que queremos determinar la existencia de un elemento está previamente ordenado. Este
algoritmo reduce el tiempo de búsqueda considerablemente, ya que
disminuye exponencialmente el número de iteraciones necesarias.
Está altamente recomendado para buscar en arrays de gran tamaño. Por ejemplo, en uno conteniendo 50.000.000 elementos, realiza como máximo 26 comparaciones (en el peor de los casos).
Para implementar este algoritmo se compara el elemento a buscar con un elemento cualquiera del array (normalmente el elemento central): si el valor de éste es mayor que el del elemento buscado se repite el procedimiento en la parte del array que va desde el inicio de éste hasta el elemento tomado, en caso contrario se toma la parte del array que va desde el elemento tomado hasta el final. De esta manera obtenemos intervalos cada vez más pequeños, hasta que se obtenga un intervalo indivisible. Si el elemento no se encuentra dentro de este último entonces se deduce que el elemento buscado no se encuentra en todo el array.
A continuación se presenta el pseudocódigo del algoritmo, tomando como elemento inicial el elemento central del array.
Datos de entrada: vec: vector en el que se desea buscar el dato tam: tamaño del vector. Los subíndices válidos van desde 0 hasta tam-1 inclusive. dato: elemento que se quiere buscar. Variables centro: subíndice central del intervalo
inf: límite inferior del intervalo sup: límite superior del intervalo inf = 0 sup = tam-1
Mientras inf <= sup:
centro = ((sup - inf) / 2) + inf // División entera: se trunca la fracción Si vec[centro] == dato devolver verdadero y/o pos, de lo contrario: Si dato < vec[centro] entonces: sup = centro - 1 En caso contrario: inf = centro + 1 Fin (Mientras) Devolver Falso
C
int busquedaBinaria(int vector[], int n, int dato) { int centro,inf=0,sup=n-1; while(inf<=sup){ centro=((sup-inf)/2)+inf; if(vector[centro]==dato) return centro; else if(dato < vector[centro]) sup=centro-1; else inf=centro+1; }
return -1; }
Implementación recursiva en C++ [cita requerida]
C++
#include <vector> bool busqueda_dicotomica(const vector<int> &v, int principio, int fin, int &x){ bool res;
if(principio <= fin){
int m = ((fin - principio)/2) + principio; if(x < v[m]) res = busqueda_dicotomica(v, principio, m-1, x); else if(x > v[m]) res = busqueda_dicotomica(v, m+1, fin, x); else res = true; }else res = false; return res; } /*{Post: Si se encuentra devuelve true, sino false}*/
Implementación recursiva en Python
Python
def busquedaBinaria (numeros, inicio, fin, elemento): if (inicio == fin): return numeros [inicio] == elemento centro = ((fin - inicio) // 2) + inicio if (elemento < numeros [centro]): return busquedaBinaria (numeros, inicio, centro, elemento)
elif (elemento > numeros [centro]): return busquedaBinaria (numeros, centro + 1, fin, elemento) else: return True def busqueda (numeros, elemento): if (numeros == None) or (numeros == []): return False
else: return busquedaBinaria (numeros, 0, len (numeros) - 1,
elemento)
Implementación recursiva en Python3
Python
def bin(a,x,low,hi): ans = -1 if low==hi: ans = -1 else: mid = (low+((hi-low)//2)) if x < a[mid]: ans = bin(a,x,low,mid) elif x > a[mid]: ans = bin(a,x,mid+1,hi) else: ans = mid return ans # Así se hace el llamado: print(binseacrh(Lista,a_buscar,0,len(Lista))) # Retorna el indice que coincide con 'numero a buscar', sino está retorna -1 # Tiempo: (log n)
Implementación iterativa en Python3
Python
def bin(a, c): ans = -1 if a[0] >= c: ans = -1 else: low, hi = 0, len(a)
while low+1 != hi:
mid = low + ((hi-low)//2) if a[mid] < c: low = mid else: hi = mid ans = low return ans # Así se hace el llamado: print(bin(lista(), numero_a_buscar) ) # Retorna el indice que coincide con 'numero a buscar', sino está retorna -1 # Tiempo: (log n)
SELECCIÓN
El ordenamiento por selección (Selection Sort en inglés) es
un algoritmo de ordenamiento que requiere O operaciones para
ordenar una lista de n elementos.
REEMPLAZO
En el ámbito de la programación informática, la acción de
reemplazar valores se da constantemente, en diferentes casos. En
primer lugar, cabe mencionar que para ejecutar software (lo que
incluye una aplicación, un videojuego o un sistema operativo, según
el punto
de vista)
los
procesadores necesitan almacenarlo en memoria principal; allí, le
asignan aleatoriamente espacios para cada uno de sus
componentes, siendo las variables los más pequeños.
MATRICES
POLIEDROS
ARRAYS MULTIDIFUNCIONALES
ÁRBOLES BALANCEADOS
Habíamos visto que se puede demostrar por inducción que en un árbol completo el número de nodos totales es
(2 ** h+1) –1. Esto nos indica que las cosas que se hacen en árboles son de orden log n pero sólo
en el caso en
que el árbol esté lleno. En el peor de los casos las cosas pueden ser lineales O(n). ¿Cómo poder garantizar,
entonces que se mantenga un balanceo? Cada vez que debido a una inserción o eliminación el árbol se
desbalancee, reubicar los nodos de modo que, manteniendo el invariante de un árbol de
búsqueda binaria,
se trate de mantener la altura del árbol. Ej:
El primer tipo de árboles balanceados fue el AVL (Adelson Velskii Landis). No son frecuentemente
implementados, ya que hay otros mejores, pero las ideas que hay detrás de ellos se ven en los
demás tipos de árboles balanceados. Se trata de incluir otra condición más en el invariante de
modo de asegurar que la búsqueda sea O(log n): LO más simple sería requerir que para un árbol
AVL la altura de su subárbol derecho sea igual a la de su subárbil izquierdo. Recordemos que los
árboles se definen recursivanmete, por lo tanto esto se debería cumplir para cada nodo. Esto es
sin embargo muy restrictivo ya que implicaría que todo árbol AVL debería ser completo además. La definición de árboles AVL es entonces algo más relajada:
Def: Un árbol AVL es un árbol binario con la propiedad adicional que para cualquier nodo
En el árbol la altura de su subárbol izquierdo y de su subárbol derecho difieren a lo más en
1.
Esta condición asegura que el árbol sólo tendrá altura logarítmica. Para probar esto necesitamos
mostrar que un árbol de altura H tiene por lo menos C**H nodos para alguna constante H>1. En
otras palabras, si el mínimo número de nodos en un árbol es exponencial a su altura, entonces la
máxima altura de un árbol con N elementos es dada por Log en base C de N. Esto se puede probar con los números de Fibonacci:
Sea S(H) un árbol AVL con altura H y con el mínimo de elementos para esa altura. Entonces S(0) = 1
y S(1) = 2. Ahora, por la condición de un árbol AVL sabemos que un árbol AVL mínimo de altura H
tiene como hijos uno mínimo de altura H-1 y otro mínimo de altura H-2, ya que el desbalanceo
puede ser a lo más de 1. Del dibujo podemos ver que la cantidad de nodos de este árbol es S(H) =
S(H-1) + S(H-2) + 1. Ahora los números de Fibonacci eran F(N) = F(N-1)+F(N-2) con F(0) = 1 y F(1) =
1. Corrigiendo: S(H) = F(H+3). Ahora, se sabe que el fibonacci de un número i es alrededor de
(K**i)/sqrt(5) con K alrededor de 1.618 (o sea > 1). Consecuentemente un árbol AVL de altura H
tiene a lo menos (gruesamente estimando) K**(H+3)/sqrt(5), por lo cual la altura para un árbol
AVL mínimo es logarítmica con respecto al número de nodos. Esto implica que las operaciones sobre un árbol AVL están acotadas logaritmicamente.
ÁRBOL AVL
Un árbol AVL es un tipo especial de árbol binario ideado por los matemáticos rusos Adelson-
Velskii y Landis. Fue el primer árbol de búsqueda binario auto-balanceable que se ideó.
ÁRBOLES-B
La idea tras los árboles-B es que los nodos internos deben tener un número variable de nodos
hijo dentro de un rango predefinido. Cuando se inserta o se elimina un dato de la estructura, la
cantidad de nodos hijo varía dentro de un nodo. Para que siga manteniéndose el número de
nodos dentro del rango predefinido, los nodos internos se juntan o se parten. Dado que se
permite un rango variable de nodos hijo, los árboles-B no necesitan rebalancearse tan
frecuentemente como los árboles binarios de búsqueda auto-balanceables. Pero, por otro
lado, pueden desperdiciar memoria, porque los nodos no permanecen totalmente ocupados.
Los límites (uno superior y otro inferior) en el número de nodos hijo son definidos para cada
implementación en particular. Por ejemplo, en un árbol-B 2-3 (A menudo simplemente
llamado árbol 2-3 ), nodo sólo puede tener 2 ó 3 nodos hijo.
Un árbol-B se mantiene balanceado porque requiere que todos los nodos hoja se encuentren
a la misma altura.
Los árboles B tienen ventajas sustanciales sobre otras implementaciones cuando el tiempo de
acceso a los nodos excede al tiempo de acceso entre nodos. Este caso se da usualmente
cuando los nodos se encuentran en dispositivos de almacenamiento secundario como
los discos rígidos. Al maximizar el número de nodos hijo de cada nodo interno, la altura del
árbol decrece, las operaciones para balancearlo se reducen, y aumenta la eficiencia.
Usualmente este valor se coloca de forma tal que cada nodo ocupe unbloque de disco, o un
tamaño análogo en el dispositivo. Mientras que los árboles B 2-3 pueden ser útiles en la
memoria principal, y además más fáciles de explicar, si el tamaño de los nodos se ajustan
para caber en un bloque de disco, el resultado puede ser un árbol B 129-513.
Los creadores del árbol B, Rudolf Bayer y Ed McCreight, no han explicado el significado de la
letra B de su nombre. Se cree que la B es de balanceado, dado que todos los nodos hoja se
mantienen al mismo nivel en el árbol. La B también puede referirse a Bayer, o a Boeing,
porque sus creadores trabajaban en los Boeing Scientific Research Labspor ese entonces.
Dispersión al Azar (Hashing)
posted by Rafael Almanza at 12:07 PM | 0 comments
OBJETIVO:
Permitir agilizar la localización de un dato en un archivo determinado mediante
un método de búsqueda.
La búsqueda es el proceso de localizar un registro (elemento) con un valor de
llave particular. Esta 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.
posted by Rafael Almanza at 12:06 PM | 0 comments
RESUMEN:
Existen básicamente tres alternativas para implementar una búsqueda o
acceso directo:
· Archivo clasificado por búsqueda Binaria.
· Ajuste de llave a esqueleto.
· Transformación de llaves (Hashing).
Esta ultima es la que analizaremos más a detalle.
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)
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
LAS FUNCIONES HASH MAS COMUNES SON:
Residuo de la división.
La idea de este método es la de dividir el valor de la llave entre un numero
apropiado, y después utilizar el residuo de la división como dirección relativa
para el registro (dirección = llave módulo divisor).
Medio del cuadrado.
En esta técnica, la llave es elevada al cuadrado, después algunos dígitos
específicos se extraen de la mitad del resultado para constituir la dirección
relativa. Si se desea una dirección de n dígitos, entonces los dígitos se truncan
en ambos extremos de la llave elevada al cuadrado, tomando n dígitos
intermedios. Las mismas posiciones de n dígitos deben extraerse para cada
llave.
ALGORITMO
En matemáticas, lógica, ciencias de la computación y disciplinas relacionadas,
un algoritmo (del griego y latín, dixit algorithmus y éste a su vez del matemático persa Al-
Juarismi1 ) es un conjunto prescrito de instrucciones o reglas bien definidas, ordenadas y
finitas que permite realizar una actividad mediante pasos sucesivos que no generen dudas a
quien deba realizar dicha actividad.2 Dados un estado inicial y una entrada, siguiendo los
pasos sucesivos se llega a un estado final y se obtiene una solución. Los algoritmos son el
objeto de estudio de la algoritmia.1
En la vida cotidiana, se emplean algoritmos frecuentemente para resolver problemas. Algunos
ejemplos son los manuales de usuario, que muestran algoritmos para usar un aparato, o las
instrucciones que recibe un trabajador por parte de su patrón. Algunos ejemplos
enmatemática son el algoritmo de multiplicación, para calcular el producto, el algoritmo de
la división para calcular el cociente de dos números, el algoritmo de Euclides para obtener
el máximo común divisor de dos enteros positivos, o el método de Gauss para resolver
un sistema de ecuaciones lineales.
Pliegue.
En esta técnica el valor de la llave es particionada en varias partes, cada una
de las cuales (excepto la ultima) tiene el mismo numero de dígitos que tiene la
dirección relativa objetivo. Estas particiones son después plegadas una sobre
otra y sumadas. El resultado, es la dirección relativa. Igual que para el método
del medio del cuadrado, el tamaño del espacio de direcciones relativas es una
potencia de 10.
Manejo del flujo de efectivo Gilberto Ortiz Vargas
Finanzas 11.06.2002 2 minutos de lectura
administración financiera
En toda empresa cuando está elaborando un reporte de las ventas realizadas, así como de los gastos que se han generado, se obtiene un diferencial que permite
conocer la utilidad obtenida y además se realiza una proyección a futuro, considerando las experiencias de periodos anteriores, logrando en esta forma prever en qué momento es posible realizar nuevos gastos o inversiones, si así lo
requiere nuestra empresa.
Lo anterior es un estado proyectado de las entradas y salidas de
efectivo en un periodo determinado o también conocido como
flujo de efectivo y se realiza con el fin de conocer la cantidad de
efectivo que requiere el negocio para operar durante un periodo
determinado, como puede ser una semana, mes, trimestre o año.
Un problema frecuente en las micro y pequeñas empresas es la
falta de liquidez para cubrir necesidades inmediatas, por lo que se
recurre frecuentemente a particulares con el fin de solicitar
préstamos a corto plazo y de muy alto costo. Una forma muy
sencilla de planear y controlar a corto y mediano plazo las
necesidades de recursos, consiste en calcular el flujo de efectivo
de cualquier negocio
Corrector ortográfico
Verif icar la ortografía
Este es un corrector ortográfico ideal para escribir correctamente en español, ya que cuenta con el léxico más completo de este idioma formado por más de cinco millones de palabras.
Incluye voces propias de todos los países latinoamericanos y de España además de términos
técnicos de diferentes áreas como agricultura, biología y comercio, entre otras. Reconoce todas las formas conjugadas así como diminutivos, aumentativos, sufijos y prefijos más utilizados.
Vocabulario que contiene términos locales y técnicos, una vasta capacidad morfológica
y más de 5 000 000 de palabras. Motor de sugerencias construido especialmente para la fonética española: suministra
excelentes sugerencias para errores tipográficos y ortográficos.
Listas de sugerencias cortas, precisas e inteligentes para los errores ortográficos de los
usuarios.
Gracias a su amplio vocabulario no se detiene inútilmente en palabras poco usuales,
técnicas o localismos que están bien escritos; por lo tanto, la corrección es rápida y eficiente.
Atrapa errores fáciles de cometer, algunos de los que muchas veces ni siquiera
generan dudas.
Corrige números romanos.
Nota: Recuerde que si en su teclado no están disponibles directamente la tilde y la letra ñ, usted puede obtenerlas mediante las siguientes combinaciones de teclas:
á -> Alt-160
é -> Alt-130 í -> Alt-161
ó -> Alt-162 ú -> Alt-163
ñ -> Alt-164
BIOGRAFIA
Rubí Alejandra Hernández trinidad
10/julio/2016
BIOGRAFIA
top related