Una respuesta objetiva:
Si bien mi respuesta inicial a esta pregunta se basó en mi experiencia empírica como estudiante CS pronto graduado y mi opinión proyectada sobre el tipo de personas con las que quería trabajar en el campo CS. En realidad, existe una respuesta objetiva (con respecto a las opiniones subjetivas de las sociedades de computación ACM SIGCSE e IEEE). Cada 10 años, los organismos de la ACM y el IEEE cooperan en una publicación conjunta que detalla sugerencias para el plan de estudios universitario de ciencias de la computación basado en el conocimiento profesional del estado de la industria de la computación. Se puede encontrar más información en cs2013.org . El comité publica un informe final que enumera sus recomendaciones curriculares .
Dicho esto, todavía creo que mi lista es bastante buena.
Respuesta original a continuación.
¿Qué debo saber?
Mínimo
Creo que un programador experto debería tener al menos conocimientos de pregrado en Informática. Claro, puede ser efectivo en muchos trabajos con solo un pequeño subconjunto de Ciencias de la Computación debido a la sólida comunidad en la que se asienta CS y al enfoque limitado de la mayoría de los puestos profesionales. Además, muchas personas se especializarán aún más después del estudio de pregrado. Sin embargo, tampoco creo que sean una excusa para no tener conocimiento de los conocimientos básicos de CS.
Para responder a la pregunta del título, esto es lo que un estudiante universitario de CS (la base para un programador experto) debe saber al graduarse:
Estructuras de datos
- Representación de datos de la máquina
- Unos, complemento de dos y aritmética relacionada
- Palabras, punteros, coma flotante
- Acceso a bits, desplazamiento y manipulación
- Listas vinculadas
- Tablas hash (mapas o diccionarios)
- Matrices
- Arboles
- Pilas
- Colas
- Gráficos
- Bases de datos
Algoritmos
- Clasificación:
- Bubble Sort (para saber por qué es malo)
- Tipo de inserción
- Ordenar fusión
- Ordenación rápida
- Clases de estilo Radix, ordenación de conteo y ordenación
- Heap Sort
- Bogo y clasificación cuántica (=
- Buscando:
- Búsqueda lineal
- Búsqueda binaria
- Profundidad primera búsqueda
- Breadth First Search
- Manipulación de cuerdas
- Iteración
- Transversal del árbol
- Recorrido de lista
- Funciones de hash
- Implementación concreta de una tabla hash, árbol, lista, pila, cola, matriz y conjunto o colección
- Algoritmos de programación
- Sistema de archivos transversal y manipulación (en el inodo o nivel equivalente).
Patrones de diseño
- Modularización
- Fábrica
- Constructor
- Semifallo
- Adaptador
- Decorador
- Peso mosca
- Observador
- Iterador
- Máquina estatal]
- Controlador de vista de modelo
- Roscado y patrones de programación paralela
Paradigmas
- Imperativo
- Orientado a objetos
- Funcional
- Declarativo
- Programación Estática y Dinámica
- Marcado de datos
Teoría de la complejidad
- Espacios Complejos
- Computabilidad
- Lenguajes completos de máquina de Turing regular, sin contexto y universal
- Expresiones regulares
- Conteo y combinatoria básica
Más allá
Para entrar en lo que está preguntando más adelante en su pregunta, si está familiarizado con lo anterior, debería poder identificar fácilmente el patrón, el algoritmo y la estructura de datos apropiados para un escenario determinado. Sin embargo, debe reconocer que a menudo no existe la mejor solución. A veces es posible que deba elegir el menor de dos males o incluso simplemente elegir entre dos soluciones igualmente viables. Debido a esto, necesita el conocimiento general para poder defender su elección contra sus compañeros.
Aquí hay algunos consejos para algoritmos y estructuras de datos:
- La búsqueda binaria solo puede (y debe) usarse en datos ordenados.
- Los tipos de estilo Radix son impresionantes, pero solo cuando tienes clases finitas de cosas ordenadas.
- Los árboles son buenos para casi cualquier cosa, como lo son las Tablas Hash. La funcionalidad de una tabla hash se puede extrapolar y utilizar para resolver muchos problemas a costa de la eficiencia.
- Las matrices se pueden usar para respaldar la mayoría de las estructuras de datos de nivel superior. A veces, una "estructura de datos" no es más que una matemática inteligente para acceder a ubicaciones en una matriz.
- La elección del idioma puede ser la diferencia entre tirar de un cabello o navegar por un problema.
- La tabla ASCII y una matriz de 128 elementos forman una tabla hash implícita (=
- Las expresiones regulares pueden resolver muchos problemas, pero no se pueden usar para analizar HTML .
- A veces, la estructura de datos es tan importante como el algoritmo.
Es posible que algunos de los anteriores no parezcan cerebros, y algunos pueden parecer vagos. Si quieres que entre en más detalles, puedo hacerlo. Pero, mi esperanza es que cuando se encuentre con una pregunta más concreta como, "Diseñe una función que cuente el número de ocurrencias de cada carácter en una Cadena", mire el consejo sobre la tabla ASCII y las matrices de 128 elementos que forman un hash implícito ordenado tablas para la respuesta.
Basado en estas ideas, propondré una respuesta al problema del casillero descrito en su pregunta.
Responda al problema planteado en su pregunta.
Puede que esta no sea la mejor respuesta a su pregunta, pero creo que es interesante y no requiere nada demasiado complejo. Y ciertamente superará la complejidad temporal del uso de una cola o pila que requiere tiempo lineal para determinar si un casillero está libre o no.
Tienes 0-999 armarios. Ahora, debido a que tiene un número fijo de casilleros, puede concebir fácilmente una función de hash sin colisiones en el rango 0-999. Esta función es simplemente h (x) = x mod 1000. Ahora, [conceptualmente] construya una tabla hash con claves enteras y el contenido de una matriz de caracteres de 1000 elementos como sus valores. Si un cliente desea reservar el casillero 78 para su uso, simplemente ponga 78 en la función hash (devuelve 78) y luego agregue ese número al puntero base de la matriz, almacenando un valor verdadero en la ubicación señalada por el valor de desplazamiento . Del mismo modo, si necesita verificar si 78 está en uso, simplemente lea el valor almacenado en esa ubicación y compárelo con verdadero.
Esta solución opera en tiempo constante para búsquedas y almacenamiento en lugar de un almacenamiento y búsqueda de tiempo de registro (n) en el caso de una cola prioritaria respaldada por un árbol binario. La descripción es intencionalmente detallada para que pueda ver los conceptos superiores resumidos en un algoritmo eficiente.
Ahora, puede preguntar, ¿qué pasa si necesito conocer todos los casilleros disponibles, no sería mejor una cola prioritaria? Si hay k casilleros disponibles en la cola de prioridad, iterar sobre todos ellos tomará k pasos. Además, dependiendo de la implementación de su cola prioritaria, es posible que tenga que reconstruir su cola prioritaria a medida que lo mira todo ... lo que tomaría k * log (k): (k <1000) pasos. En la solución de matriz, solo tiene que iterar una matriz de 1000 elementos y verificar cuáles están abiertos. También puede agregar una lista disponible o usada a la implementación para registrar solo k tiempo.