¿Cuáles son algunas formas buenas y productivas de pensar algorítmicamente?

En el pasado, pensé que los algoritmos eficientes para CS, cuando existen, pueden encontrarse problemas siguiendo una estrategia conocida como dividir y conquistar, recursividad, programación dinámica, etc.

Esto definitivamente no es cierto. En la escuela y a través de la experiencia, recogemos una bolsa de trucos, pero no hay razón para esperar que funcione ningún truco en particular, excepto la intuición y el contexto. Es como hacer una prueba en matemáticas, o integración simbólica en cálculo: aprendemos integración por partes e identidades trigonométricas, y esperamos que les sea útil. Siempre trabajan en la prueba, por supuesto, pero en el mundo real la mayoría de las integrales no se pueden hacer en forma cerrada, mientras que otras solo son posibles a través de trucos especiales que no aprendimos en la escuela.

Entonces, como punto de partida, los algoritmos son difíciles. Algunos de los que todos conocemos y amamos fueron descubrimientos importantes en ese momento, publicados en revistas académicas en los años 60, 70 y 80.

Los algoritmos a menudo son impulsados ​​por metáforas o correspondencias. Por ejemplo, en el ejemplo de la lista vinculada, puede imaginarse corredores en una pista, donde el más rápido eventualmente debe alcanzar y “dar vuelta” al más lento. También puede dibujar una correspondencia entre los elementos de la lista y los enteros. Por ejemplo, suponga que la lista va para X elementos y luego tiene un ciclo de longitud Y. Los punteros en el tiempo N están representados por N y 2N, por lo que en algún momento estarán separados por Y, por ejemplo en N = Y, y apuntarán al mismo nodo, a menos que aún no hayamos llegado al ciclo (porque X podría ser grande). Bueno, en ese caso siempre hay N = 2Y, y N = 3Y … eventualmente N será un múltiplo de Y mayor que X, y también lo será 2N. Estas dos metáforas (para corredores y enteros) representan intuiciones diferentes que apuntan a la misma solución creativa al problema.

De hecho, también hay muchas otras soluciones (consulte Encontrar un bucle en una lista vinculada individualmente), aunque ninguna tan linda. Este problema tiende a surgir particularmente porque tiene esta solución simple y sorprendente. Por lo tanto, es un tipo diferente de “artificial” que los problemas del aula: se selecciona por tener una solución simple e inusual, en lugar de una solución simple y “habitual”.

Sin embargo, para responder a su pregunta real, se trata de desarrollar su caja de herramientas y su intuición. Se trata de la coincidencia de patrones: detectar que hay una estructura recursiva o una estructura de programación dinámica, o que una tabla hash o un árbol binario podrían ayudar. Cuando aborde problemas del mundo real, comience por reducir el problema a su esencia y luego busque las soluciones de otras personas. Por lo general, alguien ha necesitado resolver un problema similar bajo restricciones similares. Para problemas complicados de algoritmos (encontrados principalmente en entrevistas de ingeniería de Silicon Valley), solo practique, practique, practique.

La gente puede publicar algunos enlaces de recursos o sugerir algunos libros, pero con su situación parece que usted está exactamente allí, donde yo estaba 1.5 años antes.
Sintiendo como “¿Cómo diablos puede alguien llegar a este tipo de solución?”.

Las estrategias de aprendizaje son obligatorias, pero siempre hay un enfoque correcto que puede no parecer intuitivo. En tales situaciones, debe pensarlo prácticamente (no algorítmicamente), es decir, cómo resolvería este problema dado que no es un maestro de los algoritmos.
Los métodos a continuación son algunos ejemplos de cómo un chico no algorítmico resuelve un problema particular y resultaron ser muy útiles en CS.
Búsqueda binaria e interpolación: la forma en que busca una página específica en su libro.
Selección e inserción: se utiliza al organizar un montón de cartas en la mano.
Colas y pilas: igual que las colas y pilas de la vida real.
Árboles: árboles genealógicos

por el problema que mencionaste:
Problema pactico:
Siempre enfrento este problema cuando mis auriculares, tapones para los oídos, cargador móvil, cargador para computadora portátil, cables de datos se bloquean entre sí y, sin saberlo, obtengo algo de trabajo recreativo durante los próximos 15 minutos. De todos modos, ¿cómo te acercas a resolver esto? ¿Que haces?

Solución:
Primero elige su cable de datos (digamos) con una mano (h1) y mueve la otra mano (h2) a lo largo del cable. h1 sigue a h2 pero con suficiente distancia. En el camino, sigue tirando del cable con h2 para averiguar si llegó a h1 o no. Si ese tirón es seguido por un agarre fuerte desde el otro lado, significa que ha alcanzado h1 y se encontró con un bucle.

Explicación:
Entonces, hasta ahora, todos podrían haber entendido que h2 es ese puntero rápido y h1 es un puntero lento y que el proceso de sacudidas de cables está verificando si encontramos un bucle o no.

PD: Pero si ahora preguntas cómo pensar así, tendrás que crear una pregunta completamente nueva y darme 25 créditos para responder y la responderé allí …… (es broma).