Fundamentos de Arreglos en C++ y Algoritmos de Búsqueda

Introducción a los Arreglos

Un arreglo es una estructura de datos que permite almacenar una colección de elementos del mismo tipo de forma contigua en la memoria.

Arreglos Unidimensionales

Existen varias formas de declarar arreglos en C++. A continuación, se presentan los métodos comunes:


int main() {
    // Definición especificando tamaño
    double temperaturas[5];
    temperaturas[0] = 22.5;
    temperaturas[1] = 23.0;

    // Inicialización directa
    int conteo[4] = {10, 20, 30, 40};
    
    // Inicialización implícita
    int valores[] = {1, 2, 3, 4, 5};

    for (int i = 0; i < 4; i++) {
        std::cout << conteo[i] << std::endl;
    }
    return 0;
}

Puntos clave: El índice siempre comienza en 0. El nombre del arreglo actúa como una constante que apunta a la dirección de memoria inicial.

Arreglos Bidimensionales

Se pueden visualizar como una tabla con filas y columnas. Su declaración sigue una lógica similar:


int matriz[2][3] = {
    {10, 20, 30},
    {40, 50, 60}
};

// Acceso mediante bucles anidados
for(int i = 0; i < 2; ++i) {
    for(int j = 0; j < 3; ++j) {
        std::cout << matriz[i][j] << " ";
    }
}

Algoritmos de Búsqueda: Casos Prácticos

Búsqueda en Arreglos Rotados

Dado un arreglo ordenado que ha sido rotado, podemos utilizar una variante de la búsqueda binaria para lograr una complejidad temporal de O(log n).


class Buscador {
public:
    int buscar(std::vector<int>& datos, int objetivo) {
        int izq = 0, der = datos.size() - 1;
        while (izq < der) {
            int medio = izq + (der - izq) / 2;
            if ((datos[0] > objetivo) ^ (datos[0] > datos[medio]) ^ (objetivo > datos[medio]))
                izq = medio + 1;
            else
                der = medio;
        }
        return (izq == der && datos[izq] == objetivo) ? izq : -1;
    }
};
</int>

Búsqueda de la Cima en Arreglos de Montaña

Un "arreglo de montaña" crece hasta un punto máximo y luego decrece. Para hallar el índice máximo de forma eficiente, empleamos un enfoque de división y conquista:


class Pico {
public:
    int obtenerIndicePico(std::vector<int>& v) {
        int bajo = 1, alto = v.size() - 2, resultado = 0;
        while (bajo <= alto) {
            int centro = bajo + (alto - bajo) / 2;
            if (v[centro] > v[centro + 1]) {
                resultado = centro;
                alto = centro - 1;
            } else {
                bajo = centro + 1;
            }
        }
        return resultado;
    }
};
</int>

Etiquetas: cpp Arrays algorithms binary-search data-structures

Publicado el 7-2 02:13