martes, 5 de julio de 2011

ALGORITMOS DE ORDENAMIENTO

En computación y matemáticas un algoritmo de ordenamiento recursivo es un algoritmo que pone elementos de una lista o un vector en 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.
  
-Ordenamiento externo
Ordenamiento externo es un término genérico para los algoritmos de ordenamiento que pueden manejar grandes cantidades de información. El ordenamiento externo se requiere cuando la información que se tiene que ordenar no cabe en la memoria principal de una computadora (típicamente la RAM) y un tipo de memoria más lenta (típicamente un disco duro) tiene que utilizarse en el proceso.
  
-Algoritmo de ordenación natural
Un algoritmo de ordenación natural es aquel que, dándole como entrada una secuencia ya ordenada (1, 2, 3, 4, 5, 6...), tardará para esa secuencia la menor cantidad de tiempo posible, comparándolo con el tiempo de proceso de otras secuencias desordenadas.


-Algoritmo de ordenación no natural
Un algoritmo de ordenación no natural es aquel que, dándole como entrada una secuencia inversamente ordenada (6, 5, 4, 3, 2, 1), tardará para esa secuencia la menor cantidad de tiempo posible, comparándolo con el tiempo de proceso de otras secuencias desordenadas.
Un algoritmo es un conjunto de operaciones matemáticas que dará origen a un resultado que se podrá conseguir a través de operaciones, con variables.

-Ordenamiento de burbuja
Ordenación de burbuja (Bubble Sort en inglés) es un sencillo algoritmo de ordenamiento. Funciona revisando cada elemento de la lista que va a ser ordenada con el siguiente, intercambiándolos de posición si están en el orden equivocado. Es necesario revisar varias veces toda la lista hasta que no se necesiten más intercambios, lo cual significa que la lista está ordenada. Este algoritmo obtiene su nombre de la forma con la que suben por la lista los elementos durante los intercambios, como si fueran pequeñas "burbujas". También es conocido como el método del intercambio directo. Dado que solo usa comparaciones para operar elementos, se lo considera un algoritmo de comparación, siendo el más sencillo de implementar.
La posición de los elementos en el ordenamiento de burbuja juegan un papel muy importante en la determinación del rendimiento. Los elementos mayores al principio de la lista son rápidamente movidos hacia abajo, mientras los elementos menores en el fondo de la lista se mueven a la parte superior muy lentamente. Esto llevó a nombrar estos elementos conejos y tortugas, respectivamente.

//Ordenamiento por método de la Burbuja
void ordenamientoBurbuja(int v[], int util_v) {
         int temp, i, j;
 
         for (i = 0; i < util_v -1 ; i++) {
                 for (j = i + 1; j < util_v ; j++) {
                         if (v[i] > v[j]) {
                                temp = v[i];
                                v[i] = v[j];
                                v[j] = temp;
                 }
                 }         
         }
}


-Conejos y Tortugas (Yo-yos) (?)
Varios esfuerzos se han realizado para eliminar las tortugas véase Exterminación y mejorar la velocidad del ordenamiento de burbuja, la cual será más redonda que nunca. El Ordenamiento por sacudida es un buen ejemplo, aunque aún mantiene, en el peor de los casos, una complejidad O (n2). El ordenamiento por combinación compara los elementos primero en pedazos grandes de la lista, moviendo tortugas extremadamente rápido, antes de proceder a pedazos cada vez más pequeños para alisar la lista. Su velocidad promedio es comparable a algoritmos rápidos (y complejos) como el ordenamiento rápido.

-Ordenamiento por monticulos (Heapsort)
 

El ordenamiento por montículos (heapsort en inglés) es un algoritmo de ordenamiento no recursivo, no estable, con complejidad computacional Θ(nlogn)

Este algoritmo consiste en almacenar todos los elementos del vector a ordenar en un montículo (heap), y luego extraer el nodo que queda como nodo raíz del montículo (cima) en sucesivas iteraciones obteniendo el conjunto ordenado. Basa su funcionamiento en una propiedad de los montículos, por la cual, la cima contiene siempre el menor elemento (o el mayor, según se haya definido el montículo) de todos los almacenados en él.

function heapsort(array A[0..n]):
montículo M
integer i := 124578
for i = 0..n:
insertar_en_monticulo(M, A[i])
for i = 0..n:
A[i] = extraer_cima_del_monticulo(M)
return A

-Ordenamiento por insercion 


El ordenamiento por inserción (insertion sort en inglés) es una manera muy natural de ordenar para un ser humano, y puede usarse fácilmente para ordenar un mazo de cartas numeradas en forma arbitraria. Requiere O(n²) operaciones para ordenar una lista de n elementos.
Inicialmente se tiene un solo elemento, que obviamente es un conjunto ordenado. Después, cuando hay k elementos ordenados de menor a mayor, se toma el elemento k+1 y se compara con todos los elementos ya ordenados, deteniéndose cuando se encuentra un elemento menor (todos los elementos mayores han sido desplazados una posición a la derecha). En este punto se inserta el elemento k+1 debiendo desplazarse los demás elementos.

C

void insertionSort(int numbers[], int array_size) 
{
   int i, a, index;
 
   for (i=1; i < array_size; i++) 
   {
      index = numbers[i];
 
      for (a=i-1;a >= 0 && numbers[a] > index;a--) 
      {
         numbers[a + 1] = numbers[a];
      }
      numbers[a+1] = index;
 
   }
}


-Ordenamiento por mezcla
El algoritmo de ordenamiento por mezcla (merge sort en inglés) es un algoritmo de ordenamiento externo estable basado en la técnica divide y vencerás. Es de complejidad O(n log n). 
Fue desarrollado en 1945 por John Von Neumann.
Conceptualmente, el ordenamiento por mezcla funciona de la siguiente manera:
  1. Si la longitud de la lista es 0 ó 1, entonces ya está ordenada. En otro caso:
  2. Dividir la lista desordenada en dos sublistas de aproximadamente la mitad del tamaño.
  3. Ordenar cada sublista recursivamente aplicando el ordenamiento por mezcla.
  4. Mezclar las dos sublistas en una sola lista ordenada.
El ordenamiento por mezcla incorpora dos ideas principales para mejorar su tiempo de ejecución:
  1. Una lista pequeña necesitará menos pasos para ordenarse que una lista grande.
  2. Se necesitan menos pasos para construir una lista ordenada a partir de dos listas también ordenadas, que a partir de dos listas desordenadas.

function mergesort(array A[x..y])
begin
  if (x-y > 1)):
    array A1 := mergesort(A[x..(int( x+y / 2))])
    array A2 := mergesort(A[int(1+(x+y / 2))..y])
    return merge(A1, A2)
  else:
    return A
end

function merge(array A1[0..n1], array A2[0..n2])
begin
  integer p1 := 0
  integer p2 := 0
  array R[0..(n1 + n2 + 2)]//suponiendo que n1 y n2 son las posiciones
  //del array y no el length de este mismo, de otro modo seria (n1 + n2)
  while (p1 <= n1 or p2 <= n2):
    if (p1 <= n1 and A1[p1] <= A2[p2]):
      R[p1 + p2] := A1[p1]
      p1 := p1 + 1
     
    else 
      if (p2 <= n2 and A1[p1] > A2[p2]):
        R[p1 + p2] := A2[p2]
        p2 := p2 + 1
  return R
end
 
-Ordenamiento rapido

El ordenamiento rápido (quicksort en inglés) es un algoritmo creado por el matemático John von Neumann basado en la técnica de divide y vencerás, que permite, en promedio, ordenar n elementos en un tiempo proporcional a n log n.
El algoritmo consta de los siguientes pasos:
  • Elegir un elemento de la lista de elementos a ordenar, al que llamaremos pivote.
  • Resituar los demás elementos de la lista a cada lado del pivote, de manera que a un lado queden todos los menores que él, y al otro los mayores. Los elementos iguales al pivote pueden ser colocados tanto a su derecha como a su izquierda, dependiendo de la implementación deseada. En este momento, el pivote ocupa exactamente el lugar que le corresponderá en la lista ordenada.
  • La lista queda separada en dos sublistas, una formada por los elementos a la izquierda del pivote, y otra por los elementos a su derecha.
  • Repetir este proceso de forma recursiva para cada sublista mientras éstas contengan más de un elemento. Una vez terminado este proceso todos los elementos estarán ordenados.
function quicksort(array)
     var list, less, greater
     if length(array) ≤ 1
         return array
     seleccionar y eliminar un valor pivote pivot en el array
     for each x in array
         if x < pivot then añadir x a less
         else añadir x a greater
     return concatenar(quicksort(less), pivot, quicksort(greater))

-Ordenamiento por seleccion

El ordenamiento por selección (Selection Sort en inglés) es un algoritmo de ordenamiento que requiere O(n2) operaciones para ordenar una lista de n elementos.
Su funcionamiento es el siguiente:
  • Buscar el mínimo elemento de la lista
  • Intercambiarlo con el primero
  • Buscar el mínimo en el resto de la lista
  • Intercambiarlo con el segundo
Y en general:
  • Buscar el mínimo elemento entre una posición i y el final de la lista
  • Intercambiar el mínimo con el elemento de la posición i
De esta manera se puede escribir el siguiente pseudocódigo para ordenar una lista de n elementos indexados desde el 1:

para i=1 hasta n-1
    minimo = i;
    para j=i+1 hasta n
        si lista[j] < lista[minimo] entonces
            minimo = j /* (!) */
        fin si
    fin para
    intercambiar(lista[i], lista[minimo])
fin para

-Ordenamiento Shell
El ordenamiento Shell (Shell sort en inglés) es un algoritmo de ordenamiento. El método se denomina Shell en honor de su inventor Donald Shell. Su implementación original, requiere O(n2) comparaciones e intercambios en el peor caso. Un cambio menor presentado en el libro de V. Pratt produce una implementación con un rendimiento de O(n log2 n) en el peor caso. Esto es mejor que las O(n2) comparaciones requeridas por algoritmos simples pero peor que el óptimo O(n log n). Aunque es fácil desarrollar un sentido intuitivo de cómo funciona este algoritmo, es muy difícil analizar su tiempo de ejecución.
El Shell sort es una generalización del ordenamiento por inserción, teniendo en cuenta dos observaciones:
  1. El ordenamiento por inserción es eficiente si la entrada está "casi ordenada".
  2. El ordenamiento por inserción es ineficiente, en general, porque mueve los valores sólo una posición cada vez.
El algoritmo Shell sort 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 su posición esperada. Los pasos múltiples sobre los datos se hacen con tamaños de espacio cada vez más pequeños. El último paso del Shell sort es un simple ordenamiento por inserción, pero para entonces, ya está garantizado que los datos del vector están casi ordenados.

C++

void Shell( int Vector[], int Longitud )
{
   int I, J, Incremento, Temp;
 
   Incremento = Longitud / 2;//<Longitud> es el numero de elementos del vector
   while ( Incremento > 0 )
   {
      for ( I = Incremento; I < Longitud; I++)
      {
         J = I;
         Temp = Vector[ I ];
         while ( ( J >= Incremento ) && ( Vector[ J - Incremento ] > Temp ) )
         {
            Vector[ J ] = Vector[ J - Incremento ];
            J = J - Incremento;
         }
         Vector[ J ] = Temp;
       }
       Incremento = Incremento / 2;
   }
} 
Aqui les dejo otro link de unas animaciones de algunos de estos
algoritmos:
http://ingecomp.mforos.com/674005/3017040-animacion-de-algoritmos-de-ordenamiento-resubido/  
 
-Bibliografia
http://es.wikipedia.org/wiki/Algoritmo_de_ordenamiento  

REPRESENTACION Y MANIPULACION DE LISTAS

ARREGLOS
Los arreglos son una colección de variables del mismo tipo que se referencian utilizando un nombre común. Un arreglo consta de posiciones de memoria contigua. La dirección más baja corresponde al primer elemento y la más alta al último. Un arreglo puede tener una o varias dimensiones. Para acceder a un elemento en particular de un arreglo se usa un índice. 

El formato para declarar un arreglo unidimensional es:
tipo nombre_arr [ tamaño ]

Como programador se es responsable de asegurar que todos los arreglos sean lo suficientemente grandes para guardar lo que pondrá en ellos el programa.
C permite arreglos con más de una dimensión , el formato general es:
tipo nombre_arr [ tam1 ][ tam2 ] ... [ tamN];

En C se permite la inicialización de arreglos, debiendo seguir el siguiente formato:
tipo nombre_arr[ tam1 ][ tam2 ] ... [ tamN] = {lista-valores};

 ALGORITMOS DE 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 (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.

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
 
Implementación recursiva en C++ 
#include <iostream>
#include <vector>

bool busqueda_dicotomica(vector<int> v, int principio, int fin, int x){
    bool res;
    if(principio < fin){
        int m = (principio + fin)/2;
        if(x < v[m]) res = busqueda_dicotomica(v, principio, m, 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}*/
 
-Bibliografia 
http://www.fismat.umich.mx/mn1/manual/node6.html  
 

lunes, 4 de julio de 2011

RECURSIVIDAD

La recursividad es una técnica de programación importante. Se utiliza para realizar una llamada a una función desde la misma función. Como ejemplo útil se puede presentar el cálculo de números factoriales. Él factorial de 0 es, por definición, 1. Los factoriales de números mayores se calculan mediante la multiplicación de 1 * 2 * ..., incrementando el número de 1 en 1 hasta llegar al número para el que se está calculando el factorial.

El siguiente párrafo muestra una función, expresada con palabras, que calcula un factorial.

"Si el número es menor que cero, se rechaza. Si no es un entero, se redondea al siguiente entero. Si el número es cero, su factorial es uno. Si el número es mayor que cero, se multiplica por él factorial del número menor inmediato."

Para calcular el factorial de cualquier número mayor que cero hay que calcular como mínimo el factorial de otro número. La función que se utiliza es la función en la que se encuentra en estos momentos, esta función debe llamarse a sí misma para el número menor inmediato, para poder ejecutarse en el número actual. Esto es un ejemplo de recursividad.

La recursividad y la iteración (ejecución en bucle) están muy relacionadas, cualquier acción que pueda realizarse con la recursividad puede realizarse con iteración y viceversa. Normalmente, un cálculo determinado se prestará a una técnica u otra, sólo necesita elegir el enfoque más natural o con el que se sienta más cómodo.

Claramente, esta técnica puede constituir un modo de meterse en problemas. Es fácil crear una función recursiva que no llegue a devolver nunca un resultado definitivo y no pueda llegar a un punto de finalización. Este tipo de recursividad hace que el sistema ejecute lo que se conoce como bucle "infinito".

Para entender mejor lo que en realidad es el concepto de recursión veamos un poco lo referente a la secuencia de Fibonacci.

0,1,1,2,3,5,8,13,21,34,...,

Cada elemento en esta secuencia es la suma de los precedentes (por ejemplo 0 + 1 = 0, 1 + 1 = 2, 1 + 2 = 3, 2 + 3 = 5, ...) sean fib(0) = 0, fib (1) = 1 y así sucesivamente, entonces puede definirse la secuencia de Fibonacci mediante la definición recursiva (define un objeto en términos de un caso mas simple de si mismo):

fib (n) = n if n = = 0 or n = = 1

fib (n) = fib (n - 2) + fib (n - 1) if n >= 2

-Solución recursiva
static int fibonacci (int n)
{
if ((n == 0) || (n == 1))
return 1;
else
return fibonacci(n-1) + fibonacci(n-2);
}

-Solución iterativa
static int fibonacci (int n)
{
int actual, ant1, ant2;
ant1 = ant2 = 1;
if ((n == 0) || (n == 1)) {
actual = 1;
} else
for (i=2; i<=n; i++) { actual = ant1 + ant2; ant2 = ant1; ant1 = actual; } } return actual; }



Un requisito importante para que sea correcto un algoritmo recursivo es que no genere una secuencia infinita de llamadas así mismo. Claro que cualquier algoritmo que genere tal secuencia no termina nunca. Una función recursiva f debe definirse en términos que no impliquen a f al menos en un argumento o grupo de argumentos. Debe existir una "salida" de la secuencia de llamadas recursivas.

Si en esta salida no puede calcularse ninguna función recursiva. Cualquier caso de definición recursiva o invocación de un algoritmo recursivo tiene que reducirse a la larga a alguna manipulación de uno o casos mas simples no recursivos.

-Bibliografia
http://www.monografias.com/trabajos14/recursividad/recursividad.shtml
http://elvex.ugr.es/decsai/java/pdf/7C-Ejemplos.pdf

COMPLEJIDAD DE ALGORITMOS

Complejidad computacional y asintótica

Para resolver un problema suele ser habitual disponer de varios algoritmos. 

El objetivo es elegir el algoritmo más eficiente de ellos.



-Regla: La elección del algoritmo nunca debería afectar a la corrección de la solución ni a la claridad (evitar algoritmos incomprensibles).

-Excepción: A veces se eligen algoritmos aproximados o heurísticos porque la solución correcta resulta inmanejable. No alcanzan la solución óptima pero sí a una solución aceptable.



Para comparar algoritmos se puede utilizar una medida del grado de dificultad del algoritmo: la complejidad computacional.

COMPLEJIDAD COMPUTACIONAL
-Indica el esfuerzo que hay que realizar para aplicar un algoritmo y lo costoso que éste resulta.

Un algoritmo es más eficiente cuanto menos complejo sea.
La eficiencia suele medirse en términos de consumo de recursos:
                   Espaciales: cantidad de memoria que un algoritmo consume o utiliza durante su ejecución à Complejidad espacial
                   Temporales: tiempo que necesita el algoritmo para ejecutarseà Complejidad temporal
                   Otros: utilización de CPU, utilización de periféricos, tiempo y coste de implementación...


Factores que influyen en la complejidad
                   Tamaño del problema
                   Naturaleza de los datos de entrada
                   Recursos hardware y software
Principio de invarianza:
Dos implementaciones de un mismo algoritmo no diferirán más que en una constante multiplicativa.
Si f1(n) y f2(n) son los tiempos consumidos por dos implementaciones de un mismo algoritmo, se
verifica que:
$ c, d Î R,
f1(n) £ c·f2(n)
f2(n) £ d·f1(n)

COMPLEJIDAD ASINTÓTICA
Consiste en el cálculo de la complejidad temporal a priori de un algoritmo en función del tamaño del problema, n, prescindiendo de factores constantes multiplicativos y suponiendo valores de n muy grandes. No sirve para establecer el tiempo exacto de ejecución, sino que permite especificar una cota (inferior, superior o ambas) para el tiempo de ejecución de un algoritmo

La notación O
Existen diferentes notaciones para la complejidad asintótica. Una de ellas es la notación O, que permite especificar la cota superior de la ejecución de un algoritmo. La sentencia “f(n) es O(g(n))” significa que la tasa de crecimiento de f(n) no es mayor que la tasa de crecimiento de g(n). La notación “O” sirve para clasificar las funciones de acuerdo con su tasa de crecimiento.

O(1)
Constante
No depende del tamaño del problema
Eficiente
O(log n)
Logarítmica
Búsqueda binaria
O(n)
Lineal
Búsqueda lineal
O(nlog n)
Casi lineal
Quick-sort
O(n2)
Cuadrática
Algoritmo de la burbuja
Tratable
O(n3)
Cúbica
Producto de matrices
O(nk) k>3
Polinómica

O(kn) k>1
Exponencial
Algunos algoritmos de grafos
Intratable
O(n!)
Factorial



Cambios en el entorno HW o SW afectan a factores constantes (principio de invarianza) pero no al orden de complejidad O(f(n)). Hay que buscar algoritmos con el menor orden de complejidad. La eficiencia es un término relativo que depende del problema. El análisis de la eficiencia es asintótico à sólo es válido para tamaños de problema suficientemente grandes.
El análisis asintótico de algoritmos determina el tiempo de ejecución en notación “O”. Para realizar el análisis asintótico
– Buscar el número de operaciones primitivas ejecutadas en el peor de los casos como una función del tamaño de la entrada
– Expresar esta función con la notación “O”
Ejemplo:
– Se sabe que el algoritmo maximoArray ejecuta como mucho 7n - 1 operaciones primitivas
– Se dice que maximoArray “ejecuta en un tiempo O(n)”
Como se prescinde de los factores constantes y de los términos de orden menor, se puede hacer caso omiso de ellos al contar las operaciones primitivas

domingo, 3 de julio de 2011

MATERIAL EXTRA "Google +"

Google anunció el martes el lanzamiento de una nueva red social, llamada Google +, o Google Earth Plus, que tiene como objetivo tomar en Facebook. Como Hayley Tsukayama informó :

Google hizo un gran anuncio de hoy, el lanzamiento de Google + , o Google Earth Plus, su tan esperada versión de una red social para competir con Facebook .
Google ha estado tratando de entrar en el mercado social de los años, corriendo en salidas en falso con la onda de contenido compartido de los servicios y Buzz. (El primero fracasó, y este último provocó una queja de privacidad, que terminó con una demanda y una solución de la FTC.) Muchos han estado esperando durante gran empuje de Google en la vida social, ya que lanzó su un botón de marzo, especialmente en lo que Facebook se acogedor con su búsqueda de su rival, Microsoft.


Y luego, hoy en día, Google anunció +. El sitio tiene un gran parecido a Facebook, con los canales de transmisión y los grupos especializados de amigos. De hecho, Google + reúne muchas de las características de las redes sociales existentes.
La red tiene cinco componentes básicos: Círculos, Sparks, lugares de reunión, transferencia instantánea y Huddle. También se requiere un perfil de Google, lo que significa que tendrá que proporcionar a Google, como mínimo, con un nombre y una foto.
 

Círculos le permite agrupar los contactos - por ejemplo, amigos, trabajo, familia. Al igual que Facebook, estas características le permite compartir información con grupos de contactos en lugar de golpear a todos con su última actualización a la vez. Chispas actúa como un lector de RSS o Facebook noticias, lo que le permite la entrada cosas que le interesan y empujar el contenido relevante para usted. Lugares de reunión cuenta con chats en vivo y video de grupo, con el objetivo de fomentar reuniones espontáneas con capacidad para 10 personas. Usted también puede avisar a ciertos grupos de amigos cuando estás pasando el rato.
Transferencia instantánea se encarga de la parte móvil cada vez más importante de las redes sociales, de forma automática publicar fotos de los usuarios de teléfono y vídeos a un álbum privado. A partir de ahí, los usuarios pueden decidir si y con quién quieren compartir sus medios de comunicación. Usted también tiene la opción de añadir datos de localización a todos los envíos + Google.

Y Huddle es una característica de los mensajes de texto del grupo - similar a la beluga, que adquirió en marzo de Facebook - que te permite tener un grupo de chat a través de su teléfono.
Algunos analistas se preguntan si la expansión de Google en el ámbito social los medios de comunicación es un mal movimiento. TechCruch invitado contribuyente Semil Shah pidió a la misma pregunta:
Hoy en día es suave lanzamiento de la nueva galaxia social de Google, Google + , plantea una interesante pregunta: ¿Puede Google, una enorme multinacional, ricas en efectivo, la compañía de tecnología de consumo, con múltiples aplicaciones de productividad de éxito y los servicios, tomar su masa del horno y hornear una red social en su pan?

En el último año, Google ha experimentado grandes cambios. El presidente ejecutivo, Eric Schmidt, renunció. Co-fundador Larry Page, dio un paso en, remodelación de la cubierta y la vinculación bonificaciones de los empleados para crear una experiencia social exitosa. El resultado parece ser una mancha de aspecto pero potencialmente de onda similar a la constelación de confusión social "círculos", "se apiña", "lugares de reunión" y "chispas" que podría, en teoría, sentará las bases para nuevos y más matizada de las redes sociales formulario. En medio de todas las reacciones que el lanzamiento de hoy, creo que es importante dar un paso atrás y reflexionar sobre si Google se está centrando sus esfuerzos en el problema equivocado, y al hacerlo, de investigar un ataque potencialmente mejor que coincide con el ADN de la propia empresa.


-Bibliografia
http://www.washingtonpost.com/business/googles-social-network-google-plus-takes-aim-at-facebook-but-will-it-work/2011/06/29/AGNARArH_story.html

LOGARITMOS

El desarrollo de las matemáticas, la navegación y los avances de la ciencia durante el siglo XVII potenciaron la creación de nuevas y cada vez mejores máquinas de calcular. Se necesitaban tablas seguras de las funciones trigonometricas, para calcular la posición de los barcos, también se hizo necesario disminuir los errores ya que cada día el comercio iba en aumento.
No fue sino hacia 1614, cuando un escocés llamado John Napier publicó l primera tabla de logaritmos, la cual este utilizaba para simplificar y agilizar los cálculos. Los logaritmos fueron de gran utilidad y simplificaron significativamente muchos cálculos; para multiplicar se suman los logaritmos de los números que se han de multiplicar, para dividir se restan, y para calcular potencias se multiplican. Una vez hechos los cálculos, basta con hallar el antilogaritmo del resultado y se obtiene la solución. El antilogaritmo se busca en unas tablas, de la misma manera como se buscan los logaritmos en las tablas. Esto significaba que había que calcular los logaritmos para confeccionar las tablas, y por lo tanto había también que realizar muchos cálculos. En 1.620, Edmund Gunther inventó una formula de emplear los logaritmos de una manera más sencilla aunque no tan precisa. Esta consistía en colocar los logaritmos en una recta y las multiplicaciones y divisiones se realizaban añadiendo o sustrayendo segmentos a través de un par de divisores. Esto se conoció como el método Gunther, un tiempo después William Oughtred utilizó dos escalas móviles que llamó Regla de Cálculo. Las escalas de la Regla de Cálculo se gradúan según los logaritmos de las cantidades que se han de calcular.
En el siglo XVII hubo una división entre los calculadores en analógicos y Digitales. Hallándose los que utilizaban la Regla de Cálculo como analógicos, ya que los valores que se obtenían con esta eran aproximados y Digitales los que utilizaban el ábaco, ya que los cálculos realizados con este eran exactos e independientes de sus dimensiones físicas, del tamaño de las cuentas, o la longitud de los alambres.
La regla de cálculo ha sido un calculador analógico de gran éxito, hasta que en los años setenta fue sustituida por las calculadoras electrónicos.
El mismo inventor de los logaritmos John Napier, invento también un aparato mecánico que se llamó huesos de Napier por la similitud que estos tenían con los huesos y por que estaban construidos de ese material. Estos aparatos llegaron a ser muy precisos y muy económicos. Napier también introdujo el punto decimal, el cual se utiliza todavía en nuestros días para separar los números enteros de los decimales.

En matemáticas, el logaritmo de un número —en una base determinada— es el exponente al cual hay que elevar la base para obtener dicho número. Por ejemplo, el logaritmo de 1000 en base 10 es 3, porque 1000 es igual a 10 a la potencia 3: 1000 = 103 = 10×10×10.
De la misma manera que la operación opuesta de la suma es la resta y la de la multiplicación la división, la logaritmación es la operación inversa a la exponenciación.


IDENTIDADES LOGARITMICAS
Los logaritmos mantienen ciertas identidades aritméticas muy útiles a la hora de realizar cálculos:
  • El logaritmo de un producto es igual a la suma de los logaritmos de los factores.
log(ab) = log(a) + log(b)
  • El logaritmo de un cociente es igual al logaritmo del numerador menos el logaritmo del denominador.
log(ab) = log(a) - log(b)
  • El logaritmo de una potencia es igual al producto entre el exponente y el logaritmo de la base de la potencia.
log(a^x) = xlog(a)
  • El logaritmo de una raíz es igual al producto entre la inversa del índice y el logaritmo del radicando.

    En realidad la tercera y cuarta identidad son equivalentes, sin más que hacer:
    -Bibliografia:
     

    MAS VALE TARDE QUE NUNCA

    Bueno como podran ver el titulo de mi entrada dice "Mas vale tarde que nunca", ¿por que el nombre a esta entrada? bueno se supone que estas entradas las tenia que subir el viernes y no hoy, pero por causas de las lluvias estuve batallando con el internet y esa es la razon por las apenas hoy domingo las subi, pero en fin aqui esta mi informacion del dia de hoy.


    GRAFICAS
    Ahora les mostrare como quedo mi grafica, en mi grafica la funcion y2= 2^x fue la que se elevo mas rapidamente. Aqui les dejo mi imagen de como quedo mi trabajo para que chequen las longitudes de las funciones en la grafica: 


    FUNCION FACTORIAL
    La función factorial (símbolo: !) sólo quiere decir que se multiplican una serie de números que descienden.
    Intente incluir y=x! y los numeros salian muy grandes, ya que segun el valor de x, este se ira multiplicando con todos sus numeros menores al valor de x, por ejemplo:
    4! = 4 × 3 × 2 × 1 = 24
    7! = 7 × 6 × 5 × 4 × 3 × 2 × 1 = 5040

    Así que la regla es:
    n! = n × (n-1)!

    lo que significa "el factorial de cualquier número es: el número por el factorial de (1 menos que el número", por tanto 10! = 10 × 9!, o incluso 125! = 125 × 124!

    Qué pasa con "0!"

    El factorial de cero es interesante... se suele estar de acuerdo en que 0! = 1.
    Parece raro que no multiplicar ningún número dé 1, pero ayuda a simplificar muchas cuestiones.

    Eh aqui un lista para que vean q tan rapido crecen los valores:

    n n!
    0 1
    1 1
    2 2
    3 6
    4 24
    5 120
    6 720
    7 5,040
    8 40,320
    9 362,880
    10 3,628,800
    11 39,916,800
    12 479,001,600
    13 6,227,020,800
    14 87,178,291,200
    15 1,307,674,368,000
    16 20,922,789,888,000
    17 355,687,428,096,000
    18 6,402,373,705,728,000
    19 121,645,100,408,832,000
    20 2,432,902,008,176,640,000
    21 51,090,942,171,709,400,000
    22 1,124,000,727,777,610,000,000
    23 25,852,016,738,885,000,000,000
    24 620,448,401,733,239,000,000,000
    25 15,511,210,043,331,000,000,000,000


    y en mi opinion creo que si la hubiera involucrado la funcion y=x! en mi grafica esta creceria mas rapido.

    -Bibliografia de esto ultimo