企业网站建设分析/中国网评中国网评
一、说明
这是程序员最不能忘的8种算法;这些算法广泛用于各种应用程序,程序员对它们有深刻的理解很重要。所以我会尽力解释它们。
算法是用于解决特定问题或完成特定任务的一组指令或过程。算法可以用任何编程语言表示,可以像一系列基本操作一样简单,也可以像涉及不同数据结构和逻辑的多步骤过程一样复杂。算法的主要目标是接收输入、处理它并提供预期的输出。算法可以根据时间和空间复杂性、用于解决问题的技术以及解决问题的类型进行分类。算法的例子有排序、搜索、图形遍历、字符串操作、数学运算等等。先列出这些算法名称:
- 排序算法:排序是计算机科学中的一项基本操作,有几种有效的算法,例如快速排序、归并排序和堆排序。
- 搜索算法:在大型数据集中搜索元素是一项常见任务,有几种有效的算法,例如二进制搜索和哈希表。
- 图算法:图算法用于解决与图相关的问题,例如寻找两个节点之间的最短路径或确定图是否连通。
- 动态规划:动态规划是一种通过将问题分解为更小的子问题并存储这些子问题的解决方案以避免冗余计算来解决问题的技术。
- 贪心算法:贪心算法用于通过在每一步做出局部最优选择并希望找到全局最优来解决优化问题。
- 分而治之:分而治之是一种基于多分支递归的算法设计范式。分而治之算法将问题分解为相同或相关类型的子问题,直到这些问题变得简单到可以直接解决为止。
- 回溯:回溯是一种通用的算法技术,它考虑以系统的方式搜索每个可能的组合,并在确定它不能成为解决方案的一部分时立即放弃特定路径。
- 随机算法:随机算法使用随机性来解决问题。它可以用于解决无法确定性解决的问题或提高问题的平均情况复杂性。
二、排序算法
2.1 快速排序
-
快速排序是一种分而治之的算法,它从数组中选择一个“枢轴”元素,然后根据其他元素是小于还是大于枢轴将其划分为两个子数组。然后对子数组进行递归排序。
def quicksort(arr):if len(arr) <= 1:return arrpivot = arr[len(arr) // 2]left = [x for x in arr if x < pivot]middle = [x for x in arr if x == pivot]right = [x for x in arr if x > pivot]return quicksort(left) + middle + quicksort(right)print(quicksort([3,6,8,10,1,2,1]))
2.2 归并排序:
-
归并排序算法是一种分而治之的算法,它将一个数组一分为二,对两半进行排序,然后将它们归并在一起。
def merge_sort(arr):if len(arr) <= 1:return arrmid = len(arr) // 2left = merge_sort(arr[:mid])right = merge_sort(arr[mid:])return merge(left, right)def merge(left, right):result = []i = 0j = 0while i < len(left) and j < len(right):if left[i] < right[j]:result.append(left[i])i += 1else:result.append(right[j])j += 1result += left[i:]result += right[j:]return result
print(merge_sort([3,6,8,10,1,2,1]))
2.3 堆排序
-
堆排序算法是一种基于比较的排序算法,它从输入元素构建堆,然后从堆中反复提取最大元素,并将其放在排序后的输出数组的末尾。
def heap_sort(arr):n = len(arr)for i in range(n, -1, -1):heapify(arr, n, i)for i in range(n-1, 0, -1):arr[i], arr[0] = arr[0], arr[i]heapify(arr, i, 0)def heapify(arr, n, i):largest = il = 2 * i + 1r = 2 * i + 2if l < n and arr[i] < arr[l]:largest = lif r < n and arr[largest] < arr[r]:largest = rif largest != i:arr[i], arr[largest] = arr[largest], arr[i]heapify(arr, n, largest)
print(heap_sort([3,6,8,10,1,2,1]))
三、搜索算法
3.1 二分搜索
二分搜索是一种从已排序的项目列表中查找项目的有效算法。它的工作原理是将要搜索的数组部分重复分成两半,直到找到目标值。
def binary_search(arr, x):low = 0high = len(arr) - 1mid = 0while low <= high:mid = (high + low) // 2if arr[mid] < x:low = mid + 1elif arr[mid] > x:high = mid - 1else:return midreturn -1 print(binary_search([1,2,3,4,5,6,7], 4))
3.2 哈希表
-
哈希表是一种将键映射到值的数据结构,使用哈希函数计算到桶或槽数组的索引,从中可以找到所需的值。
class HashTable:def __init__(self):self.size = 10self.keys = [None] * self.sizeself.values = [None] * self.sizedef put(self, key, data):index = self.hash_function(key)while self.keys[index] is not None:if self.keys[index] == key:self.values[index] = data # updatereturnindex = (index + 1) % self.sizeself.keys[index] = keyself.values[index] = datadef get(self, key):index = self.hash_function(key)while self.keys[index] is not None:if self.keys[index] == key:return self.values[index]index = (index + 1) % self.sizereturn Nonedef hash_function(self, key):sum = 0for pos in range(len(key)):sum = sum + ord(key[pos])return sum % self.size
t = HashTable()
t.put("apple", 10)
t.put("orange", 20)
t.put("banana", 30)
print(t.get("orange"))
四、图算法
Dijkstra 最短路径算法:Dijkstra 最短路径算法是一种寻找图中节点之间最短路径的算法。
import heapqdef dijkstra(graph, start):heap = [(0, start)]visited = set()while heap:(cost, v) = heapq.heappop(heap)if v not in visited:visited.add(v)for u, c in graph[v].items():if u not in visited:heapq.heappush(heap, (cost + c, u))return visitedgraph = {'A': {'B': 2, 'C': 3},'B': {'D': 4, 'E': 5},'C': {'F': 6},'D': {'G': 7},'E': {'G': 8, 'H': 9},'F': {'H': 10},'G': {},'H': {}
}
print(dijkstra(graph, 'A'))
五、动态规划
斐波那契数列:斐波那契数列是可以使用动态规划解决的问题的经典示例。
def fibonacci(n):if n <= 0:return 0elif n == 1:return 1else:return fibonacci(n-1) + fibonacci(n-2)print(fibonacci(10))
注意:动态规划不止这个,以后专题论述。
六、 贪心算法
霍夫曼编码:霍夫曼编码是一种无损数据压缩算法,它使用贪婪算法为给定的一组符号构造前缀码。
from collections import Counter, namedtupledef huffman_encoding(data):"""Generates a Huffman encoded string of the input data"""# Create a frequency counter for the datafreq_counter = Counter(data)# Create a namedtuple for the Huffman tree nodesHuffmanNode = namedtuple("HuffmanNode", ["char", "freq"])# Create a priority queue for the Huffman treepriority_queue = PriorityQueue()# Add all characters to the priority queuefor char, freq in freq_counter.items():priority_queue.put(HuffmanNode(char, freq))# Combine nodes until only the root node remainswhile priority_queue.qsize() > 1:left_node = priority_queue.get()right_node = priority_queue.get()combined_freq = left_node.freq + right_node.freqcombined_node = HuffmanNode(None, combined_freq)priority_queue.put(combined_node)# Generate the Huffman code for each characterhuffman_code = {}generate_code(priority_queue.get(), "", huffman_code)# Encode the input dataencoded_data = ""for char in data:encoded_data += huffman_code[char]return encoded_data, huffman_code
print(huffman_encoding("aaaaabbbcccc"))
七.分而治之
归并排序:上面已经解释过了
八、回溯
-
N 皇后问题:N 皇后问题是一个可以使用回溯法解决的经典问题。目标是将 N 个皇后放在 NxN 的棋盘上,使得任何皇后都不能攻击任何其他皇后。
def solveNQueens(n):def could_place(row, col):# check if a queen can be placed on board[row][col]# check if this row is not under attack from any previous queen in that columnfor i in range(row):if board[i] == col or abs(board[i] - col) == abs(i - row):return Falsereturn Truedef backtrack(row=0, count=0):for col in range(n):if could_place(row, col):board[row] = colif row + 1 == n:count += 1else:count = backtrack(row + 1, count)return countboard = [-1 for x in range(n)]return backtrack()
print(solveNQueens(4))
该算法开始将皇后放置在第一行,并且对于每个放置的皇后,它检查它是否受到任何先前皇后的攻击。如果不是,它将继续到下一行并重复该过程。如果将皇后置于受到攻击的位置,算法会回溯并尝试不同的位置。这一直持续到所有皇后都被放置在棋盘上且没有任何相互攻击。
九. 随机算法
— 随机快速排序:随机选择主元的快速排序算法的一种变体。
import randomdef randomized_quicksort(arr):if len(arr) <= 1:return arrpivot = random.choice(arr)left = [x for x in arr if x < pivot]middle = [x for x in arr if x == pivot]right = [x for x in arr if x > pivot]return randomized_quicksort(left) + middle + randomized_quicksort(right)print(randomized_quicksort([3,6,8,10,1,2,1]))
这些是每个程序员都应该熟悉的一些最常用的算法。了解这些算法及其实现可以帮助程序员在设计和实现高效解决方案时做出更好的决策。