César Govea
Castillo Generalidades de
Algorítmica
1.1 Conceptos Elaborado 19-Febrero-2009
1422492
1.2 Aplicaciones Presentado 20-Febrero-2009
Algorítmica y Principios de
Programación
1.3 Estudios afines
1.4 Formalidades
1 Generalidades de Algorítmica
La historia de la informática señala a Abu Abdullah Muhammad bin Musa al-Khwarizmi, una de las
grandes figuras de la matemática árabe medieval como descubridor del concepto de algoritmo.
En su obra "aljabar wa-al-muqabala" sienta las bases del algebra, cuyo nombre procede del
comienzo del título, así como "algoritmo" procede del nombre del autor, al-Khwarizmi.
Al igual que los idiomas sirven de vehículo de comunicación entre los seres humanos, existen
lenguajes que realizan la comunicación entre los seres humanos y las computadoras. Estos
lenguajes permiten expresar los programas o el conjunto de instrucciones que el operador
humano desea que la computadora ejecute.
Los lenguajes de computadoras toman diferentes formas; los de las primeras computadoras, como
la ENIAC y la EDSAC, se componían en el lenguaje real de las máquinas mismas. La dificultad de
programar las máquinas de esta manera limitaba drásticamente su utilidad y proporcionaba un
fuerte incentivo para que se desarrollaran lenguajes de programación más orientados hacia la
expresión de soluciones con la notación de los problemas mismos.
A mediados de los años 60's aparecieron los primeros lenguajes de propósito general como
FORTRAN, FORTRAN IV, ALGOL, COBOL, BASIC, PL/I, ADA, C,C++, PASCAL, etc. pero el desarrollo de
nuevas tecnologías, tanto en arquitectura de computadoras como en lenguajes de programación,
continúa a paso acelerado, cada vez con mayor velocidad, el panorama está cambiando de una
etapa de sistemas y lenguajes especialmente desarrollados para aplicaciones individuales. Los
lenguajes de programación actuales son los conocidos como Lenguajes visuales, como por ejemplo
Visual Fox, Visual Basic, Visual C .
1.1 Conceptos
Algoritmo
Sistema de reglas que permiten obtener una salida específica a partir de una entrada específica.
Cada paso debe estar definido exactamente, de forma que pueda traducirse a lenguaje de
computadora.
Conjunto de operaciones que se utilizan para resolver un problema específico. En este conjunto de
instrucciones se indica la secuencia de operaciones que se deben realizar para, a partir de los
datos de entrada, obtener el resultado buscado.
Tiene que ser finito (con un final), preciso (detallar el orden de las operaciones a realizar) y
unívoco (al aplicar el algoritmo a los mismos datos de entrada, siempre se obtendrá el mismo
resultado a la salida).
Programa
1.2 Aplicaciones
Se presenta la estrategia desarrollada para desplazar el efecto final de un brazo robótico dentro
de un entorno productivo de forma autónoma, mediante el uso de entornos virtuales, algoritmos
genéticos y redes neuronales. El objetivo es la obtención del conjunto de posiciones y los
movimientos requeridos para conformar la estrategia de actuación necesaria para completar una
actividad específica. De esta forma, el sistema es capaz de guiar el efector final, evadiendo
diferentes obstáculos y buscando la combinación espacial y articular que permita una cantidad
reducida de movimientos, así como la menor distancia entre ellos. El proceso se torna una
herramienta viable de programación y entrenamiento que reduce sustancialmente el tiempo
promedio requerido por el factor humano para entrenar el robot.
Algoritmo para aplicar Base64
http://www.javamexico.com/blogs/gabo/algoritmo_para_aplicar_base64
Los algoritmos de codificación y decodificación son simples, pero los datos codificados son
sistemáticamente sólo alrededor del 33% más grande que los datos sin codificar.
Está compuesta por un subconjunto 65 de caracteres US-ASCII, permitiendo 6 bits para ser
representados por caracteres imprimibles.
(El 65° carácter adicional, "=", se utiliza para significar una función específica para la
transformación.)
Aquí 3 Bytes se representan con una cadena de texto de 4 caracteres, en total estos 24 bits se
subdividen en agrupaciones de 6 bits, cada uno de los cuales se traduce en un solo dígito en el
alfabeto base64.
En otras palabras estos 6 bits se usan como índice en una matriz de 64 caracteres imprimibles.
Todos los saltos de línea, espacios en blanco u otros caracteres que no se encuentra en la Tabla 1
deben de ser ignorado por el software de decodificación.
Base64 no es un algoritmo de compresión de datos, de hecho aumenta 25% los datos que
codificas; es un algoritmo para codificar datos binarios como texto para su transmisión o
almacenamiento en medios que no permiten transmisión de datos binarios (incluso en sistemas
viejos que manejan caracteres de 7 bits).
Se usa también por ejemplo en mails encriptados ya sea con certificados X509 o con PGP, así como
attachments de mail
Los certificados X509, llaves privadas y públicas de RSA o DSA (por ejemplo para SSH o PGP) se
almacenan en base 64, precisamente para poder enviarlas en un mail y que se puedan guardar en
un archivo de texto simple sin ningún formato especial.
La informática
Conforme a ello, los sistemas informáticos deben realizar las siguientes tres tareas básicas:
En los inicios del procesado de información, con la informática sólo se facilitaba los trabajos
repetitivos y monótonos del área administrativa, gracias a la automatización de esos procesos, ello
trajo como consecuencia directa una disminución de los costes y un incremento en la producción.
Se puede entender por informática a la unión sinérgica de todo este conjunto de disciplinas.
Esta disciplina se aplica a numerosas y variadas áreas del conocimiento o la actividad humana,
como por ejemplo: gestión de negocios, almacenamiento y consulta de información,
monitorización y control de procesos, industria, robótica, comunicaciones, control de transportes,
investigación, desarrollo de juegos, diseño computarizado, aplicaciones/herramientas multimedia,
medicina, biología, física, química, meteorología, ingeniería, arte, etc.
Actualmente es difícil concebir un área que no use, de alguna forma, el apoyo de la informática; en
un enorme abanico que cubre desde las más simples cuestiones domésticas hasta los cálculos
científicos más complejos.
Está basada en el análisis formal y estadístico del comportamiento humano ante diferentes
problemas:
Razonamiento basado en casos: Ayuda a tomar decisiones mientras se resuelven
ciertos problemas concretos.
Sistemas expertos: Infieren una solución a través del conocimiento previo del contexto
en que se aplica y de ciertas reglas o relaciones.
Redes bayesianas: Propone soluciones mediante inferencia estadística.
Inteligencia artificial basada en comportamientos: que tienen autonomía y pueden
auto-regularse y controlarse para mejorar.
Programación
El proceso de creación de software, desde el punto de vista de la ingeniería, incluye los siguientes
pasos:
1. Reconocer la necesidad de un programa para solucionar un problema o identificar la
posibilidad de automatización de una tarea.
2. Recoger los requisitos del programa. Debe quedar claro qué es lo que debe hacer el
programa y para qué se necesita.
3. Realizar el análisis de los requisitos del programa. Debe quedar claro cómo debe realizar el
programa las cosas que debe hacer. Las pruebas que comprueben la validez del programa
se pueden especificar en esta fase.
4. Diseñar la arquitectura del programa. Se debe descomponer el programa en partes de
complejidad abordable.
5. Implementar el programa. Consiste en realizar un diseño detallado, especificando
completamente todo el funcionamiento del programa, tras lo cual la codificación debería
resultar inmediata.
6. Implantar (instalar) el programa. Consiste en poner el programa en funcionamiento junto
con los componentes que pueda necesitar (bases de datos, redes de comunicaciones,
etc.).
La ingeniería del software se centra en los pasos de planificación y diseño del programa, mientras
que antiguamente (programación artesanal) la realización de un programa consistía únicamente
en escribir el código.
Ingeniería de software
Es la disciplina o área de la informática que ofrece métodos y técnicas para desarrollar y mantener
software de calidad.
Esta ingeniería trata con áreas muy diversas de la informática y de las Ciencias de la Computación,
tales como construcción de compiladores, Sistemas Operativos, o desarrollos Intranet/Internet,
abordando todas las fases del ciclo de vida del desarrollo de cualquier tipo de Sistema de
Información y aplicables a infinidad de áreas (negocios, investigación científica, medicina,
producción, logística, banca, control de tráfico, meteorología, derecho, Internet, Intranet, etc.).
Una definición precisa aún no ha sido contemplada en los diccionarios, sin embargo se pueden
citar las enunciadas por algunos de los más prestigiosos autores:
1 - Ingeniería de Software es el estudio de los principios y metodologías para el desarrollo
y mantenimiento de sistemas software (Zelkovitz, 1978)
2 - Ingeniería de software es la aplicación práctica del conocimiento científico al diseño y
construcción de programas de computadora y a la documentación asociada requerida
para desarrollar, operar y mantenerlos. Se conoce también como Desarrollo de Software o
Producción de Software ( Bohem, 1976).
3 - Ingeniería de Software trata del establecimiento de los principios y métodos de la
ingeniería a fin de obtener software de modo rentable, que sea fiable y trabaje en
máquinas reales (Bauer, 1972).
4 - Es la aplicación de un enfoque sistemático, disciplinado y cuantificable al desarrollo,
operación y mantenimiento del software; es decir, la aplicación de la ingeniería al
software (IEEE, 1993).
1.4 Formalidades
Los algoritmos pueden ser expresados de muchas maneras, incluyendo al lenguaje natural,
pseudocódigo, diagramas de flujo y lenguajes de programación entre otros.
Algoritmo <nombre_del_algoritmo>
Inicio
definición de constantes
declaración de variables
Sentencia 1
Sentencia 2
Sentencia n
Fin
También es posible incluir un teorema que demuestre que el algoritmo es correcto, un análisis de
complejidad o ambos.
Diagrama de flujo que expresa un algoritmo para calcular la raíz cuadrada de un número x
Diagramas de Flujo
Los diagramas de flujo son descripciones gráficas de algoritmos; usan símbolos conectados con
flechas para indicar la secuencia de instrucciones y están regidos por ISO.
Los diagramas de flujo son usados para representar algoritmos pequeños, ya que abarcan mucho
espacio y su construcción es laboriosa.
Por su facilidad de lectura son usados como introducción a los algoritmos, descripción de un
lenguaje y descripción de procesos a personas ajenas a la computación.
Pseudocódigo es la descripción de un algoritmo que asemeja a un lenguaje de programación pero
con algunas convenciones del lenguaje natural.
Tiene varias ventajas con respecto a los diagramas de flujo, entre las que se destaca el poco
espacio que se requiere para representar instrucciones complejas.
Pseudocódigo
El pseudocódigo no está regido por ningún estándar. pseudo viene de falso y por ende es un
código al que aunque es entendible no se aplica al proceso que debe realizar la maquina.
Máquina de Turing
La máquina de Turing es un modelo matemático, diseñado por Alan Turing, que formaliza el
concepto de algoritmo. A este modelo se le refiere comúnmente como la "descripción de más bajo
nivel" por el hecho de que no utiliza ninguna expresión coloquial.
Implementación
Muchos algoritmos son ideados para implementarse en un programa.
Sin embargo, los algoritmos pueden ser implementados en otros medios, como una red neuronal,
un circuito eléctrico o un aparato mecánico.
Algunos algoritmos inclusive se diseñan especialmente para implementarse usando lápiz y papel.
1 package encode;
2
3 /**
4 * @author Gabriel Mtz. Nájera
5 */
6 public class Base64Encoder {
7 private static StringBuilder sb = new StringBuilder();
8
9 public static String[] mapInt2Str = {
10 "a","b","c","d","e","f","g","h",
11 "i","j","k","l","m","n","o","p",
12 "q","r","s","t","u","v","w","x",
13 "y","z","A","B","C","D","E","F",
14 "G","H","I","J","K","L","M","N",
15 "O","P","Q","R","S","T","U","V",
16 "W","X","Y","Z","0","1","2","3",
17 "4","5","6","7","8","9","+","/"
18 };
19
20 /**
21 * @param data un array de 3 bytes con los datos a codificar
22 * @param ioff
23 * @return String
24 * @throws java.lang.Exception
25 */
26 public static String encodeBase64(byte[] data, int ioff)throws Exception{
27 sb = new StringBuilder("");
28 if (ioff > 0) {
29
/*
30-32
*/
33 int i0 = (data[0] & 0x3f);
34 sb.append(mapInt2Str[i0]);
35 if (ioff > 1) {
/*36-42*/
43 int i1 = ((data[1] & 0x0f) << 2) | ((data[0] & 0xc0) >> 6);
44 sb.append(mapInt2Str[i1]);
45 if (ioff > 2) {
46
/*47-52*/
53 int i2 = ((data[2] & 0x03) << 4) | ((data[1] & 0xf0) >>
4);
54 sb.append(mapInt2Str[i2]);
55
/*56-58*/
59 int i3 = ((data[2] & 0xfc) >> 2);
60 sb.append(mapInt2Str[i3]);
61 }
62 }
63 }
64 return sb.toString();
65 }
66 /**
67 * Codifica
68 * Se leen 3 bytes y se obtiene la cadenas de texto de 4 caracteres
69 * @param sInputFilePath La ruta de binario
70 * @return String codificación del archivo
71 */
72 public static String encodeBinaryData(String sInputFilePath){
73 String sBase64Data = ""; //codificada
74 java.io.BufferedInputStream bis = null; //lectura
75 StringBuilder strb = new StringBuilder();//escritura
76 try{
77 bis = new java.io.BufferedInputStream(
78 new java.io.FileInputStream(sInputFilePath)
79 );
80 int iReadBytes = 0;
81 byte data[] = new byte[3];
/*82-85*/
85 while( (iReadBytes = bis.read(data, 0,3)) != -1){
86 strb.append( Base64Encoder.encodeBase64(data, iReadBytes) );
87 //System.out.println("Escribe:"+strb);
88 }
89 sBase64Data = strb.toString();
90 }catch(Exception ex){
91 sBase64Data = null;
92 System.out.println( ex.getMessage() );
93 }finally{
94 try {
95 if (bis != null) bis.close();
96 } catch (java.io.IOException ex) {
97 System.out.println( ex.getMessage() );
98 }
99 }
100 return sBase64Data;
101 }
102
103 }
104
105
Bibliografía
• The Art of Computer Programming, Knuth, D. E. [quien fue también, el creador del TeX]
• Introduction to Algorithms (2nd ed), Cormen, T. H., Leiserson, C. E., Rivest, R. L. y Stein, C.
• Tirso de Andrés, Homo Cybersapiens. La Inteligencia artificial y la humana, 2002, ISBN 84-
313-1982-8
• Luis Mª Gonzalo, Inteligencia Humana e Inteligencia Artificial, Madrid, 1987. ISBN 84-7118-
490-7
• http://www.javamexico.com/blogs/gabo/algoritmo_para_aplicar_base64