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

中位数查询:

寻找一组字符串中第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.mfbz.cn/a/367182.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

BUUCTF-Real-[Flask]SSTI

目录 漏洞描述 模板注入漏洞如何产生&#xff1f; 漏洞检测 漏洞利用 get flag ​编辑 漏洞描述 Flask框架&#xff08;jinja2&#xff09;服务端模板注入漏洞分析&#xff08;SSTI&#xff09; Flask 是一个 web 框架。也就是说 Flask 为您提供工具、库和技术来允许您构…

浅谈WPF之UniformGrid和ItemsControl

在日常开发中&#xff0c;有些布局非常具有规律性&#xff0c;比如相同的列宽&#xff0c;行高&#xff0c;均匀的排列等&#xff0c;为了简化开发&#xff0c;WPF提供了UniformGrid布局和ItemsControl容器&#xff0c;本文以一个简单的小例子&#xff0c;简述&#xff0c;如何…

[Java]JDK 安装后运行环境的配置

这篇文章用于介绍jdk.exe安装之后的运行环境配置&#xff0c;以及如何检查是否安装成功 检查自己是否安装jdk环境&#xff0c;记住这个安装的改的路径: (应该要安装2个&#xff0c;一个是jdk,一个是jre) 安装后的在文件夹的样子(路径自定义&#xff0c;在java下面): 参考如下…

奠定基础:用于机器学习的微积分、数学和线性代数

一、说明 机器学习是一个引人入胜的领域&#xff0c;它使计算机能够从数据中学习并做出预测或决策&#xff0c;而无需明确编程。然而&#xff0c;在幕后&#xff0c;有一个坚实的数学和线性代数基础&#xff0c;构成了机器学习算法的支柱。在本文中&#xff0c;我们将探讨在深入…

AJAX-URL查询参数

定义&#xff1a;浏览器提供给服务器的额外信息&#xff0c;让服务器返回浏览器想要的数据 http://xxxx.com/xxx/xxx?参数名1值1&参数名2值2 axios语法 使用axios提供的params选项 注意&#xff1a;axios在运行时把参数名和值&#xff0c;会拼接到url?参数名值 axios(…

YOLOv7改进:下采样系列 | 一种新颖的基于 Haar 小波的下采样HWD,有效涨点系列

💡💡💡本文独家改进:HWD的核心思想是应用Haar小波变换来降低特征图的空间分辨率,同时保留尽可能多的信息,与传统的下采样方法相比,有效降低信息不确定性。 💡💡💡使用方法:代替原始网络的conv,下采样过程中尽可能包括更多信息,从而提升检测精度。 收录 YO…

用Python和 Cryptography库给你的文件加密解密

用Python和 Cryptography库给你的文件加密解密 用Python和 Cryptography库给你的文件加把安全锁。 先介绍与加密解密有关的几个基本概念。 加密&#xff08;Encryption&#xff09;&#xff1a;加密是将明文转换为密文的过程&#xff0c;使得未经授权的人无法读懂。 解密&a…

Ruoyi-Cloud-Plus_Nacos配置服务漏洞CVE-2021-29441_官方解决方法以及_修改源码解决---SpringCloud工作笔记199

CVE-2021-29441 这个漏洞是Nacos的,通过使用postman,直接访问接口: 就可以直接添加nacos的用户 Nacos是Alibaba的一个动态服务发现、配置和服务管理平台。攻击者通过添加Nacos-Server的User-Agent头部将可绕过(nacos.core.auth.enabled=true)鉴权认证,从而进行API操作。 …

spring boot 使用 Kafka

一、Kafka作为消息队列的好处 高吞吐量&#xff1a;Kafka能够处理大规模的数据流&#xff0c;并支持高吞吐量的消息传输。 持久性&#xff1a;Kafka将消息持久化到磁盘上&#xff0c;保证了消息不会因为系统故障而丢失。 分布式&#xff1a;Kafka是一个分布式系统&#xff0c…

海康威视有插件、无插件播放;webrtc直播;西瓜视频播放器;mpegts.js直播;flvjs直播

Notes 视频播放的几种方式 一、Video mp4链接直接播放 二、海康威视3.3插件版直播、云台控制&#xff0c;资源下载地址 index.html引入hk文件中的js文件双击HCWebSDKPlugin.exe安装插件前端参照文件夹hkCamera中的示例代码 三、海康威视3.2无插件版直播&#xff0c;资源下…

go_view同后端集成时的注意事项

goview是一个不错的可视化大屏配置工具;提供了丰富的功能可供调用。 官方地址和文档: https://gitee.com/dromara/go-view https://www.mtruning.club/guide/start/ 同nodejs集成可参考;https://gitee.com/qwdingyu/led (建议–后端集成有api功能,可直接配置sql)同dotne…

Leetcode—203. 移除链表元素【简单】

2024每日刷题&#xff08;一零九&#xff09; Leetcode—203. 移除链表元素 实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(n…

Python爬虫的基本原理

我们可以把互联网比作一张大网&#xff0c;而爬虫&#xff08;即网络爬虫&#xff09;便是在网上爬行的蜘蛛。把网的节点比作一个个网页&#xff0c;爬虫爬到这就相当于访问了该页面&#xff0c;获取了其信息。可以把节点间的连线比作网页与网页之间的链接关系&#xff0c;这样…

ref和reactive

看尤雨溪说&#xff1a;为什么Vue3 中应该使用 Ref 而不是 Reactive&#xff1f;

华为1.24秋招笔试题

华为1.24秋招笔试题 1.题目1 题目详情 - 2024.1.24-华为秋招笔试-第一题-计算积分 - CodeFun2000 1.1题解 import java.util.Scanner;class Main{public static void main(String[] args){Scanner scnew Scanner(System.in);String ssc.next();char[] chs.toCharArray();in…

记一次 Android CPU高使用率排查

文章目录 背景排查高占用的进程adb shelltoptop -b -H -n 1 | grep 29337 (打印各线程 cpu使用详情)kill -3 29337 (生成trace文件)adb pull /data/anr /Users/gerry.liang/Desktop定位问题 补充说明: 背景 测试同学反馈我们的App CPU使用率 90% 居高不下,经过一番艰难的排查后…

如何在PS5上使用金手指修改游戏

环境&#xff1a;windows PS5 问题&#xff1a;PS5 没有GodHen&#xff0c;无法使用json金手指&#xff0c;PKG金手指比较少 解决办法&#xff1a;使用MultiTrainerv从网络注入PS5&#xff0c;修改进程内存 背景&#xff1a;为了护肝&#xff0c;拒绝刷刷刷 解决过程&#xff…

网络异常案例四_IP异常

问题现象 终端设备离线&#xff0c;现场根据设备ip&#xff0c;ping不通。查看路由器。 同一个路由器显示的终端设备&#xff08;走同一个wifi模块接入&#xff09;&#xff0c;包含不同网段的ip。 现场是基于三层的无线漫游&#xff0c;多个路由器wifi配置了相同的ssid信息&a…

VUE项目导出excel

导出excel主要可分为以下两种&#xff1a; 1. 后端主导实现 流程&#xff1a;前端调用到导出excel接口 -> 后端返回excel文件流 -> 浏览器会识别并自动下载 场景&#xff1a;大部分场景都有后端来做 2. 前端主导实现 流程&#xff1a;前端获取要导出的数据 -> 把常规数…

部署实战--修改jar中的文件并重新打包成jar文件

一.jar文件 JAR 文件就是 Java Archive &#xff08; Java 档案文件&#xff09;&#xff0c;它是 Java 的一种文档格式JAR 文件与 ZIP 文件唯一的区别就是在 JAR 文件的内容中&#xff0c;多出了一个META-INF/MANIFEST.MF 文件META-INF/MANIFEST.MF 文件在生成 JAR 文件的时候…
最新文章