Degenerar puede significar cosas diferentes en diferentes circunstancias, pero supondré que te refieres a triángulos con un ángulo de [matemáticas] 180 [/ matemáticas]. En tales triángulos, la suma de las longitudes de dos lados es igual a la longitud del tercer lado.
Asumiré además que está haciendo esto en una computadora, ya que .5 segundos son terriblemente cortos para una persona.
Deje que [math] n [/ math] sea la cantidad de longitudes que tiene.
- ¿Hay ejemplos fractales que usen entradas aleatorias externas de alguna manera en las iteraciones?
- ¿Cuál es la diferencia entre una variable externa y una variable global en C?
- ¿Puedo ingresar una máquina Turing en otra máquina Turing? Si es así, ¿cómo? Y si no, ¿por qué?
- ¿Cuáles son algunas aplicaciones del mundo real de la teoría de la información cuántica?
- ¿Qué significa una garantía teórica en el aprendizaje automático?
- El enfoque totalmente ingenuo: para cada conjunto de tres longitudes, verifique si dos suman al tercero.
- Esto se ejecuta en [math] O ({{n} \ choose {3}}) [/ math] time, también conocido como [math] O (n ^ 3) [/ math]
- Un poco menos ingenuo: haga una nueva lista de todas las sumas de pares y cuente las intersecciones con la lista original.
- todavía [matemáticas] O (n ^ 3) [/ matemáticas]
- Cómo llegar a algún lado: ordena la lista de longitudes. Luego genera una nueva lista de sumas de pares que también se ordena. Finalmente, encuentre la intersección mediante búsqueda binaria para cada uno de los elementos de la primera lista en la segunda.
- Bien hecho, esto es [matemáticas] O (n ^ 2) [/ matemáticas] porque hacer la segunda lista es el cuello de botella.
- Hacer la segunda lista ya ordenada es un poco complicado. Vea 4b para obtener una pista sobre cómo hacerlo. Sin embargo, en la práctica, solo generarlo normalmente y usar el algoritmo de clasificación correcto será casi tan rápido.
- Ajustándolo para una aplicación práctica:
- Ordenar la lista: [matemáticas] O (n \ log (n)) [/ matemáticas]
- Genere la segunda lista dinámicamente mientras verifica las intersecciones con la primera. Esto sigue siendo [matemática] O (n ^ 2) [/ matemática], pero no necesita almacenar todo en la memoria y la parte de búsqueda se vuelve mucho más rápida. En lugar de la búsqueda binaria para cada elemento, utiliza un método similar al de combinar dos matrices ordenadas que leen cada una una vez.
EDITAR: ya no se nos permite usar bucles.
Así que aquí hay una implementación ingenua de Python.
herramientas de importación
pares = itertools.product (longitudes, longitudes)
pares = lista (mapa (lambda x: suma (x), pares))
cuenta = suma (lista (mapa (lambda x: x en longitudes, pares))) / 2
Dividimos por dos porque en realidad contamos cada triángulo dos veces: como (a, b, c) y como (b, a, c).
El rendimiento de esto ciertamente puede mejorarse, pero en realidad no es tan lento a menos que su lista sea enorme.