title: “Algoritmos - Modulo 2 - Los Palmeras output: pdf_document: default word_document: default html_document: default date:”2026-04-19” —

Introducción

Este es un documento en R Markdown. Permite generar HTML o Word combinando texto y código.

El lenguaje R es una poderosa herramienta matemática y estadística. En este reporte generado con R Markdown, analizaremos la resolución de distintos problemas y evaluaremos la calidad de diferentes algoritmos implementados.

Probando primeros comandos de R

R es un leguaje muy parecido a matlab y trabaja con variables que en general pueden ser matrices.

A <- 38
A <- 40
B <- 60
C <- B - A
C
## [1] 20

Uso de data sets o base de datos internos de R

Usando el comando data() en la consola obtenemos distintos datos ya cargados en la base de datos de R, estos datos estan cargados en tablas de las cuales podemos elegir columnas especificas si escribimos el signo $ despues del comando de informacion especifico que queremos.

También está el comando summary(), que es una de las herramientas más útiles y rápidas que tiene R para hacer estadística descriptiva básica.

# Planteamos el dataset
data(cars)
# Usamos el símbolo $ para extraer SOLO la columna de velocidades (speed)
velocidades <- cars$speed

# Mostramos los primeros 6 valores de esa columna aislada
head(velocidades)
## [1] 4 4 7 7 8 9
summary(cars)
##      speed           dist       
##  Min.   : 4.0   Min.   :  2.00  
##  1st Qu.:12.0   1st Qu.: 26.00  
##  Median :15.0   Median : 36.00  
##  Mean   :15.4   Mean   : 42.98  
##  3rd Qu.:19.0   3rd Qu.: 56.00  
##  Max.   :25.0   Max.   :120.00

Comando plot (Gráficos)

Es un comando que sirve para graficar cualquier fuente de datos que le asignemos: Tenemos la posibilidad de asignar nombres a las variables o hacer cambios del grafico, en caso de no saber el comando podemos escribir plot en la consola, a la derecha nos va a abrir una pestaña y ahí tocar Generic X-Y Plotting y ahi nos va a explicar cada comando

plot(pressure, type = "s",
     main = "Presión del gas ideal",
     ylab = "hPa",
     xlab = "K")

Funciones estadísticas

Otro comando usado es el comando rnorm. Este lo que hace es generar datos aleatorios, pero forzando a que esos datos sigan la forma de una Distribución Normal (la famosa campana de Gauss).

Podemos asignarle ciertos parámetros si queremos: Tamaño de la muestra n (es la cantidad de datos que le pides a R que invente, en este caso 350) Media (el valor central, en este caso 22), o Desviación estándar (Representa la dispersión o el “error experimental”, en este caso, 5).

z1 <- rnorm(350, 22, 5)
z1
##   [1] 25.423372 26.252019 20.753177 16.898988 22.126085 22.029116 20.276317
##   [8] 15.774233 23.508075 16.154842 19.968107 29.057029 19.816880 20.563690
##  [15] 20.687286 23.909931 27.601561 11.461177 23.989903 13.724644 17.903936
##  [22] 31.348537 17.903458 23.971376 23.838513 31.140305 34.202101 24.087796
##  [29] 27.066880 31.697359 19.190547 30.078853 21.785649 22.744601 15.910729
##  [36] 21.889024 16.913743 19.931908 20.791124 21.454975 20.323830 23.061486
##  [43] 27.322995 18.208351 22.983971 25.154142 34.367947 30.914103 26.331397
##  [50] 23.588838 21.896986 21.065088 22.909868 17.762421 31.303535 23.613064
##  [57] 20.409443 17.216739 15.370257 16.187016 17.515640 13.816894 19.890096
##  [64] 15.044622 19.730105 22.210150 18.822660 29.396875 19.951013 27.122509
##  [71] 17.156506 17.162920 22.136373 20.111019 14.382473 24.258953 12.298620
##  [78] 25.311174 22.131884 17.053869 25.176960 13.057665 25.487535 19.973192
##  [85] 29.664080 28.463786 13.593554 21.989963 27.185209 26.946221 17.387278
##  [92] 15.857706 32.058800 22.449649 22.572548 23.163272 21.471528 26.164285
##  [99] 27.787619 22.542678 26.454779 17.919105 17.183313 21.507792 17.293187
## [106] 32.478963 30.080387 22.836413 28.800771 18.225631 22.156425  7.345069
## [113] 31.024415 27.199651 27.264347 18.695472 17.632760 25.614528 14.552424
## [120] 20.537346 29.207464 18.910521 23.162167 22.705273 24.159419 21.315256
## [127] 21.676481 25.069409 24.952292 19.753346 18.999971 18.271817 19.290951
## [134] 31.499788 19.324141 23.898517 18.100536 11.917450 23.765012 20.835586
## [141] 27.855382 20.974448 19.618040 23.294556 17.719830 21.083026 24.530980
## [148] 21.267274 16.999455 22.047482 19.881173 17.372507 21.495375 14.262615
## [155] 20.180180 13.820112 23.707034 13.365460 29.013350 15.601899 19.120223
## [162] 20.429667 22.621133 23.633800 25.862454 25.023013 16.043327 15.051480
## [169] 24.162516 29.454670 24.303320 21.522645 27.189592 18.739179 22.199073
## [176] 19.682407 25.367216 21.244029 13.755597 30.346227 26.553000 20.850699
## [183] 19.131227 22.971225 26.673048 27.473732 18.233275 29.284409 19.664294
## [190] 23.922511 20.447207 22.909348 23.268690 20.202066 24.839271 20.245733
## [197] 16.893535 19.517390 19.948174 21.585098 18.124447 26.549427 23.083520
## [204] 18.843586 17.578526 19.824862 19.963373 10.173110 25.801941 19.950924
## [211] 29.163904 18.794374 24.602745 27.184285 30.507517 18.845004 27.354509
## [218] 29.938396 23.251903 20.622650 24.568543 20.757193 18.489878 16.293143
## [225] 25.115036 18.236717 31.034493 12.552837 24.041366 31.619260 15.374799
## [232] 17.255050 16.331334 23.102925 19.453744 31.870995 16.145075 12.153846
## [239] 11.893006 15.537866 19.588692 17.442320 19.557514 18.434919 18.608755
## [246] 17.917001  5.801304 20.330936 16.557882 16.786605 19.018952 19.797074
## [253] 17.519307 20.721424 18.481188 29.808590 29.776893 16.008146 23.105630
## [260] 28.910465 33.660317 14.325519 19.458271 20.072902 21.477734 18.722209
## [267] 23.319085 23.279024 16.209822 15.380147 23.511165 25.645686 16.304672
## [274] 28.371787 21.679540 18.713704 28.268611 20.888153 22.962755 16.788971
## [281] 19.400636 20.379400 25.496327 22.651103 17.518170 20.003019 23.533685
## [288] 28.554430 12.418950 18.493182 22.158338 16.687644 25.571902 18.435870
## [295] 22.615775 26.951965  9.670823 16.773166 18.545151 25.760798 16.197428
## [302] 25.135639 25.462069 33.960410 23.890357 12.744907 24.177700 20.853268
## [309] 17.268195 14.369494 22.773326 23.633220 18.663909 26.449850 33.234164
## [316] 18.106131 15.377775 22.813060 14.497797 25.854444 24.374890 27.363782
## [323] 25.975707 29.400497 22.552489 27.148267 29.642200 23.640379 35.599133
## [330] 25.788642 19.636969 21.147493 16.146770 25.037381 17.525733 16.199254
## [337] 21.405084 23.312342 23.817455 26.930971 19.895186 27.571040 19.816632
## [344] 17.685310 17.092565 12.808220 23.324064 13.381841 20.709504 22.372889
w1 <- length(z1)
w1
## [1] 350
x1 <- 500:849
x1
##   [1] 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517
##  [19] 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535
##  [37] 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553
##  [55] 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571
##  [73] 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589
##  [91] 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607
## [109] 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625
## [127] 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643
## [145] 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661
## [163] 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679
## [181] 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697
## [199] 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715
## [217] 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733
## [235] 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751
## [253] 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769
## [271] 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787
## [289] 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805
## [307] 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823
## [325] 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841
## [343] 842 843 844 845 846 847 848 849
plot(z1, x1)

El comando hist() genera un histograma.

hist(z1, main = "Histograma de edades", breaks = 60)

El comando density() calcula la densidad de probabilidad. Es la versión matemática, suavizada y continua del histograma.

density(z1,type="b")
## Warning: In density.default(z1, type = "b") :
##  extra argument 'type' will be disregarded
## 
## Call:
##  density.default(x = z1, type = "b")
## 
## Data: z1 (350 obs.); Bandwidth 'bw' = 1.42
## 
##        x                y            
##  Min.   : 1.542   Min.   :9.260e-06  
##  1st Qu.:11.121   1st Qu.:1.636e-03  
##  Median :20.700   Median :1.574e-02  
##  Mean   :20.700   Mean   :2.607e-02  
##  3rd Qu.:30.279   3rd Qu.:4.788e-02  
##  Max.   :39.858   Max.   :7.726e-02
plot(density(z1),type="b")


## Ejercicio 1: Designación

**Consigna:** Las ultimas 3 cifras del DNI son 364, crear una variable que tenga ese número
DNI <- 364

Consigna: Crear un vector del 1 al 364.

lista_dni <- 1:364
lista_dni
##   [1]   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18
##  [19]  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36
##  [37]  37  38  39  40  41  42  43  44  45  46  47  48  49  50  51  52  53  54
##  [55]  55  56  57  58  59  60  61  62  63  64  65  66  67  68  69  70  71  72
##  [73]  73  74  75  76  77  78  79  80  81  82  83  84  85  86  87  88  89  90
##  [91]  91  92  93  94  95  96  97  98  99 100 101 102 103 104 105 106 107 108
## [109] 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
## [127] 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
## [145] 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
## [163] 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180
## [181] 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198
## [199] 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216
## [217] 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234
## [235] 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252
## [253] 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270
## [271] 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288
## [289] 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306
## [307] 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324
## [325] 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342
## [343] 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360
## [361] 361 362 363 364

## Ejercicio 2: Uso de for

**Consigna:** Calcular la suma de todos los valores del vector *lista_dni* usando un for:
Total <- 0
valor_final <- length(lista_dni)

for (i in 1:valor_final) {
    Total <- Total + i
}

Total
## [1] 66430

## Ejercicio 3: Phyton

**Consigna:** Repetir el ejercicio anterior pero en Phyton
# --- Ejercicio 1 ---
# Consigna: Crear una variable con las últimas 3 cifras del DNI (364)
dni = 364

# Consigna: Crear un vector (lista) del 1 al 364
# En Python, range(1, 364) genera números del 1 al 364
lista_dni = list(range(1, dni + 1))

# --- Ejercicio 2 ---
# Calcular la suma de todos los valores usando un bucle 'for'
total = 0

for i in lista_dni:
    total += i

# Mostrar el resultado final
print(f"Suma total: {total}")
## Suma total: 66430

## Ejercicio 4: Medición de tiempo (sys.time) 

**Consigna:**¿Cuanto tarda en correr el código del ejercicio 2?

Usamos el comando **sys.time**
inicio <- Sys.time()
total <- 0
valor_final <- 10000000*length(lista_dni)
for (i in 1:valor_final)
    total <- total + i  
total
## [1] 6.6248e+18
final <- Sys.time()
final-inicio
## Time difference of 59.46597 secs

## Ejercicio 5: 2da medición de tiempo (tictoc)

**Consigna:** Aplicar la consigna anterior pero aprendiendo a usar el comando **tictoc**
library(tictoc)

# Iniciamos el cronómetro asignándole un nombre descriptivo a la prueba
tic("Tiempo de ejecución")

# Inicio del bloque a medir
Total<-0
valor_final<-length(lista_dni)

for(i in 1:valor_final) {
    Total<-Total + i
}
# Fin del bloque a medir

#Se "detiene" el cronómetro. 

#Esto imprimirá el tiempo transcurrido en pantalla.
toc()
## Tiempo de ejecución: 0.005 sec elapsed
#Imprimimos la variable Total para verificar que el cálculo matemático se hizo bien
Total
## [1] 66430

## Ejercicio 6: Secuencia

**Consigna:** Generar secuencia de 2 en 2 hasta 50000
inicio_for <- Sys.time()

A <- numeric(50000)
for (i in 1:50000) {
    A[i] <- i * 2
}

final_for <- Sys.time()
tiempo_for <- final_for - inicio_for

Secuencia con función de R:

inicio_seq <- Sys.time()

B <- seq(2, 100000, by = 2)

final_seq <- Sys.time()
tiempo_seq <- final_seq - inicio_seq

# Resultados
tiempo_for
## Time difference of 0.006905794 secs
tiempo_seq
## Time difference of 0.002022743 secs

## Ejercicio 7: Serie de Fibonacci

**Consigna:** Generar sucesión o serie de Fibonacci hasta superar 1.000.000
# Generar Fibonacci hasta superar 1.000.000

fibonacci <- c(0,1)
iteraciones <- 2

while (fibonacci[length(fibonacci)] <= 1000000) {
    nuevo <- fibonacci[length(fibonacci)] + fibonacci[length(fibonacci)-1]
    fibonacci <- c(fibonacci, nuevo)
    iteraciones <- iteraciones + 1
}

fibonacci
##  [1]       0       1       1       2       3       5       8      13      21
## [10]      34      55      89     144     233     377     610     987    1597
## [19]    2584    4181    6765   10946   17711   28657   46368   75025  121393
## [28]  196418  317811  514229  832040 1346269
iteraciones
## [1] 32

## Ejercicio 8: Definición matemática recurrente

**Consigna:**¿Cuantas iteraciones se necesitan para generar un número de la serie mayor que 1.000.000?
f0<-0   #Valores iniciales
f1<-1
f2<-0 
i<-0  #Número de iteraciones incial
valorfinal<-1000000 #Umbral

while (f2<valorfinal) {
    
    f2=f0+f1
    f0=f1
    f1=f2
    i<-i+1
    
}
f2
## [1] 1346269
i
## [1] 30

## Ejercicio 9: Método Burbuja (Bubble Sort)

**Consigna:** Compara la performance de ordenación del método burbuja vs el método sort de R.
x <- sample(1:20000, 20000)

burbuja <- function(x) {
    n <- length(x)
    for (j in 1:(n-1)) {
        for (i in 1:(n-j)) {
            if (x[i] > x[i+1]) {
                temp <- x[i]
                x[i] <- x[i+1]
                x[i+1] <- temp
            }
        }
    }
    return(x)
}

Comparación:

system.time({
    res1 <- burbuja(x)
})
##    user  system elapsed 
##  21.824   0.036  21.967
system.time({
    res2 <- sort(x)
})
##    user  system elapsed 
##       0       0       0

## Ejercicio 10: Penitencia de Newton

**Consigna:** Desarrollar dos algoritmos que hagan el trabajo de sumar desde 1 hasta 1000000 y verifcar cuál de los dos es más eficiente

Método 1 (for):

n <- 1000000

system.time({
    suma1 <- 0
    for (i in 1:n) {
        suma1 <- suma1 + i
    }
})
##    user  system elapsed 
##   0.016   0.000   0.016

Método 2 (fórmula matemática):

system.time({
    suma2 <- n * (n + 1) / 2
})
##    user  system elapsed 
##       0       0       0

Comparación:

suma1
## [1] 500000500000
suma2
## [1] 500000500000

## Conclusión final:

En este trabajo se evaluó la eficiencia de diversos algoritmos en R utilizando técnicas de benchmarking (Sys.time, tictoc y microbenchmark). Se comprobó empíricamente que la calidad de un código no radica únicamente en su exactitud, sino en la optimización de los recursos de procesamiento y el tiempo de ejecución. El ejercicio "La penitencia de Newton" ilustra claramente esta premisa: mientras que un bucle iterativo presenta un alto costo computacional ante operaciones masivas, la aplicación de un modelo matemático adecuado resuelve el problema de forma casi instantánea. Las métricas obtenidas confirman que el razonamiento lógico-matemático previo supera a la capacidad del hardware como principal factor de optimización. Los métodos analíticos resultan órdenes de magnitud más eficientes que la iteración tradicional.