令人惊艳的六大算法(哈希表、分治算法、动态规划算法、贪心算法、回溯算法、图论算法)

news/2024/11/24 1:44:28/

当谈到计算机科学时,算法是一个重要的话题,因为它们能帮助解决很多问题。有些算法尤其令人惊艳,因为它们不仅高效,而且有着惊人的表现。在这篇文章中,我将分享一些我认为令人惊艳的高效算法。

一、哈希表

哈希表是一种使用哈希函数实现的数据结构,它能够提供常量级的插入、删除和查找操作。哈希表的查找速度非常快,这主要是因为它能够快速计算出需要查找的元素在表中的位置,从而省去了大量的比较操作。

哈希表的实际应用非常广泛。例如,在编写Web应用程序时,哈希表通常用于缓存数据,从而避免在数据库中频繁地读取数据。另外,在面试时,哈希表也是经常被考察的知识点之一。

以下是一个使用Python实现的哈希表的例子:

class HashTable:def __init__(self):self.size = 11self.slots = [None] * self.sizeself.data = [None] * self.sizedef put(self,key,data):hashvalue = self.hashfunction(key,len(self.slots))if self.slots[hashvalue] == None:self.slots[hashvalue] = keyself.data[hashvalue] = dataelse:if self.slots[hashvalue] == key:self.data[hashvalue] = data  # replaceelse:nextslot = self.rehash(hashvalue,len(self.slots))while self.slots[nextslot] != None and \self.slots[nextslot] != key:nextslot = self.rehash(nextslot,len(self.slots))if self.slots[nextslot] == None:self.slots[nextslot]=keyself.data[nextslot]=dataelse:self.data[nextslot] = data #replacedef hashfunction(self,key,size):return key%sizedef rehash(self,oldhash,size):return (oldhash+1)%sizedef get(self,key):startslot = self.hashfunction(key,len(self.slots))data = Nonestop = Falsefound = Falseposition = startslotwhile self.slots[position] != None and  \not found and not stop:if self.slots[position] == key:found = Truedata = self.data[position]else:position=self.rehash(position,len(self.slots))if position == startslot:stop = Truereturn datadef __getitem__(self,key):return self.get(key)def __setitem__(self,key,data):self.put(key,data)

二、分治算法

分治算法依靠分解问题为更小的子问题来求解复杂问题。它的核心思想就是将问题不断分解,直至问题被分解为足够小的子问题,这些子问题容易被解决和合并,从而得到原问题的解。

分治算法非常重要,因为它可以用于解决许多在计算机科学中常见的问题,例如排序、搜索、矩阵乘法、数值计算等。例如,在排序算法中,快速排序就是一个应用了分治算法的高效排序算法。

以下是一个使用Python实现的快速排序算法的例子:

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)

三、动态规划算法

动态规划算法是一种通过将问题分解为子问题来求解复杂问题的算法。动态规划算法通常用于最优化问题,它将一个问题分解为多个子问题,逐步解决每个子问题并将结果合并,最终得到问题的最优解。

动态规划算法的应用非常广泛,例如在图像处理、自然语言处理、机器学习等领域都能看到它的应用。在面试中,动态规划算法也是一个经常被考察的知识点。

以下是一个动态规划算法的例子:

def fibonacci(n):if n == 0:return 0elif n == 1:return 1else:return fibonacci(n-1) + fibonacci(n-2)

然而,上述算法时间复杂度较高,如果要计算较大的斐波那契数列,它的效率会非常低。下面给出一种更高效的动态规划算法实现:

def fibonacci(n):if n == 0:return 0elif n == 1:return 1else:array = [0] * (n+1)array[0] = 0array[1] = 1for i in range(2, n+1):array[i] = array[i-1] + array[i-2]return array[n]

这个算法的时间复杂度为O(n),比前面的递归算法要高效得多。

四、贪心算法

贪心算法是一种在每个阶段选择当前最优解的策略,以期望最终得到全局最优解的算法。贪心算法通常用于组合优化问题,例如在图论、计算几何、网络设计等领域。

以下是一个使用贪心算法的例子,求解背包问题:

def fractional_knapsack(value, weight, capacity):"""Return maximum value of items and their fractional amounts.(max_value, fractions) is returned where max_value is the maximum value ofitems with total weight not more than capacity.fractions is a list where fractions[i] is the fraction that should be takenof item i, where 0 <= i < total number of items.value[i] is the value of item i and weight[i] is the weight of item ifor 0 <= i < n where n is the number of items.capacity is the maximum weight."""index = list(range(len(value)))# contains ratios of values to weightratio = [v/w for v, w in zip(value, weight)]# index is sorted according to value-to-weight ratio in decreasing orderindex.sort(key=lambda i: ratio[i], reverse=True)max_value = 0fractions = [0]*len(value)for i in index:if weight[i] <= capacity:fractions[i] = 1max_value += value[i]capacity -= weight[i]else:fractions[i] = capacity/weight[i]max_value += value[i]*capacity/weight[i]breakreturn max_value, fractions

五、回溯算法

回溯算法是一种递归算法,它尝试在所有可能的路径上搜索解决方案。回溯算法通常用于组合优化问题,例如在图论、计算几何、网络设计等领域。

以下是一个使用回溯算法的例子,求解八皇后问题:

def is_valid(board, row, col, n):# Check row on left sidefor i in range(col):if board[row][i] == 1:return False# Check upper diagonal on left sidefor i, j in zip(range(row, -1, -1), range(col, -1, -1)):if board[i][j] == 1:return False# Check lower diagonal on left sidefor i, j in zip(range(row, n, 1), range(col, -1, -1)):if board[i][j] == 1:return Falsereturn Truedef solve_n_queens(board, col, n, solutions):if col == n:# Add solution to list of solutionssolutions.append([row[:] for row in board])returnfor i in range(n):if is_valid(board, i, col, n):board[i][col] = 1solve_n_queens(board, col+1, n, solutions)board[i][col] = 0def n_queens(n):board = [[0 for x in range(n)] for y in range(n)]solutions = []solve_n_queens(board, 0, n, solutions)return solutions

 

六、图论算法

图论算法是一种研究图的性质和特征的数学分支,也是计算机科学中的一个重要领域。图论算法通常用于网络设计、路由算法、图像处理等领域。

以下是一个使用图论算法的例子,求解最短路径问题:

import heapqdef dijkstra(graph, start):"""Return shortest path distances from start to all other vertices."""distances = {vertex: float('inf') for vertex in graph}distances[start] = 0pq = [(0, start)]while pq:current_distance, current_vertex = heapq.heappop(pq)# Ignore if we have already found a shorter pathif current_distance > distances[current_vertex]:continuefor neighbor, weight in graph[current_vertex].items():distance = current_distance + weightif distance < distances[neighbor]:distances[neighbor] = distanceheapq.heappush(pq, (distance, neighbor))return distances

以上是六种常用的算法及其应用,当然还有很多其他的算法,例如KMP算法、哈希算法、蒙特卡罗算法等等。掌握这些算法并能够熟练应用它们,对于程序员来说是非常重要的。


http://www.ppmy.cn/news/115610.html

相关文章

HTC的Jetstream - 明智的平板电脑很好的HTC Sense UI和4G

HTC的Jetstream - 明智的平板电脑很好的HTC Sense UI和4G&#xff08;LTE&#xff09; HTC已经推出了新一代的平板电脑是HTC的Jetstream&#xff08;宏达电普契尼&#xff09;在2011年9月5日约850美元通过AT&#xff06;T在美国运营商的成本。该服务提供商表示&#xff0c;宏达…

HTC Vive安装详细流程

近日一项调查表明&#xff0c;HTC Vive的销量已达10万&#xff0c;这是一个相当惊人的数字&#xff0c;这也表示HTC Vive成为最受欢迎的VR头显&#xff0c;想不到HTC在手机领域被三星&#xff0c;苹果挤压出局后&#xff0c;在VR领域重新找回了自己的位置&#xff0c;其定位高端…

HTC硬件介绍

HTC VIVE 主要部件包括一个头盔、两副手柄、两个基站。体验者可以在一个小范围的空间中行走&#xff0c;体验制作好的内容。 头盔&#xff1a; 前置面板有很多红外线传感器&#xff0c;配合基站跟踪到头盔的位置。有摄像头&#xff0c;在开发VR时用不到&#xff0c;但在开发AR时…

WindowsMobile6之“HTC Touch” - iphone的强大竞争对手

(本文系葛涵涛原创&#xff0c;转载请标明出处http://blog.csdn.net/gehantao/archive/2007/06/10/1646219.aspx&#xff0c;谢谢) 全球最大的Windows Mobile系统智能手机制造商宏达电HTC公司开始从幕后进向前台。除了一系列的收购和品牌整合规划等举措之外&#xff0c;在新品…

HTC Vive安装及如何连接电脑详细教程(全程图解)

在市场上的诸多VR产品当中&#xff0c;htc Vive无疑是体验最佳的设备之一&#xff0c;不过在享受高端硬件带来美妙沉浸感之前&#xff0c;必须要经过一段略微复杂的“手续”&#xff0c;以下是HTC Vive安装详细教程。 在安装之前首先要确认下你的Vive附带了下列物品。 ■设置部…

AWS部署网站

中国区的一些特殊情况&#xff0c;在此使用 S3 CloudFront 需要一些不同于 Global 的额外配置 中国区部署 Web 前端到 S3 和 Cloudfront | 亚马逊AWS官方博客 在中国使用 Amazon S3 托管静态网站的最佳实践 | 亚马逊AWS官方博客 教程&#xff1a;使用在 Route 53 中注册的自定…

【赏】C语言迷宫游戏设计如何解决屏幕严重刷屏问题同时实现运行时间的显示

要解决屏幕严重刷屏问题,可以参考以下方法: 在每次刷新前清空屏幕,使用system("cls")命令来实现清屏。 只在需要更新的地方进行刷新,而不是整个屏幕都重新绘制。在此代码中,只需要在用户输入移动指令后更新电子鼠的位置即可,不用每次循环都重新画整个迷宫。同时…

【每日一题Day223】LC1130叶值的最小代价生成树 | 贪心 区间dp

叶值的最小代价生成树【LC1130】 给你一个正整数数组 arr&#xff0c;考虑所有满足以下条件的二叉树&#xff1a; 每个节点都有 0 个或是 2 个子节点。数组 arr 中的值与树的中序遍历中每个叶节点的值一一对应。每个非叶节点的值等于其左子树和右子树中叶节点的最大值的乘积。 …