Hay una estructura de datos llamada árbol Fenwick o árbol indexado binario . Se puede implementar sobre una simple matriz de enteros y puede admitir 2 operaciones que se ejecutan en tiempo [math] O (\ log_2 n) [/ math]:
- Agregar (pos, val): agrega un valor entero arbitrariamente val (podría ser negativo) al elemento de la matriz en la posición pos .
- Suma (izquierda, derecha) : calcula la suma de todos los elementos de la matriz dentro del intervalo [izquierda, derecha] .
La idea detrás de esas dos operaciones es bastante clara y puede llevarle un tiempo comprenderla, pero una vez que la obtiene, la implementación puede ser bastante sencilla. Puedes echar un vistazo a esta bonita explicación aquí.
En C, la implementación de estas dos operaciones anteriores podría verse así:
- Puedo resolver las preguntas de entrevistas de ingeniería de software técnico para las principales empresas como Google, Facebook, Apple, Microsoft y Amazon con bastante facilidad. Pero no puedo conseguir una entrevista. ¿Cómo consigo una entrevista con una empresa de tecnología de primer nivel?
- Cómo prepararse para una entrevista de trabajo de ingeniería de software en muy poco tiempo (tal vez 1 mes)
- Al codificar entrevistas, ¿la mayoría de los lugares buscan la corrección del código o más del proceso?
- ¿Por qué algunos desarrolladores pueden construir un buen software, pero no logran descifrar la entrevista técnica?
- ¿Cuál sería mejor para una entrevista de Google para la codificación de pizarra, etc., Java o C ++?
Agregar vacío (int * a, int n, int pos, int val) { para (pos ++; pos 0; pos & = pos - 1) res + = a [pos]; volver res; } int Sum (int * a, int n, int left, int right) { devuelve Sum0 (a, n, derecha) - Sum0 (a, n, izquierda - 1); }
Además del hecho de que esta implementación no parece complicada en absoluto, en realidad es una estructura de datos muy poderosa, que se puede combinar con otros algoritmos (por ejemplo, búsqueda binaria) para crear estructuras de datos aún más poderosas.
Además, es posible extender la operación Agregar para realizar una actualización de intervalo en lugar de una actualización puntual, conservando exactamente el mismo tiempo de ejecución (es decir, [math] O (\ log_2 n) [/ math]). Puedes leer más sobre esto aquí.