Para su primera pregunta, la intuición detrás de divide y vencerás es que en muchos problemas la cantidad de trabajo que se tiene que hacer se basa en alguna propiedad combinatoria de la entrada que se escala más que linealmente.
Por ejemplo, en el par más cercano de problema de puntos, el tiempo de ejecución de la respuesta de fuerza bruta se determina por el hecho de que usted tiene que mirar en absoluto O (n 2 ) los posibles pares de puntos.
Si toma algo que crece de forma cuadrática y lo corta en dos piezas, cada una de las cuales tiene la mitad del tamaño anterior, se necesita un cuarto del tiempo inicial para resolver el problema en cada mitad, por lo que se resuelve el problema en ambos las mitades toman tiempo aproximadamente la mitad del tiempo requerido para la solución de fuerza bruta. Cortarlo en cuatro pedazos tomaría un cuarto del tiempo, cortándolo en ocho pedazos una octava vez, etc.
La versión recursiva termina siendo más rápida en este caso porque en cada paso, evitamos hacer mucho trabaje al tratar con pares de elementos asegurándose de que no haya demasiados pares que realmente necesitemos verificar. La mayoría de los algoritmos que tienen una solución de dividir y conquistar terminan siendo más rápidos por una razón similar.
Para su segunda pregunta, no, los algoritmos de división y conquista no son necesariamente más rápidos que los algoritmos de fuerza bruta. Considere el problema de encontrar el valor máximo en una matriz. El algoritmo de fuerza bruta toma O (n) tiempo y usa O (1) espacio como lo hace un escaneo lineal sobre los datos. El algoritmo de dividir y vencer se da aquí:
- Si la matriz tiene solo un elemento, ese es el máximo.
- De lo contrario:
- Corte la matriz por la mitad.
- Encuentra el máximo en cada mitad.
- Calcule el máximo de estos dos valores.
Esto toma tiempo O (n) también, pero utiliza O (log n) de memoria para el espacio de pila. En realidad es peor que el algoritmo lineal simple.
Como otro ejemplo, el maximum single-sell profit problem tiene una solución de divide y vencerás, pero la solución de programación dinámica optimizada es más rápida tanto en tiempo como en memoria.
Espero que esto ayude!
Para compartir un pastel en 16 piezas, la primera solución es tratar de cortar 1/16 del pastel y así sucesivamente ... difícil. Otra solución es cortar el pastel en 2, luego en 2 nuevamente, luego cada uno de los 1/4 en 2 y cada uno de los 1/8 en 2. –