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

news2024/12/22 19:19:01

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

一、哈希表

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

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

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

class HashTable:
    def __init__(self):
        self.size = 11
        self.slots = [None] * self.size
        self.data = [None] * self.size

    def put(self,key,data):
        hashvalue = self.hashfunction(key,len(self.slots))

        if self.slots[hashvalue] == None:
            self.slots[hashvalue] = key
            self.data[hashvalue] = data
        else:
            if self.slots[hashvalue] == key:
                self.data[hashvalue] = data  # replace
            else:
                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]=key
                    self.data[nextslot]=data
                else:
                    self.data[nextslot] = data #replace

    def hashfunction(self,key,size):
         return key%size

    def rehash(self,oldhash,size):
        return (oldhash+1)%size

    def get(self,key):
        startslot = self.hashfunction(key,len(self.slots))

        data = None
        stop = False
        found = False
        position = startslot
        while self.slots[position] != None and  \
                       not found and not stop:
            if self.slots[position] == key:
                found = True
                data = self.data[position]
            else:
                position=self.rehash(position,len(self.slots))
                if position == startslot:
                    stop = True
        return data

    def __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 arr
    pivot = 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 0
    elif n == 1:
        return 1
    else:
        return fibonacci(n-1) + fibonacci(n-2)

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

def fibonacci(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        array = [0] * (n+1)
        array[0] = 0
        array[1] = 1
        for 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 of
    items with total weight not more than capacity.
    fractions is a list where fractions[i] is the fraction that should be taken
    of 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 i
    for 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 weight
    ratio = [v/w for v, w in zip(value, weight)]
    # index is sorted according to value-to-weight ratio in decreasing order
    index.sort(key=lambda i: ratio[i], reverse=True)
 
    max_value = 0
    fractions = [0]*len(value)
    for i in index:
        if weight[i] <= capacity:
            fractions[i] = 1
            max_value += value[i]
            capacity -= weight[i]
        else:
            fractions[i] = capacity/weight[i]
            max_value += value[i]*capacity/weight[i]
            break
 
    return max_value, fractions

五、回溯算法

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

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

def is_valid(board, row, col, n):
    # Check row on left side
    for i in range(col):
        if board[row][i] == 1:
            return False
 
    # Check upper diagonal on left side
    for i, j in zip(range(row, -1, -1), range(col, -1, -1)):
        if board[i][j] == 1:
            return False
 
    # Check lower diagonal on left side
    for i, j in zip(range(row, n, 1), range(col, -1, -1)):
        if board[i][j] == 1:
            return False
 
    return True
 
 
def solve_n_queens(board, col, n, solutions):
    if col == n:
        # Add solution to list of solutions
        solutions.append([row[:] for row in board])
        return
 
    for i in range(n):
        if is_valid(board, i, col, n):
            board[i][col] = 1
            solve_n_queens(board, col+1, n, solutions)
            board[i][col] = 0
 
 
def 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 heapq
 
 
def dijkstra(graph, start):
    """Return shortest path distances from start to all other vertices."""
    distances = {vertex: float('inf') for vertex in graph}
    distances[start] = 0
 
    pq = [(0, start)]
    while pq:
        current_distance, current_vertex = heapq.heappop(pq)
 
        # Ignore if we have already found a shorter path
        if current_distance > distances[current_vertex]:
            continue
 
        for neighbor, weight in graph[current_vertex].items():
            distance = current_distance + weight
            if distance < distances[neighbor]:
                distances[neighbor] = distance
                heapq.heappush(pq, (distance, neighbor))
 
    return distances

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/592049.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通用寄存器-汇编复习(1)

弄清寄存器表达,原理和配件及汇编实验验证。 往期文章: 汇编语言基础-汇编复习(0)_luozhonghua2000的博客-CSDN博客 一个典型的 CPU(此处讨论的不是某一具体的 CPU)由运算器、控制器、寄存器(CPU工作原理)等器件构成,这些器件靠内部总线相连。前一章所说的总线,相对于 CP…

4、USB协议学习:USB的数据包结构

文章目录 数据包结构包(Packet)PID令牌包SETUP&OUT&IN令牌包SOF令牌包 数据包握手包ACK 握手包NAK 握手包 事务(Transaction)Setup事务OUT事务IN事务 传输(Transfer)控制传输中断传输批量传输同步传输/等时传输 端点 数据包结构 USB的通讯数据由多个传输组成&#xff0…

Docker 构建多架构 ARM、x86 AMD image镜像

在当今的计算环境中&#xff0c;各种异构计算设备和平台层出不穷&#xff0c;如何保证应用程序能够在不同的平台和设备上顺利运行&#xff0c;已成为亟待解决的问题。 以一款应用程序为例&#xff0c;它可能需要在 ARM、x86 或 s390x 等不同架构的设备上运行。由于这些设备所使…

Linux—实操篇:关机,重启和用户登录注销

1、关机和重启命令 1.1、基本介绍 shutdown -h now 立即关机 shutdown -h 1 一分钟后关机 shutdown -r now 立即重启 halt 立即关机&#xff0c;作用和上面一样 reboot 立即重启 sync 把内存数据同步到磁盘 注意&#xff1a;仅输入shutdown 默认执行&#xff08;shutdow…

Go开发学习 | 如何快速读取json/yaml/ini等格式的配置文件使用示例

欢迎关注「全栈工程师修炼指南」公众号 点击 &#x1f447; 下方卡片 即可关注我哟! 设为「星标⭐」每天带你 基础入门 到 进阶实践 再到 放弃学习&#xff01; “ 花开堪折直须折&#xff0c;莫待无花空折枝。 ” 作者主页&#xff1a;[ https://www.weiyigeek.top ] 博客&…

docker 数据持久化

目录 一、将本地目录直接映射到容器里&#xff08;运行成容器时候进行映射&#xff09; 二、数据卷模式 1、创建数据卷 2、查看数据卷列表&#xff0c;有哪些数据卷 3、查看某个数据卷 4、容器目录挂载到数据卷 5、数据卷的优势&#xff1a;多个容器共享一个数据卷 默认…

元宇宙应用领域-教育

教育是一个国家发展的基础&#xff0c;在科技发展的时代&#xff0c;元宇宙将会帮助教育行业实现跨越式发展。 元宇宙与教育的结合将会对传统的教学模式带来翻天覆地的变化。它能将线上教学、线下体验、远程互动等优势集于一身&#xff0c;也能把教师从繁重的重复劳动中解放出…

贝叶斯伪标签:鲁棒高效半监督分割的期望最大化

文章目录 Bayesian Pseudo Labels: Expectation Maximization for Robust and Efficient Semi-supervised Segmentation摘要作为期望最大化的伪标签基于变分推理的伪标签的推广实验结果 Bayesian Pseudo Labels: Expectation Maximization for Robust and Efficient Semi-super…

Qt上位机开发-学习记录(一)

一、Qt的安装 下载Qt : https://download.qt.io/ 进入archive/qt/&#xff0c;目前5.14版本下&#xff0c;有直接exe安装的版本&#xff0c;就直接下载 qt-opensource-windows-x86-5.14.2.exe安装Qt : 默认安装&#xff0c;过程中可以先全选 二、新建项目 选择Appliation-&g…

静态代码块、动态代码块、构造方法

类与对象 类&#xff1a;描述事物属性和行为 属性&#xff1a;私有化 行为&#xff1a;公开化 对象&#xff1a;就是类的一个具体实例 代码块&#xff1a; 静态代码块 发生在创建对象之前--时机 随着类的加载而加载 构造代码块 发生在创建对象之前&a…

解决小程序富文本显示视频问题

目录 1. 首先用小程序原生的 rich-text 肯定是不行的&#xff0c;它video的HTML节点和属性都不支持的 2. 采用安装插件的方法去处理&#xff08;强烈推荐&#xff1a;mp-html&#xff0c;可用于多端&#xff09; 3. 引入 4. 使用 5. 效果 1. 首先用小程序原生的 rich-text…

NLP实战:中文文本分类-Pytorch实现

目录 一、准备工作 1.任务说明 2.加载数据 二、数据预处理 1.构建词典 2.生成数据批次和迭代器 三、模型构建 1. 搭建模型 2.初始化模型 3. 定义训练与评估函数 四、训练模型 1. 拆分数据集并运行模型 顺便测试指定数据 五、总结 &#x1f368; 本文为[&#x1f517…

Benewake(北醒) 快速实现TF03-CAN与电脑通信操作说明

目录 一、前言二、工具准备三、连接方式3.1 串口通信连接方式3.2 CAN 通信连接方式 四、TF03 与电脑通信操作说明4.1 切换为CAN通信4.2 安装 USB_CAN TOOL 驱动4.3 CAN 通信下修改波特率 五、常见问题反馈5.1 V9.11 USB-CAN tool按照上述方案发送文件指令不成功的解决方案 一、…

跨平台开发的优势:ReactNative与小程序容器技术

结合React Native和小程序容器技术&#xff0c;开发者可以通过热重载和快速迭代提高开发效率&#xff0c;并实现统一的代码和逻辑&#xff0c;简化维护和升级过程。这种技术应用价值使得开发者能够更灵活地构建跨平台应用程序&#xff0c;并充分利用多个生态系统的优势。 Reac…

设计模式之~模板方法模式

定义&#xff1a; 定义一个操作中的算法的骨架&#xff0c;而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 &#xff08;算法的骨架&#xff0c;可以理解为你根据需求设计出来的业务流程&#xff1b; 特定的步骤就是指那…

Ubuntu 17.04 壁纸设计大赛 已经开幕

导读Ubuntu 团队成员 Nathan Haines 向外媒 Softpedia 知会了一场全新的“Free Culture Showcase”活动 —— 为即将到来的 Ubuntu 17.04&#xff08;Zesty Zapus&#xff09;操作系统征集壁纸。 需要指出的是&#xff0c;这场壁纸设计大赛并不会有任何奖励。但如果你的作品有…

驱动开发:内核解析PE结构导出表

在笔者的上一篇文章《驱动开发&#xff1a;内核特征码扫描PE代码段》中LyShark带大家通过封装好的LySharkToolsUtilKernelBase函数实现了动态获取内核模块基址&#xff0c;并通过ntimage.h头文件中提供的系列函数解析了指定内核模块的PE节表参数&#xff0c;本章将继续延申这个…

怎么将Windows操作系统从物理机迁移到虚拟机?

“我的服务器上安装了Windows Server 2003。我真的很想通过VMWare EXSi作为虚拟机运行它&#xff0c;但我不知道必须重新配置整个过程。有没有一种相对轻松的方式移动到虚拟机&#xff1f;它将保持在具有完全相同硬件的同一个盒子上......没有任何变化。” 像这个用户一样&…

书中隐藏的 SQL 开窗函数秘密,ChatGPT 找到了

平时写出这份 T-SQL 的开窗函数脚本&#xff0c;大多数开发者都会引以为傲了&#xff1a; SELECT empid, ordermonth, qty, SUM(qty) OVER (PARTITION BY empid ORDER BY ordermonth ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS run_sum_qty, AVG(qty) OVER (PARTIT…

当Windows里运行spark程序长时间不报错也不出结果(如何将scala程序打包放在虚拟机里运行)

当Windows里运行spark程序长时间不报错也不出结果 Windows内存不足也可能导致Spark程序长时间没有报错也没有输出结果的情况。Spark在处理大规模数据时需要大量的内存&#xff0c;如果可用内存不足&#xff0c;可能会导致程序运行缓慢或无法完成任务。 要确认内存是否是问题所…