La Estructura de datos es una forma de recopilar y organizar datos de tal manera que podamos realizar operaciones sobre estos datos de manera efectiva. Data Structures se trata de representar elementos de datos en términos de alguna relación, para una mejor organización y almacenamiento. Por ejemplo, tenemos el nombre del jugador de datos “Virat” y 26 años. Aquí “Virat” es del tipo de datos de cadena y 26 es del tipo de datos enteros .
Podemos organizar estos datos como un registro como el registro del jugador . Ahora podemos recopilar y almacenar los registros de los jugadores en un archivo o base de datos como estructura de datos. Por ejemplo: “Dhoni” 30, “Gambhir” 31, “Sehwag” 33
En un lenguaje simple, las estructuras de datos son estructuras programadas para almacenar datos ordenados, de modo que varias operaciones se pueden realizar fácilmente.
Como discutimos anteriormente, cualquier cosa que pueda almacenar datos puede llamarse como una estructura de datos, por lo tanto, Integer, Float, Boolean, Char, etc., son estructuras de datos. Se les conoce como estructuras de datos primitivas .
Luego también tenemos algunas estructuras de datos complejas, que se utilizan para almacenar datos grandes y conectados. Algunos ejemplos de estructura de datos abstractos son Para obtener más información, puede visitar este enlace C y clases de capacitación sobre estructuras de datos en línea | C y Cursos de estructuras de datos en línea
Todas estas estructuras de datos nos permiten realizar diferentes operaciones en los datos. Seleccionamos estas estructuras de datos en función del tipo de operación que se requiere. Analizaremos estas estructuras de datos con más detalles en nuestras lecciones posteriores.
Un algoritmo es un conjunto finito de instrucciones o lógica, escritas en orden, para realizar una determinada tarea predefinida. El algoritmo no es el código o programa completo, es solo la lógica central (solución) de un problema, que puede expresarse como una descripción informal de alto nivel como pseudocódigo o mediante un diagrama de flujo .
Se dice que un algoritmo es eficiente y rápido, si lleva menos tiempo ejecutarlo y consume menos espacio de memoria. El rendimiento de un algoritmo se mide sobre la base de las siguientes propiedades:
- Complejidad de tiempo
- Complejidad espacial
- Es la cantidad de espacio de memoria requerida por el algoritmo, durante el curso de su ejecución. La complejidad del espacio debe tomarse en serio para los sistemas multiusuario y en situaciones donde hay memoria limitada disponible.
Un algoritmo generalmente requiere espacio para los siguientes componentes:
- Espacio de instrucciones: es el espacio requerido para almacenar la versión ejecutable del programa. Este espacio es fijo, pero varía según el número de líneas de código en el programa.
- Espacio de datos: es el espacio requerido para almacenar todas las constantes y el valor de las variables.
- Espacio del entorno: es el espacio requerido para almacenar la información del entorno necesaria para reanudar la función suspendida
- Time Complexity es una forma de representar la cantidad de tiempo que necesita el programa para ejecutarse hasta su finalización. Estudiaremos esto en detalle en nuestra sección.
para (i = 0; i
La complejidad temporal para el algoritmo anterior será lineal . El tiempo de ejecución del ciclo es directamente proporcional a N. Cuando N se duplica, también lo hace el tiempo de ejecución.
for (i = 0; i
Esta vez, la complejidad del tiempo para el código anterior será cuadrática . El tiempo de ejecución de los dos bucles es proporcional al cuadrado de N. Cuando N se duplica, el tiempo de ejecución aumenta en N * N.
while (bajo <= alto) {mid = (bajo + alto) / 2; if (target list [mid]) low = mid + 1; de lo contrario romper; }
Este es un algoritmo para dividir un conjunto de números en mitades, para buscar un campo en particular (lo estudiaremos en detalle más adelante). Ahora, este algoritmo tendrá una Complejidad de tiempo logarítmica . El tiempo de ejecución del algoritmo es proporcional al número de veces que N puede dividirse entre 2 (N es alto-bajo aquí). Esto se debe a que el algoritmo divide el área de trabajo por la mitad con cada iteración.
void quicksort (int list [], int left, int right) {int pivot = partición (list, left, right); clasificación rápida (lista, izquierda, pivote - 1); clasificación rápida (lista, pivote + 1, derecha); }
Llevando adelante el algoritmo anterior, arriba tenemos una pequeña lógica de clasificación rápida (estudiaremos esto en detalle más adelante). Ahora en Clasificación rápida, dividimos la lista en mitades cada vez, pero repetimos la iteración N veces (donde N es el tamaño de la lista). Por lo tanto, la complejidad del tiempo será N * log (N) . El tiempo de ejecución consta de N bucles (iterativos o recursivos) que son logarítmicos, por lo que el algoritmo es una combinación de lineal y logarítmico.
NOTA: En general, hacer algo con cada elemento en una dimensión es lineal, hacer algo con cada elemento en dos dimensiones es cuadrático, y dividir el área de trabajo por la mitad es logarítmico.
Tipos de anotaciones para la complejidad del tiempo
Ahora discutiremos y entenderemos las diversas notaciones utilizadas para la Complejidad del Tiempo.
- Big Oh denota iteraciones " menores o iguales que ".
- Big Omega denota iteraciones " más que o iguales que ".
- Big Theta denota iteraciones " iguales que ".
- Little Oh denota " menos que " iteraciones.
- Little Omega denota " más que " iteraciones.
Comprender las anotaciones de la complejidad del tiempo con un ejemplo
O (expresión) es el conjunto de funciones que crecen más lentamente o al mismo ritmo que la expresión.
Omega (expresión) es el conjunto de funciones que crecen más rápido o al mismo ritmo que la expresión.
Theta (expresión) consiste en todas las funciones que se encuentran tanto en O (expresión) como en Omega (expresión).
Para obtener más información, puede visitar este enlace C y clases de capacitación sobre estructuras de datos en línea | C y Cursos de estructuras de datos en línea
Suponga que ha calculado que un algoritmo toma operaciones f (n), donde,
f (n) = 3 * n ^ 2 + 2 * n + 4. // n ^ 2 significa cuadrado de n
Como este polinomio crece a la misma velocidad que n ^ 2 , entonces se podría decir que la función f se encuentra en el conjunto Theta (n ^ 2) . (También se encuentra en los conjuntos O (n ^ 2) y Omega (n ^ 2) por la misma razón).
La explicación más simple es, porque Theta denota lo mismo que la expresión. Por lo tanto, como f (n) crece por un factor de n ^ 2 , la complejidad del tiempo puede representarse mejor como Theta (n ^ 2) .
C Programming and Data Structures es un curso básico diseñado para capacitar en conceptos básicos de informática, organización de memoria, preprocesador, compilador y vinculador. Proporciona un excelente aprendizaje para crear su primer programa C y sesiones de práctica sobre tipos de datos y operadores, variables y calificadores, flujo de control, funciones en C, recursión, matrices, cadenas. El curso incluye además punteros en C y operaciones avanzadas de estructuras de datos como aritmética de punteros, matrices multidimensionales, asignación dinámica de memoria, estructuras, listas vinculadas, uniones, búsqueda y clasificación, operaciones de archivos y funciones de cadena.