[ / / / / / / / / / / / / / ] [ dir / arepa / ausneets / leftpol / manolo / mde / newbrit / pinoy / vichan ]

/arepa/ - Venezuela ★

100% libre de mongolos
Correo
Comentario *
Archivo
Contraseña (Randomized for file and post deletion; you may also set your own.)
* = obligatorio[▶ Opciones y restricciones de publicación]
Confused? See the FAQ.
Insertar
(reemplaza los archivos y puede usarse en su lugar)
Opciones
dadosladosmodificador

Tipos de archivos permitidos: jpg, jpeg, gif, png, webm, mp4
El tamaño máximo de la imagen es de 16 MB.
Las dimensiones máximas de las imágenes son de 15000 x 15000.
Puedes subir 3 archivos por aporte.


[ /colombia/ | /tacos/ | /di/ | /hisrol/ | /hisparefugio/ | /hispint/ | Reglas ]

File: 980b587c226d899⋯.png (40,96 KB, 693x313, 693:313, binary-search1.png)

 No.35884

quizas conocen el metodo de busqueda binaria para conseguir el indice de un elemento en un arreglo ordenado. hay una forma de ver esto: si A es el arreglo de tama;o N, consideremos una funcion cuyo dominio son los enteros de 0 a N-1 tal que f(i)=A[i]. esta funcion es creciente (o decreciente) dado que el arreglo esta ordenado. dado un valor k lo que queremos hallar es i en 0..N-1 tal que f(i) = k

el algoritmo de busqueda binaria es uno de los primeros que se aprenden en una clase de algoritmos. lo que no es tan conocido es que tiene una contraparte continua que sirve para hallar una solucion x a la ecuacion f(x)=y (por ejemplo, x²=17). la unica diferencia es que en vez de usar una funcion creciente con dominio en los enteros, usamos una funcion real continua definida en un intervalo [a, b] donde la funcion es creciente

 No.35931

mi primera clase de algoritmos fue de operadores logicos y tipos de variables kuek.

deja que se me pase lo curdo y leo tu mierda con seriedad opargo.


 No.35977

File: 8ea30e92dcd7765⋯.png (36,87 KB, 1200x686, 600:343, proxy.duckduckgo.com.png)

>>35884

continuo

consideremos primero una implementacion en python del algoritmo de busqueda binaria


def binary_search(haystack, needle, lower=None, upper=None):
''' dada una secuencia l ordenada, si el elemento x esta en la secuencia
hallamos i tal que l[i] = x
'''
if lower == None: # primera llamada a la funcion
lower = 0
upper = len(haystack)
midpoint = (lower+upper)//2
if upper > lower+1: # verificamos que hayan elementos entre
# haystack[lower] y haystack[upper]
# de no haberlos, no se logro encontrar el elemento
if needle == haystack[midpoint]:
return midpoint
elif needle > haystack[midpoint]:
return binary_search(haystack, needle, midpoint, upper)
elif needle < haystack[midpoint]:
return binary_search(haystack, needle, lower, midpoint)
else:
raise Exception('no se hallo el elemento')

podemos hacer algunos cambios para llegar a la version continua del algoritmo. para empezar, haystack no seria un arreglo sino una funcion, asi que en vez de hacer haystack[x] hacemos haystack(x). tambien el valor medio entre a y b ya no es un numero entero, asi que hacemos midpoint = (a+b)/2 en vez de midpoint = (a+b)//2

por otro lado, tenemos que definir un intervalo en el que creamos que se puede conseguir la solucion y en el que la funcion sea creciente, asi que nuestra nueva funcion recibira dos parametros mas para los limites del intervalo.

dadas las limitaciones de los numeros de punto flotante, no podemos comparar la equivalencia de needle y haystack[midpoint] para ver si conseguimos la solucion, sino que tenemos que establecer que tan precisa quieremos nuestra solucion, asi que cambiamos el needle == haystack[midpoint] por abs(needle, haystack[midpoint]) < EPSILON, para alguna constante epsilon.

finalmente, no nos sirve revisar si upper es el sucesor de lower para ver si no hay mas elementos que inspeccionar. asi que en vez de revisar si upper>lower+1, revisamos si abs(upper-lower)>EPSILON, queriendo ver si el intervalo es lo suficientemente grande para pensar que la solucion podria estar en el. asi tenemos,


def bisect(haystack, needle, lower, upper):
''' dada una funcion f: R->R, hallamos la solucion de f(x)=y en un intervalo
(lower, upper)
'''
midpoint = (lower+upper)/2
if abs(upper-lower) > EPSILON:
if abs(needle-haystack(midpoint)) < EPSILON:
return midpoint
elif needle > haystack(midpoint):
return bisect(haystack, needle, midpoint, upper)
elif needle < haystack(midpoint):
return bisect(haystack, needle, lower, midpoint)
else:
raise Exception('no se hallo el elemento')

mas alla, podemos garantizar que el algoritmo de biseccion va a funcionar si haystack(lower) <= needle <= haystack(upper), gracias al teorema del valor intermedio: https://es.wikipedia.org/wiki/Teorema_del_valor_intermedio


 No.36230

>>35977

Negro, quiero ser como tu. Que me recomiendas para estar ducho en Python? Por cierto, tengo que repasar C++. tengo como 4 años que no toco algun lenguaje de prog.


 No.36240

>>35977

>recursividad

Aprende assembly, y quizás dios te perdone.


 No.36255

me gustaria hacer otro post similar pero no se me ocurre otra cosa

>>36230

>Que me recomiendas para estar ducho en Python?

programar cosas en python. usar flask para hacer aplicaciones web puede ser divertido a veces. o que tal si haces unas cosas que a mi me da flojera hacer pero te doy todas las instrucciones que necesites? :D

estoy leyendo un libro que se llama fluent python que es muy bueno

>>36240

es super elegante hacerlo asi

tengo muchos a;os sin programar en ensamblador y cuando lo hice programe muy poco, pero por lo que leo tambien se puede usar recursividad


 No.36257

>>36255

Se puede usar recursividad, claro que si, el punto es que ver de primera mano como funciona realmente la recursividad te hace dar cuenta de que es una perdida de recursos y ciclos de CPU monumental comparado con usar loops, cuya única función que cumple es "muh elegancia", especialmente en un lenguaje que no optimiza la recursión como python.


 No.36286

>>36257

te parece que es importante para el proposito del codigo que escribi? estas bien? te paso algo hoy?


 No.36380

>>35977

heh, quería hacer una versión más «pythonic» de esto


def bisect(arr, val):

middle = len(arr)//2

if len(arr) == 0:

return None



if arr[middle] == val:

return middle

elif val > middle:

return bisect(arr[middle:], val)

else:

return bisect(arr[:middle], val)

pero no hace nada útil


 No.36424

>>36380

muy bien. no lo hice asi porque no iba a poder despues hacer ver lo similar que es el algoritmo de biseccion




[Volver][Al encabezado][Catálogo][Nerve Center][Cancer][Post a Reply]
Suprimir aporte [ ]
[]
[ / / / / / / / / / / / / / ] [ dir / arepa / ausneets / leftpol / manolo / mde / newbrit / pinoy / vichan ]