Cinco algoritmos que los programadores deben dominar

 

Como programador, dominar los algoritmos es esencial. Los algoritmos son una de las herramientas clave en el desarrollo de programas y la resolución de problemas. A continuación, se presentarán cinco algoritmos que los programadores definitivamente conocerán y necesitarán dominar, con la esperanza de ayudar a todos en su estudio y trabajo.

1. Algoritmo de clasificación - Clasificación rápida

El algoritmo de clasificación es uno de los algoritmos más básicos y comúnmente utilizados. Uno de los algoritmos más eficientes y que vale la pena dominar es quicksort. Quicksort es un algoritmo de divide y vencerás.Al seleccionar un número de referencia en la secuencia que se ordenará y dividir la secuencia en dos subsecuencias, una parte es más pequeña que el número de referencia y la otra es mayor que el número de referencia, y luego recursivamente ordena las dos subsecuencias. La complejidad de tiempo promedio de clasificación rápida es O (nlogn), que es uno de los algoritmos de clasificación más utilizados en la actualidad.

El siguiente es un código de muestra para una ordenación rápida:

def quick_sort(arr):
    if len(arr) <= 1:
        return arr
    else:
        pivot = arr[0]
        less = [x for x in arr[1:] if x <= pivot]
        greater = [x for x in arr[1:] if x > pivot]
        return quick_sort(less) + [pivot] + quick_sort(greater)

arr = [3, 7, 5, 1, 9, 2]
sorted_arr = quick_sort(arr)
print(sorted_arr)

2. Algoritmo de búsqueda - Búsqueda binaria

La búsqueda binaria es un algoritmo de búsqueda eficiente cuando se trata de listas o matrices ordenadas. Su idea básica es reducir el rango de búsqueda a la mitad cada vez hasta que se encuentre el elemento de destino o se determine que no existe. La complejidad temporal de la búsqueda binaria es O(logn).

El siguiente es un código de muestra para la búsqueda binaria:

def binary_search(arr, target):
    low = 0
    high = len(arr) - 1
    
    while low <= high:
        mid = (low + high) // 2
        if arr[mid] == target:
            return mid
        elif arr[mid] < target:
            low = mid + 1
        else:
            high = mid - 1
    
    return -1

arr = [1, 2, 3, 5, 7, 9]
target = 5
index = binary_search(arr, target)
print("目标元素在索引", index)

3. Algoritmo gráfico: búsqueda en profundidad primero

La búsqueda en profundidad (DFS) es un algoritmo para recorrer un gráfico o árbol. Su idea básica es comenzar desde el nodo inicial, profundizar en el camino hasta que no pueda continuar, y luego retroceder al nodo anterior para continuar explorando otros caminos. DFS generalmente se implementa mediante recursividad o pilas (no recursivas).

El siguiente es un código de muestra para la búsqueda en profundidad:

def dfs(graph, start, visited=None):
    if visited is None:
        visited = set()
    
    visited.add(start)
    print(start, end=" ")
    
    for neighbor in graph[start]:
        if neighbor not in visited:
            dfs(graph, neighbor, visited)

# 图的表示方式为邻接表
graph = {
    'A': ['B', 'C'],
    'B': ['D', 'E'],
    'C': ['F'],
    'D': [],
    'E': ['F'],
    'F': []
}

dfs(graph, 'A')

4. Programación Dinámica - Problema de la Mochila

La programación dinámica es un método de optimización para resolver problemas caracterizados por subproblemas superpuestos. El problema de la mochila es uno de los problemas clásicos de la programación dinámica, su idea básica es seleccionar algunos artículos para poner en la mochila para lograr el valor máximo o el peso mínimo bajo la capacidad y colección de artículos dada.

Aquí hay un código de muestra para el problema de la mochila:

def knapsack(weights, values, capacity):
    n = len(weights)
    dp = [[0] * (capacity + 1) for _ in range(n + 1)]
    
    for i in range(1, n + 1):
        for j in range(1, capacity + 1):
            if weights[i - 1] <= j:
                dp[i][j] = max(dp[i - 1][j], values[i - 1] + dp[i - 1][j - weights[i - 1]])
            else:
                dp[i][j] = dp[i - 1][j]
    
    return dp[n][capacity]

weights = [2, 3, 4, 5]
values = [3, 4, 5, 6]
capacity = 8
max_value = knapsack(weights, values, capacity)
print("背包能装的最大价值为", max_value)

5. Optimización Combinatoria - Problema del Vendedor Viajero

El problema del vendedor ambulante es un problema clásico de optimización combinatoria que requiere encontrar el camino más corto entre ciudades dadas, de modo que cada ciudad se visite solo una vez y finalmente regrese a la ciudad de origen. Este es un problema NP-difícil sin solución en tiempo polinomial, pero hay muchas heurísticas que pueden aproximarlo.

Aquí hay un código de muestra para el problema del viajante de comercio (usando programación dinámica):

def tsp(distances, start):
    n = len(distances)
    dp = [[float('inf')] * (1 << n) for _ in range(n)]
    
    for i in range(n):
        dp[i][1 << i] = distances[i][start]
    
    for mask in range(1, 1 << n):
        for i in range(n):
            if mask & (1 << i) == 0:
                continue
            for j in range(n):
                if mask & (1 << j) != 0:
                    continue
                dp[j][mask | (1 << j)] = min(dp[j][mask | (1 << j)], dp[i][mask] + distances[i][j])
    
    min_distance = float('inf')
    for i in range(n):
        min_distance = min(min_distance, dp[i][(1 << n) - 1])
    
    return min_distance

distances = [
    [0, 2, 9, 10],
    [1, 0, 6, 4],
    [15, 7, 0, 8],
    [6, 3, 12, 0]
]
start = 0
min_distance = tsp(distances, start)
print("最短路径的总距离为", min_distance)

Los anteriores son cinco algoritmos importantes que un programador debe dominar. Al aprender y dominar estos algoritmos, puede mejorar la eficiencia del desarrollo de programas y la resolución de problemas, y sentar una buena base para el desarrollo de su carrera. ¡Espero que este artículo sea útil para todos!

Supongo que te gusta

Origin blog.csdn.net/qq_40379132/article/details/131910708
Recomendado
Clasificación