2012/4/4----随机选择法

本文介绍了一种名为随机选择法的高效算法,该算法用于在未排序数组中寻找第i个顺序统计量,即排序后数组的第i个元素。通过递归地选择一个基准元素并根据基准元素的位置来缩小搜索范围,从而避免了对整个数组进行排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写算法之前先吐槽一下,今天实在是不适合骑车。昨晚花了一个小时洗车,准备干粮,各种骑行装备全都检查一遍就为今天的骑行。早上6点起床,7点准时集合出发,但是出发后就开始下雨。结果我们冒雨骑了近40km,不仅全身湿透(没有挡泥板的车,雨天真的不想再骑了),还满背是泥。并且由于雨越下越大,路又滑导致骑行速度提不上去,全程140km已经不能顺利完成了,只有半途返回。

但是悲剧的事情又发生了,在返回的途中一朋友的车胎爆了,大家又在雨中花了近1个小时补胎(主要是车胎不好补,一次性爆了两个大洞,无奈)。回来之后照镜子看了一下,全身是泥,昨晚刚洗的车已经看不出车样了,于是又花了20分钟洗车。。。

好了,吐槽结束,开始写算法了。

随机选择法(RANDOMIZED-SELECT):选择出数组A经过排序后的第i个数(有一个专业名词需要了解--顺序统计量),常规方式是先对数组A进行排序,然后再取出A[i]的值就可以了。但是,使用先排序再选取这种方式,它的时间效率不太好。所以,这里我们使用“随机选择法”。其核心思想有点像快速排序,先找一个关键字key查看其所在数组中的位置q,然后再比较q和i的大小,如果i=q,则我们直接就可以取出关键字key;如果i>q,则我们又在[q+1...]这个范围内选择关键字进行比较,直到找到i=q为止;如果i<d,我们就在[0...q-1]这个范围内继续选择关键字进行比较,直到找到i=q为止。

至于详细的思想,程序中有足够的注释帮助理解。

/*
 * 随机选择法求数组中的”顺序统计量“----即在排序后的数组中,A[i]的值
 * @version 1.0 2012/4/4
 * @author akon
 */
package com.akon405.www;

public class RandomizedSelect {
	//randomized_Select函数可以求得A排序过后的A[i]的值
	public int randomized_Select(int[] A,int left,int right,int i){
		if(left==right){//如果数组只有一个元素的情况下直接返回数组中唯一的元素
			return A[left];
		}
		int q=division(A,left,right);//q为分割点的下标(数组A以key值为界限,分为两拨。key前面的数值比key小,key后面的数值比key大)
		if(i==q){//i等于分割点的下标
			return A[q];
		}else if(i<q){//i小于分割点的下标,则可以确定i在[left,q-1]这个区间里
			return randomized_Select(A,left,q-1,i);
		}else{//i大于分割点的下标,则可以确定i在[q+1,right]这个区间里
			return randomized_Select(A,q+1,right,i);
		}
		
	}
	
	//division函数可以实现对A的分割,把A按照关键字key进行分割,一部分比key大,一部分比key小(这里的key选定为数组A的第一个数据),最后返回分割点的下标
	public int division(int[] A,int left,int right){
		int key=A[left];//确定最右边的数组元素为关建数值
		int temp;
		//下面循环可以把输入的数组A以key值为界限,分为两拨。key前面的数值比key小,key后面的数值比key大
		while(left!=right){
		while(left<right&&key<A[right])
			right--;//从右向左找出比key小的第一个数值,下标为right
		temp=A[right];
		A[right]=A[left];
		A[left]=temp;
		while(left<right&&key>A[left])
			left++;//从左向右找出比key大的第一个数值,下标为left
		temp=A[right];
		A[right]=A[left];
		A[left]=temp;
		}
		return left;//分割点的下标,left=right
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] A={20,19,3,1,87,32,65};
		RandomizedSelect rs=new RandomizedSelect();
		int right=A.length-1;//数组的右边
		int left=0;//数组的左边
		int i=6;//第i个”顺序统计量“--即在排序后的数组中,A[i]的值
		if(i<=right)
		System.out.print(rs.randomized_Select(A, left, right, i));//输出这个所求的数据
	}

}
 
标题基于SpringBoot+Vue的学生交流互助平台研究AI更换标题第1章引言介绍学生交流互助平台的研究背景、意义、现状、方法与创新点。1.1研究背景与意义分析学生交流互助平台在当前教育环境下的需求及其重要性。1.2国内外研究现状综述国内外在学生交流互助平台方面的研究进展与实践应用。1.3研究方法与创新点概述本研究采用的方法论、技术路线及预期的创新成果。第2章相关理论阐述SpringBoot与Vue框架的理论基础及在学生交流互助平台中的应用。2.1SpringBoot框架概述介绍SpringBoot框架的核心思想、特点及优势。2.2Vue框架概述阐述Vue框架的基本原理、组件化开发思想及与前端的交互机制。2.3SpringBoot与Vue的整合应用探讨SpringBoot与Vue在学生交流互助平台中的整合方式及优势。第3章平台需求分析深入分析学生交流互助平台的功能需求、非功能需求及用户体验要求。3.1功能需求分析详细阐述平台的各项功能需求,如用户管理、信息交流、互助学习等。3.2非功能需求分析对平台的性能、安全性、可扩展性等非功能需求进行分析。3.3用户体验要求从用户角度出发,提出平台在易用性、美观性等方面的要求。第4章平台设计与实现具体描述学生交流互助平台的架构设计、功能实现及前后端交互细节。4.1平台架构设计给出平台的整体架构设计,包括前后端分离、微服务架构等思想的应用。4.2功能模块实现详细阐述各个功能模块的实现过程,如用户登录注册、信息发布与查看、在线交流等。4.3前后端交互细节介绍前后端数据交互的方式、接口设计及数据传输过程中的安全问题。第5章平台测试与优化对平台进行全面的测试,发现并解决潜在问题,同时进行优化以提高性能。5.1测试环境与方案介绍测试环境的搭建及所采用的测试方案,包括单元测试、集成测试等。5.2测试结果分析对测试结果进行详细分析,找出问题的根源并
内容概要:本文详细介绍了一个基于灰狼优化算法(GWO)优化的卷积双向长短期记忆神经网络(CNN-BiLSTM)融合注意力机制的多变量多步时间序列预测项目。该项目旨在解决传统时序预测方法难以捕捉非线性、复杂时序依赖关系的问题,通过融合CNN的空间特征提取、BiLSTM的时序建模能力及注意力机制的动态权重调节能力,实现对多变量多步时间序列的精准预测。项目不仅涵盖了数据预处理、模型构建与训练、性能评估,还包括了GUI界面的设计与实现。此外,文章还讨论了模型的部署、应用领域及其未来改进方向。 适合人群:具备一定编程基础,特别是对深度学习、时间序列预测及优化算法有一定了解的研发人员和数据科学家。 使用场景及目标:①用于智能电网负荷预测、金融市场多资产价格预测、环境气象多参数预报、智能制造设备状态监测与预测维护、交通流量预测与智慧交通管理、医疗健康多指标预测等领域;②提升多变量多步时间序列预测精度,优化资源调度和风险管控;③实现自动化超参数优化,降低人工调参成本,提高模型训练效率;④增强模型对复杂时序数据特征的学习能力,促进智能决策支持应用。 阅读建议:此资源不仅提供了详细的代码实现和模型架构解析,还深入探讨了模型优化和实际应用中的挑战与解决方案。因此,在学习过程中,建议结合理论与实践,逐步理解各个模块的功能和实现细节,并尝试在自己的项目中应用这些技术和方法。同时,注意数据预处理的重要性,合理设置模型参数与网络结构,控制多步预测误差传播,防范过拟合,规划计算资源与训练时间,关注模型的可解释性和透明度,以及持续更新与迭代模型,以适应数据分布的变化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值