Dado un conjunto de n enteros distintos, ¿hay una manera fácil de calcular la suma de los productos de estos enteros tomados k (2 <k <n) a la vez?

Aquí hay una solución de programación dinámica.

Si usamos solo los primeros enteros i del N dado, ¿cuál es la suma de los productos de estos enteros tomados j a la vez? Defina esto como f (i, j). Se nos ha pedido que encontremos f (N, k).

Ahora podemos intentar encontrar una recurrencia para f (i, j). Entre las formas de elegir j enteros entre los primeros i, algunos incluyen a [i] y el resto no. Si no se incluye un [i], los enteros j deben seleccionarse del primer i-1. Esto da una contribución de f (i-1, j) a la suma. Si se incluye un [i], los enteros j-1 deben elegirse del primer i-1. La contribución de todas las j-tuplas que involucran a [i] es, por lo tanto, un [i] × f (i-1, j-1). Juntos, esto nos da:

f (i, j) = f (i-1, j) + a [i] f (i-1, j-1)

Con los casos base f (i, 0) = 1 para todos i y f (0, j) = 0 para j> 1, podemos calcular f (N, k) utilizando la recurrencia en el tiempo O (Nk).

PD: Este método es esencialmente el mismo que la respuesta de Christopher Chang . Piénsalo 🙂

Hay N elegir k posibles productos para calcular. No creo que haya una forma de evitar eso. Sin embargo, podemos reducir la cantidad de multiplicaciones que hacemos en el camino.

El código gris es una secuencia de cadenas binarias donde dos cadenas consecutivas difieren exactamente en una posición. En un espíritu similar, podemos definir una secuencia de cadenas binarias, de modo que dos bits de cadenas consecutivas difieran exactamente en una posición de ‘1’. Por ejemplo, 00011, 10001, 01001, 00101, 00110, 10010, 01010, 01100, 10100, 11000.

Podemos generar tal secuencia usando el algoritmo Twiddle de Chase [1]. Con el cual, solo la primera iteración tendrá k-1 multiplicaciones, luego, solo necesitará 1 multiplicación y 1 división por iteración.

[1] Algoritmo 382: combinaciones de M de N objetos [G6]

Este es el coeficiente delante de x ^ {nk} en la expansión de (x + i_1) (x + i_2) … (x + i_n). Entonces puede hacer el equivalente a multiplicar (x + i_1) (x + i_2), luego multiplicar eso por (x + i_3), etc.

Hay varias optimizaciones posibles, comenzando con coeficientes de no seguimiento para potencias de x superiores a x ^ {nk}.

More Interesting

¿Cómo debo responder a las preguntas de la entrevista técnica cuando no sé la respuesta?

¿Cuáles son los tutoriales que proporcionan la comprensión profunda de los conceptos básicos de Java?

¿Cuáles son algunas buenas preguntas para la entrevista de JavaScript?

Cómo responder paso a paso las preguntas de la entrevista de diseño de su sistema

Cómo ordenar una matriz hasta una posición específica

¿Cómo es el proceso de entrevista para el puesto de desarrollador móvil?

Como entrevistador, ¿seleccionará a un entrevistado que haya escrito el siguiente código para rotar una matriz 90 grados hacia la izquierda (sin usar estructuras de datos adicionales) en comparación con la solución dada en el libro de Gayle Laakmaan Cracking the Coding Interview?

¿Cuál es la manera eficiente de encontrar la mediana de la matriz ordenada 2 de igual o diferente tamaño en Java?

¿Cuáles son las preguntas de la entrevista hechas por IES para ingeniería civil?

Cómo descifrar las entrevistas de codificación en línea

Preguntas de la entrevista de trabajo: ¿Cómo son las entrevistas de trabajo de CS en otros países además de India?

¿Cuándo encuentra tiempo para mejorar sus habilidades de codificación?

¿Por qué las entrevistas de programación no consideran la capacidad de aprendizaje y el potencial para hacer grandes cosas en lugar de un conjunto predefinido de preguntas?

Cómo medir la complejidad temporal y espacial de una función recursiva

¿Cuál es el algoritmo más rápido para encontrar todas las permutaciones posibles de una cadena?