数据结构与算法-分治算法
数据结构与算法
数据结构与算法是计算机科学中的两个核心概念,它们在软件开发和问题解决中起着至关重要的作用。
数据结构
数据结构是计算机中存储、组织和管理数据的方式,它能够帮助我们高效地访问和修改数据。不同的数据结构适用于不同类型的应用场景。
常见的数据结构包括:
- 数组:一种线性数据结构,用于存储具有相同类型的元素集合,每个元素在内存中占据连续的位置。
- 链表:由节点组成的线性数据结构,每个节点包含数据和指向下一个节点的指针。
- 栈:一种后进先出(LIFO)的数据结构,常用于管理函数调用、表达式求值等。
- 队列:一种先进先出(FIFO)的数据结构,适用于任务调度、缓冲处理等场景。
- 树:一种分层数据结构,由节点组成,每个节点可以有零个或多个子节点。
- 图:由顶点(节点)和边组成,可以表示多对多的关系,适用于网络分析、路径查找等。
算法
算法是解决特定问题的一系列步骤和规则。算法的性能通常通过时间复杂度和空间复杂度来衡量。算法的设计和选择对程序的效率有很大影响。
常见的算法类型包括:
- 排序算法:如快速排序、归并排序、堆排序等,用于将数据集合按特定顺序排列。
- 搜索算法:如二分搜索、深度优先搜索(DFS)、广度优先搜索(BFS)等,用于在数据结构中查找特定元素。
- 图算法:如Dijkstra算法、A*搜索算法、Prim算法和Kruskal算法等,用于解决图中的最短路径、最小生成树等问题。
- 动态规划:一种通过将问题分解为重叠的子问题来解决问题的方法,适用于具有最优子结构特性的问题。
- 分治算法:将问题分解为若干个规模较小的子问题,递归解决子问题后合并结果,适用于某些特定类型的优化问题。
分治算法
分治算法是一种处理复杂问题的方法,它的核心思想是将一个大问题分解成若干个规模较小但类似于原问题的子问题,递归或迭代地解决这些子问题,然后将子问题的解合并以得到原问题的解。这种方法的关键在于“分”和“治”两个步骤:分是将问题分解,治是独立解决分解后的小问题。
分治算法通常适用于解决那些可以通过重复应用相同解决方案的问题,例如数组排序、矩阵乘法、快速幂计算等。
- 分治算法示意图
+-------------------+ +-------------------+ +-------------------+
| | | | | |
| 原问题(n个元素) | | 子问题1(n/2个元素) | | 子问题2(n/2个元素) |
| | | | | |
+-------------------+ +-------------------+ +-------------------+| | |v v v
+-------------------+ +-------------------+ +-------------------+
| | | | | |
| 子问题1继续分解 | | 子问题1继续分解 | | 子问题2继续分解 |
| (n/4个元素) | | (n/4个元素) | | (n/4个元素) |
| | | | | |
+-------------------+ +-------------------+ +-------------------+| | |v v v
+-------------------+ +-------------------+ +-------------------+
| | | | | |
| 最小子问题(1个元素) | | 最小子问题(1个元素) | | 最小子问题(1个元素) |
| | | | | |
+-------------------+ +-------------------+ +-------------------+| | |+------------+------------+ +------------+------------+合并操作 合并操作 合并操作
分治算法特点
- 分解:将原问题分解为若干个规模较小的相同类型的问题。
- 独立解决:递归或迭代地独立解决每个子问题。
- 合并:将子问题的解合并,形成原问题的解。
应用实例
- 归并排序(Merge Sort):一种分稳算法,将无序数组分为两半,递归地对两半进行排序,然后将排序好的两半合并成一个有序数组。
- 快速排序(Quick Sort):通过选定一个基准元素,将数组分为两部分,一部分包含所有小于基准的元素,另一部分包含所有大于基准的元素,然后递归地对这两部分进行快速排序。
- 快速幂算法(Fast Exponentiation):用于计算一个数的幂,通过将幂指数分解为若干个更小的幂指数,然后逐个计算并合并结果。
- 二分查找(Binary Search):在有序数组中查找特定元素,通过将数组分为两半并比较中间元素与目标值,逐步缩小搜索范围。
- Strassen矩阵乘法:一种矩阵乘法算法,通过分解和合并操作,减少了计算量,提高了计算效率。
注意事项
- 分治算法可能不适用于所有问题,需要确保问题可以被分解为独立的子问题,并且子问题的解可以容易地合并。
- 分治算法可能会引入额外的开销,如递归调用和数据复制,因此在某些情况下可能不是最优选择。
- 需要仔细设计分解和合并策略,以确保算法的效率和正确性。
分治算法c++示例
- 归并排序:归并排序的时间复杂度为 O(n log n),其中 n 是数组的大小。这种算法的优势在于其稳定性,即相等的元素在排序后保持原来的相对顺序。
#include <iostream>
#include <vector>// 合并两个有序数组
void merge(std::vector<int>& arr, int left, int mid, int right) {int n1 = mid - left + 1; // 左半部分的大小int n2 = right - mid; // 右半部分的大小// 创建临时数组std::vector<int> L(n1), R(n2);// 拷贝数据到临时数组for (int i = 0; i < n1; i++)L[i] = arr[left + i];for (int j = 0; j < n2; j++)R[j] = arr[mid + 1 + j];// 合并临时数组回原数组int i = 0, j = 0, k = left;while (i < n1 && j < n2) {if (L[i] <= R[j]) {arr[k] = L[i];i++;} else {arr[k] = R[j];j++;}k++;}// 拷贝剩余的左半部分元素while (i < n1) {arr[k] = L[i];i++;k++;}// 拷贝剩余的右半部分元素while (j < n2) {arr[k] = R[j];j++;k++;}
}// 归并排序的递归函数
void mergeSort(std::vector<int>& arr, int left, int right) {if (left < right) {// 找到中间位置int mid = left + (right - left) / 2;// 递归地对左右两部分进行排序mergeSort(arr, left, mid);mergeSort(arr, mid + 1, right);// 合并已排序的左右两部分merge(arr, left, mid, right);}
}// 打印数组的函数
void printArray(const std::vector<int>& arr) {for (int num : arr) {std::cout << num << " ";}std::cout << std::endl;
}// 主函数
int main() {std::vector<int> arr = {12, 11, 13, 5, 6, 7};std::cout << "Given array is \n";printArray(arr);mergeSort(arr, 0, arr.size() - 1);std::cout << "Sorted array is \n";printArray(arr);return 0;
}
- 二分查找:二分查找的时间复杂度为 O(log n),其中 n 是数组的大小。这种算法在处理大数据集时非常高效,尤其是在有序数据集上查找元素时。
#include <iostream>
#include <vector>// 二分查找函数
int binarySearch(const std::vector<int>& arr, int left, int right, int target) {while (left <= right) {// 计算中间位置的索引int mid = left + (right - left) / 2;// 如果找到目标值,返回索引if (arr[mid] == target) {return mid;}// 如果目标值小于中间元素,更新右边界else if (target < arr[mid]) {right = mid - 1;}// 如果目标值大于中间元素,更新左边界else {left = mid + 1;}}// 如果没有找到目标值,返回-1return -1;
}// 主函数
int main() {std::vector<int> arr = {2, 3, 4, 10, 40};int target = 10;// 调用二分查找函数int resultIndex = binarySearch(arr, 0, arr.size() - 1, target);// 输出结果if (resultIndex != -1) {std::cout << "Element found at index " << resultIndex << std::endl;} else {std::cout << "Element not found in the array." << std::endl;}return 0;
}
相关文章:
数据结构与算法-分治算法
数据结构与算法 数据结构与算法是计算机科学中的两个核心概念,它们在软件开发和问题解决中起着至关重要的作用。 数据结构 数据结构是计算机中存储、组织和管理数据的方式,它能够帮助我们高效地访问和修改数据。不同的数据结构适用于不同类型的应用场…...
MNN详细介绍、安装和编译
目录 第一章:MNN简介 1.1、MNN概述 1.2、MNN特点 1.3、MNN在移动端的应用优势 第二章:MNN安装与配置 2.1、环境准备 2.2、下载与编译 第三章:MNN使用指南 3.1、模型转换与部署 3.2、推理示例 第四章:MNN高级应用与优化技巧...
uniapp-Form示例(uviewPlus)
示例说明 Vue版本:vue3 组件:uviewPlus(Form 表单 | uview-plus 3.0 - 全面兼容nvue的uni-app生态框架 - uni-app UI框架) 说明:表单组建、表单验证、提交验证等; 截图: 示例代码 <templat…...
【Linux】详解进程程序替换
一、替换原理 用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执…...
vue中使用jsmind生成脑图
项目部分参数: vue:2.6.10 node:16.20.0 1、使用命令行安装jsmind: npm i jsmind -S 2、在文件中引入jsmind,并编写渲染jsmind的代码:: <template><!-- jsmind容器 --><divid"jsmi…...
yarn按包的时候报错 ../../../package.json: No license field
运行 yarn config list 然后运行 yarn config set strict-ssl false 之后yarn就成功了...
【Python从入门到进阶】51、电影天堂网站多页面下载实战
接上篇《50、当当网Scrapy项目实战(三)》 上一篇我们讲解了使用Scrapy框架在当当网抓取多页书籍数据的效果,本篇我们来抓取电影天堂网站的数据,同样采用Scrapy框架多页面下载的模式来实现。 一、抓取需求 打开电影天堂网站&…...
苹果CMS影视APP源码,二开版本带视频教程
编译app教程 工具下载:Android Studio 官网地址:https://developer.android.google.cn/studio/ 环境设置: 设置中文:https://blog.csdn.net/qq_37131111/article/details/131492844 汉化包找最新的下载就行了,随便下载…...
Zigbee技术在智能农业领域的应用研究
Zigbee技术在智能农业领域的应用研究 **摘要:**随着现代信息技术的飞速发展,智能农业已成为当今农业发展的新趋势。Zigbee技术作为一种低功耗、低成本的无线通信技术,在智能农业领域具有广泛的应用前景。本文深入分析了Zigbee技术的原理和特…...
Spring Cloud Gateway 中GET请求能正常访问,POST请求出现Unable to handle DataBuffer
报错信息如下: java.lang.IllegalArgumentException: Unable to handle DataBuffer of type class org.springframework.http.server.reactive.UndertowServerHttpRequest$UndertowDataBufferat org.springframework.cloud.gateway.filter.NettyRoutingFilter.getB…...
什么是git? 初步认识git 如何使用git
Git是什么? Git 是分布式版本控制系统,可以有效,高速地处理从很小到非常大地项目版本管理,分布式相比于集中式的最大区别在于开发者可以提交到本地,每个开发者可以通过克隆,在本地机器上拷贝一个完整的Git …...
Douyin视频详情数据API接口(视频详情,评论)
抖音官方并没有直接提供公开的视频详情数据采集API接口给普通用户或第三方开发者。抖音的数据采集通常受到严格的限制,以保护用户隐私和平台安全。 请求示例,API接口接入Anzexi58 如果您需要获取抖音视频详情数据,包括评论、点赞等ÿ…...
MySQL 索引:索引为什么使用 B+树?
Hash 索引不支持顺序和范围查询; 二叉查找树(BST):解决了排序的问题,极端情况下可能会退化成线性链表,查询效率急剧下降; 平衡二叉树(AVL) :通过旋转解决了平衡的问题,但是旋转操作效率太低&am…...
2024年第四届天府杯全国大学生数学建模竞赛B题思路
B题:新质生产力引领下的企业生产与发展策略优化 问题背景 随着技术的飞速发展,新质生产力如人工智能、大数据分析、物联网等技术被广泛应用于生产和服务过程中,极大地提高了生产效率和产品质量,改变了传统的生产与经营模式。一家…...
c++部分题
const关键字与宏定义的区别是什么? const关键字和宏定义在功能上有相似之处,但在实现和使用上有很大的区别。 作用域和类型安全性: const关键字定义的常量具有作用域和类型安全性。它们的作用域仅限于声明它们的块,并且在编译时会…...
验证回文串
如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字母和数字都属于字母数字字符。 给定一个字符串 s,如果它是 回文串 ,返回 true ;否则&#…...
vue2高德地图选点
<template><el-dialog :title"!dataForm.id ? 新建 : isDetail ? 详情 : 编辑" :close-on-click-modal"false" :visible.sync"show" class"rv-dialog rv-dialog_center" lock-scroll width"74%" :before-close&q…...
Gitflow:一种依据 Git 构建的分支管理工作流程模式
文章目录 前言Gitflow 背景Gitflow 中的分支模型Gitflow 的版本号管理简单模拟 Gitflow 工作流 前言 Gitflow 工作流是一种版本控制流程,主要适用于较大规模的团队。这个流程在团队中进行合作时可以避免冲突,并能快速地完成项目,因此在很多软…...
利用云手机技术,开拓海外社交市场
近年来,随着科技的不断进步,云手机技术逐渐在海外社交营销领域崭露头角。其灵活性、成本效益和全球性特征使其成为海外社交营销的利器。那么,究竟云手机在海外社交营销中扮演了怎样的角色呢? 首先,云手机技术能够消除地…...
脚本实现Ubuntu设置屏幕无人操作,自动黑屏
使用 xrandr 命令可以实现对屏幕的控制,包括调整分辨率、旋转屏幕以及关闭屏幕等。要实现 Ubuntu 设置屏幕在无人操作一段时间后自动黑屏,非待机,并黑屏后点击触摸屏可以唤醒屏幕,可以借助 xrandr 命令来实现。 首先,…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...
解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...
Python竞赛环境搭建全攻略
Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型(算法、数据分析、机器学习等)不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...
【堆垛策略】设计方法
堆垛策略的设计是积木堆叠系统的核心,直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法,涵盖基础规则、优化算法和容错机制: 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则: 大尺寸/重量积木在下…...
