【数据结构】(分治策略)中位数的查询和最接近点对问题

news2024/10/6 14:30:16

中位数查询:

寻找一组字符串中第k小的数,返回其值和下标。
请添加图片描述
不可以有重复值(在缩小规模的时候,会导致程序死循环)
请添加图片描述
相对位置的转换体现了分治策略的思想。>

  • 划分函数
int partition(int *nums,int left, int right)
{
	int i = left , j = right;
	int tmp = nums[i];
	while (i < j)
	{
		while (i<j && tmp < nums[j]) j--;
		if (i < j) nums[i] = nums[j];
		while (i<j && tmp >= nums[j]) i++;
		if (i < j) nums[i] = nums[j];
	}
	nums[i] = tmp;
	return i;
}

1.将待查询数组进行划分,得到num[left] 此时的下标 i(该值的下标将不会在变化)
2.i-left+1计算出i的相对位置j;
3.如果待查的k小于等于j,则从i的左边查,如果大于,从i的右边查。(说明i之前的下标都没有,则待查的k也减去相应j)
4.当只剩下一个元素,并且k等于1.返回当前值。

int selectK(int* nums, int left, int right, int k)
{
	if (left == right && k == 1) return nums[left];
	int i = partition(nums, left, right);
	int j = i - left + 1;//相对位置,在当前划分范围内
	if (k <= j) return selectK(nums, left, i, k);
	/* 优化,可以处理重复值
	if (k == j) return nums[i];
	if (k < j) return selectK(nums, left, i-1, k);
	*/
	else return selectK(nums, i+1, right, k-j);
}
int selectMin(int* nums, int n, int k)
{
	if (nums == nullptr
|| n < 1 || k<1 || k>n) return -1;
	return selectK(nums, 0, n - 1, k);
}
int main()
{
	int arr[] = { 56, 23, 78, 45, 90, 89, 12, 34, 67, 92, 100
	};
	int n = sizeof(arr) / sizeof(arr[0]);
	for (int i = 1; i < n - 1; i++)
	{
		int kmin = selectMin(arr, n, i);
		printf("%d:%d\n", i, kmin);
	}
	return 0;
}

请添加图片描述

最接近点对问题

找到一个中位数,将问题划分为两个规模,左边的所有数字小于该中位数,右边的所有数字均大于该中位数。用左边的最大值和右边的最小值做差。

1.当问题规模小于两个数,直接返回当前值(即为最大值)
2.通过计算,得到整个问题规模的中位数。
3.使用k+left-1得到pos。
4.利用查询中位数函数,将该数组中的数组划分为相同的两部分。
5.分别处理左半部分和右半部分。获得两部分的最小差值。
6.获得左边的最大值和右边的最小值。
7.比较 d1,d2, q-p的值。

不能直接是可得原因是,如0+10/2为5 ,取右边模块,(5+1)/2 = 3,需要再加上left减去1,才是处理右边真正得下标。

int SMin(int *nums,int left,int right)
{
	if ((right - left) < 1) return INT_MAX;
	int k = (right - left + 1) / 2;//找到最中间的值
	int pos = k + left - 1;//加上前面的偏移量left
	selectK(nums, left, right, k);
	//划分为规模相同的两部分。
	//计算出d1中的最小值,d2中的最小值差
	int d1 = SMin(nums, left, pos); //不能直接是可得原因是,如0+10/2为5 ,取右边模块,(5+1)/2 = 3,需要再加上left减去1,才是处理右边真正得下标。
	int d2 = SMin(nums, pos+1, right);
	int p = MaxS1(nums, left, pos);
	int q = MinS2(nums, pos+1, right);
	return Min3(d1, d2,q - p);
}


int SMinnum(int* nums,int n )
{
	if (nums == nullptr || n < 2) return INT_MAX;
	return SMin(nums, 0, n - 1);
}
  • 获取右边的最小值,左边的最小值
int MaxS1(int* nums, int left, int right)
{
	return nums[right];//pos的值大于前面所有的值
}
int MinS2(int* nums, int left, int right)
{
	int tmp = nums[left];
	for (int i = left + 1; i <= right; ++i)
	{
		if (tmp > nums[i])
		{
			tmp = nums[i];
		}
	}
	return tmp;
}
  • 获取三个数中的最小值。
int Min(int a, int b)
{
	return a < b ? a : b;
}
int Min3(int a, int b, int c)
{
	return Min(a, Min(b, c));
}

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

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

相关文章

Unity点乘和叉乘

前言 Unity中经常会用到向量的运算来计算目标的方位&#xff0c;朝向&#xff0c;角度等相关数据&#xff0c;而这些计算中最常用的就是点乘和叉乘 点乘 一、点乘是什么&#xff1f; 定义&#xff1a;ab|a||b|cos<a,b> 【注&#xff1a;小写字母表示向量&#xff0c;&…

精选70套前端数据可视化大屏

分享70款还不错的前端数据可视化大屏源码 其中包含行业&#xff1a;智慧社区、智慧物业、政务系统、智慧交通、智慧工程、智慧医疗、智慧金融银行等&#xff0c;全网最新、最多&#xff0c;最全、最酷、最炫大数据可视化模板。 你可以点击在线预览查看该源码资源的最终展示效果…

第九节HarmonyOS 常用基础组件22-Marquee

1、描述 跑马灯组件&#xff0c;用于滚动展示一段单行文本&#xff0c;仅当文本内容宽度超过跑马灯组件宽度时滚动。 2、接口 Marquee(value:{start:boolean, step?:number, loop?:number, fromStart?: boolean ,src:string}) 3、参数 参数名 参数类型 必填 描述 st…

vue+element 换肤功能

1.首先建深色和浅色两个主题样式变量样式表&#xff0c;样式表名和按钮中传入的值一样&#xff0c;本例中起名为default.scss和dark.scss 2.在data中定义主题变量名 zTheme:‘defalut’&#xff0c;默认引用defalut.scss, 在点击按钮时切换引用的样式表&#xff0c;达到换肤效果…

大数据 - Spark系列《二》- 关于Spark在Idea中的一些常用配置

上一篇&#xff1a; 大数据 - Spark系列《一》- 从Hadoop到Spark&#xff1a;大数据计算引擎的演进-CSDN博客 目录 1. &#x1f959;Idea中配置Live Templates来快速生成代码片段 2. &#x1f959;Idea中配置文件模板自定义初始代码 3.&#x1f959;设置spark-submit提交程…

微软技术专家带你学 AI|Azure 机器学习:创建自己的模型

点击蓝字 关注我们 编辑&#xff1a;Alan Wang 排版&#xff1a;Rani Sun 微软技术专家带你学 AI 新的一年&#xff0c;为帮助开发者们在 Azure 上掌握人工智能&#xff0c;我们特别带来「微软技术专家带你学 AI」系列&#xff0c;通过4期的课程&#xff0c;带大家从机器学习的…

Kotlin:用源码来深入理解 ‘StateFlow和SharedFlow的区别和联系‘

Kotlin&#xff1a;用源码来深入理解 ‘StateFlow和SharedFlow的区别和联系’ 在这篇文章中&#xff0c;我们将深入研究Kotlin中的StateFlow和SharedFlow&#xff0c;以及它们的相似之处和不同之处。我们将通过查看它们的源代码来理解它们的工作原理&#xff0c;这将帮助我们更…

力扣经典题:用队列表示栈

1. 基本思路&#xff1a;栈具有先入后出的性质&#xff0c;队列具有先入先出的性质&#xff0c;所以栈的栈顶元素就是队的队尾元素&#xff0c;第二个函数要求移除并返回栈顶元素&#xff0c;要满足两个要求&#xff1a;其一是要保证除栈顶外的其它元素可查&#xff0c;二是要…

nodejs+vue+ElementUi高校创业项目申报系统w6f1g

此系统设计主要采用的是nodejs语言来进行开发&#xff0c;采用vue框架技术&#xff0c;框架分为三层&#xff0c;分别是控制层Controller&#xff0c;业务处理层Service&#xff0c;持久层dao&#xff0c;能够采用多层次管理开发&#xff0c;对于各个模块设计制作有一定的安全性…

泰迪智能科技大模型微调项目训练营已开营

泰迪智能科技大模型微调项目训练营开营 跟张良均老师学大数据人工智能 项目一&#xff1a;医疗诊疗对话意图识别 项目二&#xff1a;中医问答系统 项目三&#xff1a;某平台股票评论情感识别 学习流程&#xff1a; 项目一&#xff1a;医疗诊疗对话…

github单文件下载——DownGit

记录一下一个好用的网站&#xff0c;支持github中某一特定文件夹下文件的下载 选择一个合适的梯子&#xff0c;访问Downgit网址 https://minhaskamal.github.io/DownGit/#/home 将所需网站连接粘贴到这里&#xff0c;点击download即可

【软考设计师笔记】计算机系统基础知识

&#x1f413; 计算机系统组成 计算机系统是由硬件和软件组成的&#xff0c;它们协同工作来运行程序。计算机的基本硬件系统由 运算器、控制器、存储器、输入设备和输出设备5大部件组成。运算器、控制器等部件被集成 在一起统称为中央处理单元&#xff08;Central Processing …

第8章 python深度学习——波斯美女

第8章 生成式深度学习 本章包括以下内容&#xff1a; 使用 LSTM 生成文本 实现 DeepDream 实现神经风格迁移 变分自编码器 了解生成式对抗网络 人工智能模拟人类思维过程的可能性&#xff0c;并不局限于被动性任务&#xff08;比如目标识别&#xff09;和大多数反应性任…

Linux进程详解

如有错误或有补充&#xff0c;以及任何的改进意见&#xff0c;请在评论区留下您的高见&#xff0c;同时文中给出大部分示例 即是您暂时无法在Linux中查看&#xff0c;您也可以知道各种操作的功能以及输出 如果觉得本文写的不错&#xff0c;不妨点个赞&#xff0c;收藏一下&am…

基于ssm的法律咨询系统(有报告)。Javaee项目,ssm项目。

演示视频&#xff1a; 基于ssm的法律咨询系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Sp…

mybatisplus-多数据源配置

1. 流程 pom文件yml配置多数据源具体服务添加注解DS(“***”) 1.pom文件 <!--mybatis plus 起步依赖--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.0</vers…

292. Nim Game(Nim 游戏)

题目描述 你和你的朋友&#xff0c;两个人一起玩 Nim 游戏&#xff1a; 桌子上有一堆石头。 你们轮流进行自己的回合&#xff0c; 你作为先手 。 每一回合&#xff0c;轮到的人拿掉 1 - 3 块石头。 拿掉最后一块石头的人就是获胜者。 假设你们每一步都是最优解。请编写一个函数…

生成式AI应用开发参考架构

人机交互正在迅速经历软件开发在过去二十年中从未见过的巨大范式转变。 从传统的基于规则的系统到复杂的生成人工智能 (GAI) 模型&#xff0c;破译用户意图并提供准确、上下文丰富的响应的方法已变得至关重要。 在本系列文章中&#xff0c;我将深入探讨利用 GAI 重新构想应用程…

Trinamic推出步进电机低压微型电机驱动芯片

前言 TRINAMIC运动控制有限公司宣布推出全球最小的具有专利技术StealthChop™的单芯片电机驱动器。TMC2300为2相步进电机设置了高达1.2A RMS的标准和1.8V…11V DC的电压范围&#xff0c;它只需最低的功耗&#xff0c;让人根本觉察不到有电机的存在。 从现在开始&#xff0c;您只…

springboot139华强北商城二手手机管理系统

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…