¿Con qué frecuencia aparecen los algoritmos de tipo KMP y Rabin-Karp en las entrevistas de pasantía de software?

A2A. Creo que hay un tema aquí. 🙂

Una vez me pidieron en una entrevista implementar una función como:
bool contains(const string& text, const string& pattern);
donde tanto el texto como el patrón son cadenas simples.

Le pregunté a mi entrevistador si le gustaría que lo hiciera en tiempo lineal y él respondió que no tenía que hacerlo y que está interesado principalmente si puedo codificar algo simple correctamente antes de pasar a preguntas más difíciles, pero que yo ‘ dejaría una buena impresión si pudiera hacerlo. Estaba en la cima de mi carrera en el concurso de programación, por lo que la diferencia horaria entre la implementación de cualquiera de las soluciones era básicamente insignificante, así que seguí adelante e implementé KMP. Creo que dejé una buena impresión ya que la parte restante de mi entrevista consistió en preguntas de diseño del sistema y no tenía mucha experiencia relevante en ese momento.

En general, creo que es bueno conocer bien sus algoritmos, pero no vale la pena gastar tiempo en algoritmos avanzados de coincidencia de cadenas antes de dominar los algoritmos más básicos realmente bien (por ejemplo, ordenar, buscar, etc.). Sin embargo, el concepto de cadenas de hash para identificadores numéricos de una manera con pérdida (presente en el algoritmo Rabin-Karp) puede ser bastante útil en muchos problemas simples.

A2A. Probablemente no muy a menudo, pero siempre hay una posibilidad, supongo.

La mayoría de las buenas preguntas de la entrevista no serán simplemente preguntas de tipo “implementar esto”, ya que, como entrevistador, prácticamente no se recibe señal de que alguien pueda implementar un algoritmo bien conocido. Más bien, tenderán a evaluar qué tan bien puede razonar a través de un problema desconocido.

Puede ser bastante interesante pedirle a alguien que explique cómo funciona KMP si afirma que lo sabe o ayudarlo a derivarlo y luego hacer una pregunta de seguimiento que requiera una comprensión más profunda.