Notación en Big O | Nombre de la función |
---|---|
O(1) | Constante |
O(log n) | Logarítmica |
O(n) | Lineal |
O(n · log n) | Lineal logarítmica o casi-lineal |
O(n^2) | Cuadrática |
O(n^k) | Potencial (k siendo constante y k > 1) |
O(k^n) | Exponencial (k usualmente siendo 2 y n > 1) |
O(n!) | Factorial |
Horrible |
Bad |
Fair |
Good |
Excellent |
Notación | Tipo de cota | Descripción |
---|---|---|
O (Big O) | Cota asintótica superior (≥) | Describe el peor de los casos de un algoritmo. |
o (small o) | Límite superior estricto (>) | Una función crece más lentamente que otra función . |
Ω (Big Omega) | Cota asintótica inferior (≤) | Describe el mejor de los casos de un algoritmo. |
ω (small omega) | Límite inferior estricto (<) | Una función crece más rápidamente que otra función. |
Θ (Big Theta) | Cota asintótica exacta (==) | Describe el caso promedio de un algoritmo. |
Depende del autor o fuente existen desde 16 a 37 tipos de problemas, pero estos caben en 7 grupos
Best Conceivable Runtime (BCR): ninguna solución puede ser más rápida que este límite.
Greedy - O(n) a O(n log n)
Estrategia en la que se toman decisiones locales óptimas en cada paso con la esperanza de obtener una solución global óptima. Algoritmos como Huffman coding o problemas de mochila (Knapsack) pueden requerir O(n log n) si involucran ordenación.
Dynamic Programming - O(n²) a O(2ⁿ)
Técnica que descompone un problema en subproblemas solapados, resolviéndolos una sola vez y almacenando sus resultados. La complejidad varía mucho según el problema y la optimización usada. Por ejemplo, LCS es O(n²), pero problemas como subset sum sin memoization pueden llegar a O(2ⁿ).
Complete Search (Backtracking, Brute Force) - O(n!) a O(2ⁿ)
Método que explora todas las soluciones posibles de un problema. La fuerza bruta pura puede ser O(n!) en problemas de permutaciones, mientras que backtracking con poda puede mejorar el rendimiento en algunos casos.
Grafos (Árboles, Traversal) - O(|V|+|E|) a O(V³)
Paradigma para resolver problemas con estructuras de grafos. Algoritmos de recorrido como BFS y DFS tienen complejidad O(V + E). Algoritmos como Floyd-Warshall para caminos mínimos tienen O(V³), mientras que Dijkstra con heap tiene O((V + E) log V).
int binarySearch(int arr[], int low, int high, int x) {
while (low <= high) {
int mid = low + (high - low) / 2;
if (arr[mid] == x) return mid;
if (arr[mid] < x) low = mid + 1;
else high = mid - 1;
}
return -1;
}// O(log n)
bool canJump(vector<int>& nums) {
int size = nums.size() - 1;//O(1)
int goal = size;
for (int i = size; i >= 0; --i)//O(n)
if (i + nums[i] >= goal) goal = i;
return (goal == 0);
}//O(n)
void dfs(int s, vector<vector<int>>& adj, vector<bool>& visited) {
static int depth = 0;
if (visited[s]) return; // Si el nodo ya fue visitado
visited[s] = true;
cout << "Node: " << s << ", depth: " << depth << endl;
++depth;
for (auto u : adj[s]) dfs(u, adj, visited); // se recorren todos los nodos vecinos
--depth;
}// O(V + E)
void bfs(int start, const vector<vector<int>>& adj, vector<bool>& visited) {
queue<int> q; // nodos por explorar
int distance[n]; //distancia de cada nodo desde el nodo inicial
visited[start] = true;
distance[start] = 0;
q.push(start); // nodo inicial a la cola
while (!q.empty()) { //// Mientras haya nodos en la cola
int s = q.front(); q.pop(); // primer nodo de la cola
for (auto u : adj[s]) { // se recorren todos los nodos vecinos
if (visited[u]) continue;
visited[u] = true;
distance[u] = distance[s]+1;
q.push(u); // se añade el nodo vecino
}
}
}//O(V + E)
Recomiendo visualizar estos algoritmos en: https://algorithm-visualizer.org/brute-force/breadth-first-search
int fibonacci(int n){ //O(2^n)
if(n<=1) return 1; //O(1)
return fibonacci(n-1) + fibonacci(n-2); //O(2^n)
}
for (ull i = 2; i <= n; ++i) // O(n)
ans[i] = ans[i - 1] + ans[i - 2]; // O(n) en tiempo y espacio
Dejar de Tarea, Crear LinkedIn y GitHub Mostrar CVs Mostrar Readmes de GitHub Mostrar Oferta de Trabajo en Amazon, requisitos
Las Empresas Chicas nunca hacen entrevista técnica, las medianas pueden o no hacer, y las grandes casi siempre hacen,
DSA = Data Structures and Algorithms
La certificación de TOEFL en la UAA cuesta $970, pero requieren 20 aspirantes para hacerlo
Un embajador es una persona que representa, habla por o anuncia a una organización, grupo de personas, actividad o marca en particular. Estos reconocimientos son muy útiles si quieres aplicar para un trabajo en dicha empresa o empresas relacionadas, ya que aparte de poder tener una red de socios expertos en los temas de interés, también te destaca como una persona interesada en esa empresa y tecnologías
La universidad no siempre es la mejor opción para adquirir conocimientos, pero es una excelente oportunidad para hacer networking y establecer conexiones valiosas. En EE.UU., muchas empresas no requieren un título universitario, pero al menos en México sigue siendo un requisito común contar con un título y cédula profesional.
Si estás interesado en trabajar en una empresa específica, intenta conectar con personas que ya trabajan allí o con ex empleados que puedan compartir su experiencia y ofrecerte consejos sobre el proceso de selección. También si estan urgidos de trabajo hay muchas oportunidades como computrabajo.com, la feria de empleo de la UAA
Especial para trabajos de investigación, académicos y posgrados
El formato Europeo (conocido como moderno o simple), en palabras de un reclutador "hace que tu CV Respire y no se vea aglomerado". Sea cual sea el formato, tu CV tiene que tener algo único y especial que lo destaque de los demás. Al final del dia no es una ciencia exacta y dependerá del empleador, nunca es bueno retacar tu cv, si tienes varias certificaciones piensa cuales se alinean con el puesto o empresa a la que aplicas, pero siempre hay que recordar: " ¿Que diferencia un villano de un súper villano?".
Este es el post con mas upvotes (likes) del subredit de resumes
¿Por qué quieres trabajar aquí?, ¿Qué puedes aportar a nuestro equipo? Quiero trabajar aquí porque valoro el aprendizaje constante y la colaboración. Me emociona la idea de aprender de mis compañeros y, al mismo tiempo, compartir mi experiencia para contribuir al equipo.
**Ejemplo STAR: ICPC ** - **Situation (Situación):** Competí en el ICPC, un concurso internacional de programación donde los equipos tienen tiempo limitado para resolver problemas algorítmicos complejos. - **Task (Tarea):** Como líder de un equipo de tres, mi rol era optimizar estrategias, coordinar la asignación de problemas y garantizar una comunicación eficiente bajo presión. - **Action (Acción):** Implementamos un enfoque estructurado: priorizamos problemas por dificultad, dividimos tareas según fortalezas y mantuvimos una comunicación constante para evitar bloqueos. En momentos de alta presión, ajustamos nuestra estrategia rápidamente y nos apoyamos mutuamente para mantener el ritmo. - **Result (Resultado):** Mejoramos nuestro rendimiento en cada competencia, resolviendo problemas con mayor eficiencia. Esta experiencia me fortaleció en trabajo en equipo, toma de decisiones bajo presión y gestión del estrés en entornos exigentes.
https://leetcode.com/problems/fizz-buzz/ Es una pregunta algo esteriotipica de las entrevistas de trabajo
virtuales donde hacen llamada por zoom, teams, skype, o su propio software (Dato curioso skype desaparecera el 5 de mayo de 2025). Proctor: bloqueo de la página, no puedes salirte o si puedes, se te descalifica, revisan tu cuarto, graban tu pantalla, cámara y micrófono.
Mucha gente siempre se complica eligiendo un lenguaje para programar ya sea python, C++, Java, etc. pero hay que recordar que los lenguajes no son la programacion. Es esta tambien la razon por la cual muchos reclutadores piden PSEUDOCODIGO antes que el codigo en un lenguaje
Un algoritmo es una secuencia de pasos para resolver un problema. La algoritmia es la ciencia que estudia a los algoritmos
map y set de c++ se implementan con un Árbol balanceado (Red-Black Tree), pero el dict y set de python usan un hash table, lo que lo asemeja mas a un unordered_map/set de c++. Pero en uso son similares
preguntar limite de tipos de datos primitivos en c/c++ int 10^9, y long long 10^18 (64 bits) int de python tienen precisión arbitraria
P (Polynomial Time): Problemas solubles en P con una máquina determinista. NP (Nondeterministic Polynomial Time): Problemas cuya solución se puede verificar en tiempo polinómico. Ejemplo: Traveling Salesman Problem (TSP) (verificar una ruta es rápida). NP-completo (NPC): Problemas en NP tan difíciles como cualquier otro en NP. Ejemplo: SAT (Boolean Satisfiability Problem). NP-hard: Problemas al menos tan difíciles como los NP-completos, pero no necesariamente en NP. Ejemplo: TSP en su versión de optimización (encontrar la ruta más corta).
BigO es un termino usado en el campo de las matematicas y en la industria de la programacion
Asíntota: Una curva que se acerca indefinidamente a una recta o a otra curva sin llegar nunca a encontrarse.
Muchos problemas matematicos son implementaciones de sumatorias, (suma gaussiana) y En pizarron: sum=(n * (n + 1)) / 2) Complejidade de O(1)
for (int i = 0; i < n; ++i) { // O(n) pero consulta en O(1) ps[i] = ps[i - 1] + arr[i]; }
BCR es un termino usado en el famoso libro Cracking the Coding Interview por Gayle Laakmann.
ADHOC: Misc 12.1 + sim 2.2 + adv estruc 7.1 + basic dsa 16.9 = 38.3 GRAPH: back 7.1 + BFS 8.8 + DFS 10 + heap 4.8 + graph 2.5 = 33.2 DIV N CONQ: two pointer 12 + binary search 5.6 = 17.6 DP: 10.8
PROGRAMA: Cálculo del Factorial de un Número en Pseudo Inicio Escribir "Ingrese un número:" Leer n factorial := 1 Para i desde 1 hasta n hacer factorial := factorial * i Fin Para Escribir "El factorial de ", n, " es: ", factorial Fin
Estos son ejemplos pedidos en C3.AI
1. Conjunto de candidatos → Índices del arreglo nums. 2. Solución parcial → Índices alcanzables desde la posición inicial. 3. Función de selección → El índice más cercano al final que se puede alcanzar. 4. Función de factibilidad → Verificar si i + nums[i] >= goal para actualizar la meta. 5. Criterio de solución → goal == 0, indicando que podemos llegar al último índice. 6. Función objetivo → Determinar si se puede alcanzar el último índice con mínima iteración.
Los graph traversals o recorrido de grafos suelen ser de las preguntas mas comunes, pero no se preocupen la mayoria de reclutadores no ha programado uno desde la universidad, aparte de que lo que buscan es tu **aproach** o acercamiento al problema
En Depth-First Search Si la profundidad es muy grande el heap y el stack pueden chocar y provocar stack overflow. stack: almacena variables locales heap: memoria dinámica para que la asigne el programador
x es el inicio
Similar a greedy pero aqui el resultado actual depende del resultado anterior y se utiliza la técnica de memoization y/o tabulación para guardar los resultados. Cuando haya problemas que tengan que ver con numeros primos, mayormente seran DP debido a que utiliaras el algoritmo de la criba de eratostenes (sieve)
Abrir handbook
Algorithms design manual - Steven Skiena Competitive Programming 4 - Steven Halim y Felix Halim Cracking the Coding Interview - Gayle Laakmann McDowell Coding Interview Patterns - Kamran Ahmed Clean Code - Robert C. Martin ALgoritmica - Sergey Slotin **Principles of Software Engineering:** 1.KISS (Keep It Simple, Stupid): código simple y fácil de entender, sin espagueti 2.DRY (Don’t Repeat Yourself): Evita la duplicación de código 3.YAGNI (You Aren’t Gonna Need It): Implementar solo lo necesario 4.TDA (Tell, Don’t Ask): los objetos auto responsables 5.SOLID: SRP (Single Responsibility Principle), OCP (Open/Closed Principle) a extension, LSP (Liskov Substitution Principle), ISP (Interface Segregation Principle), DIP (Dependency Inversion Principle) **Pilares de POO:** Abstracción: Permite omitir detalles que no son necesarios y mostrar solo lo relevante. Encapsulamiento: Permite controlar quién puede ver y utilizar los datos de un objeto. Herencia: Las clases secundarias heredan datos y comportamientos de la clase principal. Polimorfismo: Permite realizar una acción de múltiples o diferentes formas https://www.tiobe.com/tiobe-index/