Preguntas y Respuestas de La Entrevista de Algoritmos
Preguntas y Respuestas de La Entrevista de Algoritmos
Preguntas y Respuestas de La Entrevista de Algoritmos
entrevista de algoritmos
Necesidad de algoritmo
Pause
Unmute
Duration 18:10
Loaded: 4.40%
Â
Fullscreen
Hoy en día, el problema del espacio rara vez ocurre porque el espacio en la
computadora es lo suficientemente amplio.
Paso 1: empezar
Paso 6: Incrementa i en 1
Paso 7: Incrementa j en 1
Paso 9: Detener
Caso 1:
Caso2:
Caso3:
Notación θ
La notación Big O limita una función desde arriba, define un límite superior de un
algoritmo. Consideremos el caso del ordenamiento por inserción; toma tiempo
lineal en el mejor de los casos y tiempo cuadrático en el peor de los casos. La
complejidad temporal del ordenamiento por inserción es O(n 2 ). Es útil cuando
solo tenemos un límite superior en la complejidad del tiempo de un algoritmo.
Notación Ω
p.ej
Pase1:
Pase2:
(2 5 378) -> (25378) el algoritmo no intercambia 2 y 5 porque 2<5.
(2 53 78) -> (23578) intercambia 3 y 5.
(23 57 8) -> (23578) el algoritmo no intercambia 5 y 7 porque 5<7.
(235 78 ) -> (23578) el algoritmo no intercambia 7 y 8 porque 7<8.
Pero la condición necesaria es que tenemos que resolverlo sin cambiar la variable
temporal.
1. a = a + b;
2. b=a - b; // esto actuará como (a+b)-b, ahora b es igual a a.
3. a=a - b; // (a+b)-a, ahora, a es igual a b.
1. x=x^y;
2. y=x^y;
3. x=x^y;
Para encontrar todos los anagramas en un diccionario, tenemos que agrupar todas
las palabras que contienen el mismo conjunto de letras. Entonces, si asignamos
palabras a cadenas que representan sus letras ordenadas, entonces podríamos
agrupar palabras en listas usando sus letras ordenadas como clave.
La tabla hash contiene listas asignadas a cadenas. Para cada palabra, la agregamos
a la lista en la tecla adecuada, o creamos una nueva lista y la agregamos.
Divide y vencerás utiliza los siguientes pasos para hacer una disputa sobre un
algoritmo.
Algoritmo
Paso 5: poner en cola a todos los vecinos de N que están en estado listo (estado =
1) y establecer su estado = 2 (estado de espera)
[Detener bucle]
Paso 6: Salir
Suponga que desea ir de su casa a la oficina de la manera más corta posible. Usted
sabe que algunas carreteras están muy congestionadas y es difícil usar esto, lo que
significa que estos bordes tienen un gran peso. En el algoritmo de Dijkstra, el árbol
de ruta más corto encontrado por el algoritmo intentará evitar los bordes con
pesos más grandes.
Paso 2: en cada iteración, compare el valor objetivo con el valor actual de la matriz
o Los nodos que son menores que la raíz estarán en el subárbol izquierdo.
o Los nodos que son mayores que la raíz (es decir, contienen más valor) serán
el subárbol derecho.
o Un árbol de búsqueda binario no debe tener nodos duplicados.
o El subárbol de ambos lados (es decir, izquierdo y derecho) también debe ser
un árbol de búsqueda binaria.
16) ¿Escribir un algoritmo para insertar un nodo
en el árbol de búsqueda binario?
La operación de inserción de nodos es una operación fluida. Debe compararlo con
el nodo raíz y atravesarlo hacia la izquierda (si es más pequeño) o hacia la derecha
(si es más grande) según el valor del nodo que se va a insertar.
Algoritmo:
Ejemplo:
Producción:
1. #incluir <stdio.h>
2. #incluir <stdlib.h>
3. nodo de estructura
4. {
5. datos int ;
6. struct Nodo *siguiente;
7. };
8.
9. void delNodo( struct Nodo *head, struct Nodo *n)
10. {
11. si (cabeza == n)
12. {
13. if (cabeza->siguiente == NULL)
14. {
15. printf ( "la lista no se puede dejar vacía porque solo hay un
nodo". );
16. volver ;
17. }
18. cabeza->datos = cabeza->siguiente->datos;
19. n = cabeza->siguiente;
20. cabeza->siguiente = cabeza->siguiente->siguiente;
21. libre(n);
22. volver ;
23. }
24. struct Nodo *anterior = cabeza;
25. while (anterior->siguiente!= NULL && anterior->siguiente!= n)
26. anterior = anterior->siguiente;
27. si (anterior->siguiente == NULL)
28. {
29. printf( "\n Este nodo no está presente en la Lista" );
30. volver ;
31. }
32. anterior->siguiente = anterior->siguiente->siguiente;
33. libre(n);
34. volver ;
35. }
36. void push( struct Node **head_ref, int new_data)
37. {
38. struct Nodo *nuevo_nodo =
39. ( struct Nodo *)malloc( tamaño de ( struct Nodo));
40. nuevo_nodo->datos = nuevos_datos;
41. nuevo_nodo->siguiente = *head_ref;
42. *head_ref = nuevo_nodo;
43. }
44. void imprimirLista( struct Nodo *cabeza)
45. {
46. mientras (cabeza! = NULL)
47. {
48. printf( "%d " ,cabeza->datos);
49. cabeza=cabeza->siguiente;
50. }
51. imprimirf( "\n" );
52. }
53. int principal()
54. {
55. estructura Nodo *head = NULL;
56. empujar(&cabeza,3);
57. empujar(&cabeza,2);
58. empujar(&cabeza,6);
59. empujar(&cabeza,5);
60. empujar(&cabeza,11);
61. empujar(&cabeza,10);
62. empujar(&cabeza,15);
63. empujar(&cabeza,12);
64. printf( "Lista de enlaces disponibles:" );
65. imprimirLista(cabeza);
66. printf( "\nEliminar nodo %d: ", encabezado->siguiente->siguiente-
>datos);
67. delNode(cabeza, cabeza->siguiente->siguiente);
68.
69. printf( "\nLista enlazada actualizada: " );
70. imprimirLista(cabeza);
71.
72. /* Vamos a borrar el primer nodo */
73. printf( "\nEliminar primer nodo" );
74. delNodo(cabeza, cabeza);
75.
76. printf( "\nLista enlazada actualizada: " );
77. imprimirLista(cabeza);
78.
79. getchar();
80. devolver 0;
81. }
Producción:
Ejemplo
1. #incluir <stdio.h>
2. #incluir <stdlib.h>
3. nodo de estructura
4. {
5. datos int ;
6. struct Nodo *siguiente;
7. };
8. void push( struct Node ** head_ref, int new_data)
9. {
10. struct Nodo* nuevo_nodo =
11. ( struct Node*) malloc( sizeof ( struct Node));
12. nuevo_nodo->datos = nuevos_datos;
13. nuevo_nodo->siguiente = (*head_ref);
14. (*head_ref) = nuevo_nodo;
15. }
16. void imprimirLista( struct Nodo *cabeza)
17. {
18. struct Nodo *temp = cabeza;
19. mientras (temp != NULL)
20. {
21. printf( "%d" , temperatura->datos);
22. temp = temp->siguiente;
23. }
24. imprimirf( "\n" );
25. }
26. void merge( struct Nodo *p, struct Nodo **q)
27. {
28. struct Nodo *p_curr = p, *q_curr = *q;
29. estructura Nodo *p_siguiente, *q_siguiente;
30. while (p_curr != NULL && q_curr != NULL)
31. {
32. p_siguiente = p_actual->siguiente;
33. q_siguiente = q_actual->siguiente;
34. q_actual->siguiente = p_siguiente;
35. p_curr->siguiente = q_curr;
36. p_actual = p_siguiente;
37. q_actual = q_siguiente;
38. }
39.
40. *q = q_actual;
41. }
42. int principal()
43. {
44. struct Nodo *p = NULL, *q = NULL;
45. empujar(&p, 3);
46. empujar(&p, 2);
47. empujar(&p, 1);
48. printf( "Lista I Vinculada:\n" );
49. imprimirLista(p);
50.
51. empujar(&q, 8);
52. empujar(&q, 7);
53. empujar(&q, 6);
54. empujar(&q, 5);
55. empujar(&q, 4);
56. printf( "II lista enlazada:\n" );
57. imprimirLista(q);
58.
59. fusionar(p, &q);
60.
61. printf( "Lista I Linked actualizada:\n" );
62. imprimirLista(p);
63.
64. printf( "Lista enlazada II actualizada:\n" );
65. imprimirLista(q);
66. getchar();
67. devolver 0;
68. }
Producción:
Lista enlazada:
1 2 3
II Lista Vinculada:
4 5 6 7 8
Lista I Linked actualizada:
1 4 2 5 3 6
Lista actualizada de enlaces II:
7 8
Principio de funcionamiento
La diferencia significativa entre la pila y la cola es que la pila usa el método LIFO
(Último en entrar, primero en salir) para acceder y agregar elementos de datos,
mientras que Queue usa el método FIFO (Primero en entrar, primero en salir) para
obtener el miembro de datos.
Estructura
Stack usa un puntero mientras que Queue usa dos punteros (en el caso simple).
Operaciones realizadas
Stack funciona como Push y pop, mientras que Queue funciona como Enqueue y
dequeuer.
variantes
Stack no tiene variantes, mientras que Queue tiene variantes como una cola
circular, una cola de prioridad, una cola de dos extremos.
Implementación