Dado un flujo continuo de enteros, ¿podemos encontrar el máximo dado cualquier rango arbitrario (a, b) en el tiempo O (log t)?

Sí, esto se puede lograr usando una versión de transmisión de un árbol de segmentos. La idea básica es simple: por cada segundo elemento que llegue, almacene el máximo de este y el elemento anterior en una segunda matriz. En el tiempo t, esta matriz tiene un tamaño aproximado de t / 2. Luego, por cada segundo elemento que agregue a esa matriz, almacene el máximo de ella y el elemento anterior que agregó a la misma matriz a otra matriz (que tiene aproximadamente t / 4 elementos). Siga creando matrices hasta que la matriz final tenga 1 elemento.

A medida que hace esto en una secuencia, eventualmente la matriz final con 1 elemento obtendrá un segundo elemento, en cuyo punto agregaría otra matriz de tamaño 1, con el máximo de esos dos elementos. Tenga en cuenta que esta estructura usa t + t / 2 + t / 4 + … = O (t) espacio, por lo que esto no es malo en términos de uso del espacio.

En términos del tiempo que lleva colocar elementos en esta estructura de datos, ya que están listos desde la secuencia, escribimos una entrada en la matriz base el 100% del tiempo, una entrada en la siguiente matriz el 50% del tiempo, una entrada a la matriz después de ese 25% del tiempo, etc. Al hacer el cálculo, esto promedia solo 2 escrituras (y una cantidad proporcional de cómputo) por elemento leído. Entonces, la inserción es O (1) por elemento.

En cuanto a la operación que solicitó en la pregunta, la idea es que si queremos el máximo de un rango como 1-7 de una matriz a, podemos dividirlo en max (a [1], max (a [2 … 7])). Pero max (a [2 … 7]) puede ser respondido completamente por la matriz reducida de tamaño t / 2, porque max (a [2 … 7]) = max (b [1 … 3]) si b es la matriz reducida . Luego procedemos de manera similar para promover la evaluación a matrices cada vez más reducidas. Si realiza el análisis completo, verá que como máximo se deben examinar 2 elementos en cada matriz (con solo un número constante de operaciones para cada uno), y hay matrices O (log t), porque la matriz base tiene t elementos, el siguiente tiene t / 2, etc., hasta que el tamaño se reduce a 1. Por lo tanto, la complejidad de tiempo para una consulta de rango es la O deseada (log t).

Esta estructura de datos se llama árbol de segmentos. La presentación normal solo considera cómo resolver este problema para las matrices de tamaño fijo conocidas de antemano, pero también puede funcionar para las transmisiones de la forma en que lo he presentado aquí.

Puede resolver esto utilizando un árbol de búsqueda equilibrado aumentado. Tus claves son las marcas de tiempo. Cada nodo en el árbol tiene un campo adicional que le brinda el elemento máximo dentro del subárbol que tiene el nodo como raíz.

Ahora puede hacer estas consultas en tiempo O (log t).

Otra forma es usar un árbol de segmentos de tamaño fijo. Cuando la t se vuelve demasiado grande, puede duplicar el tamaño del árbol de segmentos, al igual que duplicaría el tamaño de una matriz una vez que se quede sin espacio.

No estoy seguro de entender tu pregunta, pero si lo hago, la respuesta es no. No has dicho qué es n, pero supongo que es ba. Como no ha limitado la secuencia de ninguna manera, será necesario inspeccionar cada elemento de a a b, por lo que es O (n). (La prueba es por contradicción: si dice que hay elementos entre ayb que no tengo que inspeccionar, elegiré una secuencia con el elemento máximo en una de esas ranuras no inspeccionadas). Pero peor, parece que debe contar los elementos en la secuencia de 0 a b, y es posible b> a >> n, por lo que ni siquiera podemos garantizar O (n).

More Interesting

¿Por qué no puedo conseguir un trabajo de desarrollador front-end simplemente por una entrevista técnica, a pesar de haber trabajado 6 años como desarrollador y sé lo que estoy haciendo?

Cómo destacar en una entrevista técnica cuando no soy el mejor

¿Cuáles son las preguntas de la entrevista HTML, CSS, JavaScript y jQuery para diseñadores U / UX?

¿Qué tipo de preguntas se hacen en la sección de programación de Amdocs (que consta de 7 preguntas de codificación) en la primera ronda de aptitud?

¿Cuál es la mejor manera de prepararse para la entrevista de Amazon, cuando todos son nuevos en la codificación?

¿Cómo se prepara para una entrevista de desarrollador de software en solo 3 días?

¿Cuál es la forma intuitiva de derivar una solución para esta pregunta de entrevista de programación?

¿Por qué el entrevistador hace preguntas algorítmicas de codificación agrietadas en las entrevistas de programación técnica?

¿Por qué ha contratado Microsoft tantos graduados frescos este año en comparación con años anteriores?

¿Por qué los entrevistadores siempre te hacen sentir tonto en la entrevista de programación?

¿Dónde puedo encontrar recursos adecuados para las preguntas de diseño del sistema formuladas en entrevistas?

¿Cuál es la mejor manera de prepararse para las entrevistas de Java para desarrolladores no java?

¿Qué tipo de preguntas de diseño se hacen en la entrevista de Google / Facebook / Amazon?

¿Cómo se estructura una típica entrevista SDE2 en Amazon India o Microsoft India para un candidato experimentado de 9 años?

Se le da una matriz de n elementos [1,2, ... .n]. Por ejemplo {3,2,1,6,7,4,5}. Ahora creamos una firma de esta matriz comparando cada par de elementos consecutivos. Si aumentan, escriba I else write D.?