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

中位数查询:

寻找一组字符串中第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;//加上前面的偏移量leftselectK(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.hqwc.cn/news/443668.html

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

相关文章

报错 Cannot read properties of undefined(reading‘addEventListener‘)如何解决

我在制作项目中遇到了一个问题&#xff0c;给大家分享一下&#xff0c;如下图&#xff1a; 问题&#xff1a;这是我给一个input输入框绑定的监听事件出现的报错 翻译&#xff1a;无法读取未定义的属性(读取 addEventListener ) 错误原因&#xff1a;js中操作的dom元素的函数方…

Spring Boot 中操作 Bean 的生命周期

1.InitializingBean和DisposableBean InitializingBean接口提供了afterPropertiesSet方法&#xff0c;用于在bean的属性设置好之后调用&#xff1b; DisposableBean接口提供了destroy方法&#xff0c;用于在bean销毁之后调用&#xff1b; public class TestComponent implem…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之DatePicker组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之DatePicker组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、DatePicker组件 日期选择器组件&#xff0c;用于根据指定日期范围创建日期滑…

SpringBoot 使用WebSocket功能

实现步骤&#xff1a; 1.导入WebSocket坐标。 在pom.xml中增加依赖项&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dependency>2.编写WebSocket配…

【Web前端实操21】商城官网_白色导航

今日份实现白色导航栏部分&#xff0c;也就是第三部分&#xff0c;效果如图中划线所示&#xff1a; 本次实现代码如之前的全局样式不再赘述&#xff0c;如有需要可以去我博客的Web前端实操19或者20自行查看。 本次主要更新mi.css和index.htm。 实现导航栏所需要的CSS样…

【云原生】docker安全与https加密的超文本传输协议CA证书生成

目录 一、docker安全 二、http与https的区别 三、为什么要使用 SSL 证书&#xff1f; 四、https证书认证的过程 https单向认证的访问流程 https双向认证的访问流程 五、如何获取证书&#xff1f; 六、实操获取证书并验证 1、通过阿里云获取证书 2、通过mkcert获取证书…

09. BI - 数据可视化,如何进行基本图形绘制

本文为 「茶桁的 AI 秘籍 - BI 篇 第 09 篇」 文章目录 EDA 作用可视化视图Python 进行可视化subplot Hi&#xff0c;你好。我是茶桁。 今天想给大家讲的是关于数据的可视化。在工作中很多时候我们不光要计算结果&#xff0c;还要把结果呈现出来&#xff0c;最好是一种图形化的…

uniapp基于Android平台的校园生活服务交流论坛系统(二手,失物招领 -跑腿) 小程序hbuiderx

作为一款APP的校园论坛系统&#xff0c;面向的是大多数学者&#xff0c;软件的界面设计简洁清晰&#xff0c;用户可轻松掌握使用技巧。在调查之后&#xff0c;获得用户以下需求&#xff1a; &#xff08;1&#xff09;用户注册登录后&#xff0c;可进入系统解锁更多功能&#x…

「数据结构」1.初识泛型

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;Java数据结构 &#x1f387;欢迎点赞收藏加关注哦&#xff01; 初识泛型 &#x1f349;前言&#x1f349;包装类&#x1f34c;装箱&拆箱 &#x1f349;泛型&#x1f34c;擦除机制&#x1f…

python实现贪吃蛇小游戏(附源码)

文章目录 导入所需的模块坐标主游戏循环模块得分 贪吃蛇小游戏&#xff0c;那个曾经陪伴着00后和90后度过无数欢笑时光的熟悉身影&#xff0c;仿佛是一把打开时光之门的钥匙。它不仅是游戏世界的经典之一&#xff0c;更是我们童年岁月中不可或缺的一部分&#xff0c;一个承载回…

C语言第十四弹---函数递归

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 函数递归 1、递归是什么&#xff1f; 1.1、递归的思想 1.2、递归的限制条件 2、递归举例 2.1、举例1&#xff1a;求n的阶乘 2.1.1、分析和代码实现 2.1.2、…

【云上建站】快速在云上构建个人网站3——网站选型和搭建

快速在云上构建个人网站3——网站选型和搭建 一、网站选型二、云市场镜像方式一&#xff1a;方式二&#xff1a;1. 进入ECS实例详情页面&#xff0c;点击停止&#xff0c;确保更换操作系统的之前ECS实例处于已停止状态&#xff0c;点击更换操作系统&#xff0c;进行镜像配置。2…