算法-分治

分治的基本概念

把一个任务,分成形式和原任务相同,但规模更小的几个部分任务(通常是两个部分),分别完成,或只 需要选一部完成。然后再处理完成后的这一个或几个 部分的结果,实现整个任务的完成。

称假币

16硬币,有可能有1枚假币,假币比真币轻。有一架天 平,用最少称量次数确定有没有假币,若有的话,假 币是哪一枚。

  • 8 – 8 一称,发现无假币,或假币所在的那8枚
  • 4 – 4 一称
  • 2 – 2 一称
  • 1 – 1 一称
  • 数组排序任务可以如下完成:
    • 1把前一半排序
    • 2 把后一半排序
    • 3 把两半归并到一个新的有序数组,然后再拷贝回原数组,排序完成。
#include <iostream>
using namespace std;
int a[10]={ 13,27,19,2,8,12,2,8,30,89};
int b[10];
// 合并两个有序数组
void Merage(int a[],int s,int m,int e,int tem[]){int pb=0;int p1=s;int p2=m+1;// 将两个有序数组合并成一个有序数组while(p1<=m&&p2<=e){if(a[p1]<a[p2])tem[pb++]=a[p1++];else tem[pb++]=a[p2++];}// 将剩余的元素添加到合并后的数组中while(p1<=m)tem[pb++]=a[p1++];while(p2<=e)tem[pb++]=a[p2++];// 将合并后的数组复制回原数组for(int i=0;i<e-s+1;i++)a[s+i]=tem[i];}
// 归并排序
void MerageSort(int a[],int s,int e,int tem[]){if(s<e){int m=s+(e-s)/2;// 递归地将数组分成两部分进行排序MerageSort(a,s,m,tem);MerageSort(a,m+1,e,tem);// 合并两个有序数组Merage(a,s,m,e,tem);}}
int main(){int size=sizeof(a)/sizeof(int);// 对数组进行排序MerageSort(a,0,size-1,b);// 输出排序后的数组for(int i=0;i<size;i++){cout<<a[i]<<",";}return 0;
}

2,2,8,8,12,13,19,27,30,89

归并排序的时间复杂度

对n个元素进行排序的时间:

T(n) = 2*T(n/2) + a*n = 2*(2*T(n/4)+a*n/2)+a*n

                                  = 4*T(n/4)+2a*n

                                  = 4*(2*T(n/8)+a*n/4)+2*a*n

                                  = 8*T(n/8)+3*a*n ...

                                 = 2k *T(n/2k)+k*a*n

一直做到 n/2k = 1 (此时 k = log2n),

T(n)= 2k *T(1)+k*a*n = 2k *T(1)+k*a*n = 2k+k*a*n

                                = n+a*(log2n)*n 14

复杂度O(nlogn)


快速排序

数组排序任务可以如下完成:

  • 1设k=a[0], 将k挪到适当位置,使得比k小的元素都 在k左边,比k大的元素都在k右边,和k相等的,不关心 在k左右出现均可(O(n)时间完成)
  • 2把k左边的部分快速排序
  • 3把k右边的部分快速排序
#include <iostream>
using namespace std;
int a[] = { 93,27,30,2,8,12,2,8,30,89};
// 交换两个元素的值
void swap(int &a, int &b){int temp = a;a = b;b = temp;
}
// 快速排序函数
void quicksort(int a[], int s,int e){// 如果数组长度小于等于1,则直接返回if(e<=s){return;}// 选择第一个元素作为基准值int k=a[s];int i = s;int j=e;// 从数组的两端开始比较while(i!=j){// 从右向左找到第一个小于基准值的元素while(a[j]>=k&&i<j)j--;// 交换两个元素的位置swap(a[i],a[j]);// 从左向右找到第一个大于基准值的元素while(a[i]<=k&&i<j)i++;// 交换两个元素的位置swap(a[i],a[j]);}// 递归调用快速排序函数,对基准值左边的数组进行排序quicksort(a,s,i-1);// 递归调用快速排序函数,对基准值右边的数组进行排序quicksort(a,i+1,e);}
int main(){// 计算数组的大小int size= sizeof(a)/sizeof(int);// 调用快速排序函数quicksort(a,0,size-1);// 输出排序后的数组for(int i=0;i<size;i++)cout<<a[i]<<" ";cout<<endl;return 0;
}

2 2 8 8 12 27 30 30 89 93


输出前m大的数

描述

        给定一个数组包含n个元素,统计前m大的数并且把这m个数从大到小 输出。

输入

        第一行包含一个整数n,表示数组的大小。n < 100000。 第二行包含n个整数,表示数组的元素,整数之间以一个空格分开 。每个整数的绝对值不超过100000000。 第三行包含一个整数m。m< n。

输出

         从大到小输出前m大的数,每个数一行。

排序后再输出,复杂度O(nlogn)

用分治处理:复杂度O(n+mlogm)

思路:

        把前m大的都弄到数组最右边,然后对这最右边m个元素排序, 再输出

关键 :

        O(n)时间内实现把前m大的都弄到数组最右

引入操作 arrangeRight(k): 把数组(或数组的一部分)前k大的 都弄到最右边

如何将前k大的都弄到最右边        

  • 1设key=a[0], 将key挪到适当位置,使得比key小的元素都在 key左边,比key大的元素都在key右边(线性时间完成)

2选择数组的前部或后部再进行arrangeRight操作

#include <iostream>
#include <vector>
#include <algorithm>using namespace std;// 辅助函数:arrangeRight(k)
// 将数组的前k个元素移动到数组的右边
void arrangeRight(vector<int>& arr, int k) {int n = arr.size();nth_element(arr.begin(), arr.begin() + k, arr.end());rotate(arr.begin(), arr.begin() + k, arr.end());
}int main() {int n, m;cin >> n;vector<int> arr(n);for (int i = 0; i < n; ++i) {cin >> arr[i];}cin >> m;// 将前m大的数移动到数组的最右边arrangeRight(arr, n - m);// 输出前m大的数,从大到小for (int i = n - m; i < n; ++i) {cout << arr[i] << endl;}return 0;
}

求排列的逆序数

考虑1,2,…,n (n ik, 那么就称(ij,ik)是这个排列的一个逆序。

一个排列含有逆序的个数称为这个排列的逆序数。例如排列263451 含有8个 逆序(2,1),(6,3),(6,4),(6,5),(6,1),(3,1),(4,1),(5,1),因此该排列的逆序数就是8。

左半边和右半边都是排好序的。比如,都是从大到小排序的。这 样,左右半边只需要从头到尾各扫一遍,就可以找出由两边各取一个数构成的 逆序个数。

#include <iostream>
#include <vector>using namespace std;// 辅助函数:合并两个有序数组并统计逆序数
int merge(vector<int>& nums, vector<int>& temp, int left, int mid, int right) {int i = left, j = mid + 1, k = left;int inv_count = 0;// 合并两个有序数组while (i <= mid && j <= right) {if (nums[i] <= nums[j]) {temp[k++] = nums[i++];} else {temp[k++] = nums[j++];inv_count += (mid - i + 1); // 统计逆序数}}// 将剩余的元素复制到临时数组while (i <= mid) {temp[k++] = nums[i++];}while (j <= right) {temp[k++] = nums[j++];}// 将临时数组中的元素复制回原数组for (i = left; i <= right; i++) {nums[i] = temp[i];}return inv_count;
}// 辅助函数:使用归并排序统计逆序数
int mergeSort(vector<int>& nums, vector<int>& temp, int left, int right) {int inv_count = 0;if (left < right) {int mid = (left + right) / 2;// 递归排序左半部分和右半部分inv_count += mergeSort(nums, temp, left, mid);inv_count += mergeSort(nums, temp, mid + 1, right);// 合并两个有序部分并统计逆序数inv_count += merge(nums, temp, left, mid, right);}return inv_count;
}// 主函数:计算排列的逆序数
int countInversions(vector<int>& nums) {vector<int> temp(nums.size());return mergeSort(nums, temp, 0, nums.size() - 1);
}int main() {int n;cin >> n;vector<int> nums(n);for (int i = 0; i < n; i++) {cin >> nums[i];}int inversions = countInversions(nums);cout << "number: " << inversions << endl;return 0;
}

5
3 1 2 5 4
number: 3

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JavaEE】Mybatis基础使用注解 增删改查操作

目录 一、配置日志二、传递参数 #{}三、增(Insert)四、返回主键Options五、删&#xff08;Delete&#xff09;六、改&#xff08;Update&#xff09;七、查&#xff08;Select&#xff09; 一、配置日志 我们加上下面的代码在配置文件中&#xff0c;那么我们在日志中就可以看到…

4.2、网络安全体系与建设内容

目录 网络安全体系架构网络安全组织安全管理网络安全等级保护2.0等保项目流程等保标准变化等保2.0新增内容等保2.0变化智慧城市安全体系应用参考智能交通网络安全体系应用参考 网络安全体系架构 建设网络安全&#xff0c;要体系化&#xff0c;要从一个整体去做考虑&#xff0c…

TCP协议原理

TCP协议原理 本篇介绍 前面已经基本介绍了TCP编程的接口以及基本的步骤&#xff0c;但是并没有其中的原理进行解释。本篇主要聚焦于TCP原理部分&#xff0c;对TCP中重要的内容进行解释 TCP协议报格式 基本示意图如下&#xff1a; 下面针对每一个字段的作用进行简要的概括&a…

go中的文件、目录的操作

1.文件的概念 文件是数据源(保存数据的地方)的一种,比如大家经常使用的word文档,txt文件,excel文件等。文件最主要的作用就是保存数据,它既可以保存一张图片,也可以保存视频,声音等。 文件在程序中以流的形式来操作的。 流:数据在数据源(文件)和程序(内存)之间…

electron js node vscode 调试electron

用npm会下到home里面不知道为什么可能是淘宝源的问题 --------------------------------- 安装cnpm&#xff08;可选&#xff09; sudo npm install -g cnpm --registryhttps://registry.npmmirror.com下下来还没办法直接用 sudo find / -name "cnpm"nano ~/.bashr…

深度解析 BPaaS:架构、原则与研发模式探索

在当今复杂多变的业务环境下&#xff0c;软件开发面临着诸多挑战&#xff0c;如何有效地管理业务复杂性并实现系统的可扩展性成为关键。BPaaS应运而生&#xff0c;它作为一种创新的理念和架构模式&#xff0c;改变着企业研发的方式。本文将深入探讨 BPaaS 是什么&#xff0c;以…

大模型架构记录2 【综述-相关代码】

一 简单聊天机器人搭建 1.1 openai调用 import os from openai import OpenAI from dotenv import load_dotenv, find_dotenvload_dotenv() client OpenAI()# 打印所支持的模型 model_lst client.models.list()for model in model_lst:print (model.id)# 调用API接口 comp…

三个print优雅打印datetime模块的“时间密码”

三个模块&三条print()&#xff0c;玩转python时间的上上下下&#xff0c;优雅打印“时间密码”。 笔记模板由python脚本于2025-03-23 22:50:43创建&#xff0c;本篇笔记适合正确研究时间/日期的coder翻阅。 【学习的细节是欢悦的历程】 博客的核心价值&#xff1a;在于输出…

【Android】VehiclePropertyAccess引起CarService崩溃

VehiclePropertyAccess引起CarService崩溃 VehiclePropertyAccess VehiclePropertyAccess属性&#xff0c;用于定义车辆属性的访问权限。权限包括 读&#xff1a;READ&#xff0c;只可以读取&#xff0c;不能写入。 VehiclePropertyAccess:READ写&#xff1a;WRITE&#xf…

深入理解traceroute命令及其原理

traceroute 是一个网络诊断工具&#xff08;Windows上叫tracert&#xff09;&#xff0c;用于显示数据包从本地主机到远程主机经过的路由&#xff08;跳数&#xff09;。它可以帮助您了解数据包在网络中的传输路径&#xff0c;以及每跳的延迟情况。这对于网络故障排除、分析网络…

Playwright + MCP:用AI对话重新定义浏览器自动化,效率提升300%!

一、引言&#xff1a;自动化测试的“瓶颈”与MCP的革新 传统自动化测试依赖开发者手动编写脚本&#xff0c;不仅耗时且容易因页面动态变化失效。例如&#xff0c;一个简单的登录流程可能需要开发者手动定位元素、处理等待逻辑&#xff0c;甚至反复调试超时问题。而MCP&#xf…

JVM 学习前置知识

JVM 学习前置知识 Java 开发环境层次结构解析 下图展示了 Java 开发环境的层级关系及其核心组件&#xff0c;从底层操作系统到上层开发工具&#xff0c;逐步构建完整的开发与运行环境&#xff1a; 1. 操作系统&#xff08;Windows, MacOS, Linux, Solaris&#xff09; 作用&…

【Java/数据结构】队列(Quque)

本博客将介绍队列的相关知识&#xff0c;包括基于数组的普通队列&#xff0c;基于链表的普通队列&#xff0c;基于数组的双端队列&#xff0c;基于链表的双端队列&#xff0c;但不包括优先级队列&#xff08;PriorityQueue&#xff09;&#xff0c;此数据结构将单独发一篇博客&…

深度学习Python编程:从入门到工程实践

第一章 Python语言概述与生态体系 1.3 Python在工业界的应用场景 # 示例:使用FastAPI构建RESTful接口 from fastapi import FastAPI from pydantic import BaseModelapp = FastAPI()class Item(BaseModel):name: strprice: float@app.post("/items/") async def cr…

Flutter 学习之旅 之 flutter 使用 connectivity_plus 进行网路状态监听(断网/网络恢复事件监听)

Flutter 学习之旅 之 flutter 使用 connectivity_plus 进行网路状态监听&#xff08;断网/网络恢复事件监听&#xff09; 目录 Flutter 学习之旅 之 flutter 使用 connectivity_plus 进行网路状态监听&#xff08;断网/网络恢复事件监听&#xff09; 一、简单介绍 二、conne…

matlab的meshgrid

文章目录 一、什么是 meshgrid&#xff1f;二、基本语法三、为什么需要 meshgrid&#xff1f;四、meshgrid 与 ndgrid 的区别 一、什么是 meshgrid&#xff1f; meshgrid 是 MATLAB 中用于生成网格点坐标矩阵的函数&#xff0c;常用于三维绘图&#xff08;如 surf, mesh, cont…

word插入Mathtype公式居中和自动更新

word插入公式自动更新 前提&#xff1a;安装Mathtype 1.word中查看页的宽度 出现如下 2.设置样式 出现这个窗口 给样式随便起个名字 3.修改样式 3.1 设置两个制表位 第二个 3.2 修改公式字体 如下所示 4. 修改公式格式 4.1在word中打开 Mathtype 4.2 修改公式的格式 变成…

用 pytorch 从零开始创建大语言模型(六):对分类进行微调

用 pytorch 从零开始创建大语言模型&#xff08;六&#xff09;&#xff1a;对分类进行微调 6 微调用于分类6.1 微调的不同类别6.2 准备数据集6.3 创建数据加载器6.4 使用预训练权重初始化模型6.5 添加分类头部6.6 计算分类损失和准确率6.7 在监督数据上微调模型6.8 使用LLM进…

阿里云对象存储教程

搜“对象存储->免费试用” 选择你的心仪产品&#xff0c;我使用的是第一个 创建后获得三个实例&#xff1a; 点击右上角自己的账号可以进入到AccessKey管理界面 回到对象存储控制台创建Bucket实例 在以下文件中替换自己Bucket的信息即可美美使用~ package com.kitty.blog…

基于Python的智慧金融风控系统的设计与实现

指导途径&#xff08;&#x1f6f0;&#xff09;&#xff1a;NzqDssm16 1立题依据 1.1毕业论文&#xff08;设计&#xff09;的研究背景 随着金融行业数字化转型加速&#xff0c;智能风控系统成为防范金融风险的核心支撑。传统风控手段存在数据处理效率低下、模型更新滞后、人…