两有序序列中找第k大数O(lgm+lgn)

本文介绍了一种使用二分查找法来寻找两个有序数组中第K大的元素的方法。通过递归地将两个数组进行比较,逐步缩小搜索范围,最终找到目标元素。文章提供了一个Java实现示例。
// 基本思想源于二分查找
import java.util.Scanner;

public class Main {    
    
public static int fd(int[] arrA, int al, int ar, int[] arrB, int bl, int br, int k) {
        
int am = (ar - al) / 2 + al;
        
int bm = (br - bl) / 2 + bl;
        
if( am+bm+2 < k+1 ) {
            
if( arrA[am+1< arrB[bm+1] ) {
                
if( ar-am == 1 ) am = ar;
                
return fd(arrA, am, ar, arrB, bl, br, k);
            }

            
if( br-bm == 1 ) bm = br;
            
return fd(arrA, al, ar, arrB, bm, br, k);
        }
 else if( am+bm+2 == k+1 ) {
            
if( arrA[am] == arrB[bm] ) return arrA[am];
            
if( arrA[am] < arrB[bm] ) {
                
if( bm==0 || arrA[am]>=arrB[bm-1] ) return arrB[bm];
                
if( arrA[am+1< arrB[bm] ) return fd(arrA, am, ar, arrB, bl, bm, k);
                
else return arrB[bm];
            }

            
// arrA[am] > arrB[bm]
            if( am==0 || arrA[am-1]<=arrB[bm] ) return arrA[am];
            
if( arrA[am] > arrB[bm+1] ) return fd(arrA, al, am, arrB, bm, br, k);
            
else return arrA[am];
        }
 else // am+bm+2 > k+1
            if( arrA[am] < arrB[bm] ) return fd(arrA, al, ar, arrB, bl, bm, k);
            
return fd(arrA, al, am, arrB, bl, br, k);
        }

    }

    
    
public static int findKMax(int[] arrA, int[] arrB, int k) {
        
// 处理零界情况 减少复杂度
        if( arrA[arrA.length-1< arrB[0] ) {
            
if( k < arrA.length ) return arrA[k];
            
else return arrB[k-arrA.length];
        }

        
if( arrB[arrB.length-1< arrA[0] ) {
            
if( k < arrB.length ) return arrB[k];
            
else return arrA[k-arrB.length];
        }

        
if( k<arrA.length && arrA[k]<arrB[0] ) return arrA[k];
        
if( k<arrB.length && arrB[k]<arrA[0] ) return arrB[k];
        
if( k>arrA.length && arrB[k-arrA.length]>=arrA[arrA.length-1] ) return arrB[k-arrA.length];
        
if( k>arrB.length && arrA[k-arrB.length]>=arrB[arrB.length-1] ) return arrA[k-arrB.length];
        
        
return fd(arrA, 0, arrA.length-1, arrB, 0, arrB.length-1, k);
    }

    
public static void main(String[] args) throws Exception {
        
int[] arrA = new int[10];
        
int[] arrB = new int[10];
        
        
for(int i = 0; i < 10; i++{
            arrA[i] 
= i;
            arrB[i] 
= i + 3;
        }

        
        Scanner scanner 
= new Scanner(System.in);
        
while(true{
            
int d = scanner.nextInt();
            System.out.printf(
"d = %d,  result = %d ", d, findKMax(arrA, arrB, d));
        }

        
//        for(int i = 0; i < 20; i++)
//            System.out.printf("i = %d,  result = %d ", i, findKMax(arrA, arrB, i));
    }

}

内容概要:本文提出了一种基于改进扩散模型的高海拔地区新能源高波动出力场景生成方法,并提供了完整的Python代码实现。该方法针对高海拔地区风能、光伏等新能源出力波动剧烈、不确定性高的特点,通过优化扩散模型的结构与训练策略,有效捕捉历史数据的概率分布特征与时序相关性,从而生成高质量、多样化的出力场景。文中详细阐述了模型的数学推导、网络架构设计、损失函数优化及采样算法改进,并通过实验证明其在拟合精度、场景多样性与稳定性方面优于传统生成模型,为电力系统在高比例新能源接入下的规划、调度与风险评估提供了可靠的场景输入支持。; 适合人群:具备一定Python编程能力和机器学习基础,从事新能源发电预测、电力系统分析、智能优化、场景生成等方向研究的科研人员、高校研究生及工程技术人员。; 使用场景及目标:①用于高海拔地区风电、光伏出力的不确定性建模与多场景生成;②支撑含高渗透率新能源的电力系统随机优化调度、鲁棒决策与风险评估;③为相关学术研究、论文复现与算法改进提供可运行的技术方案与代码基础; 阅读建议:建议读者结合所提供的完整资源(代码、数据集、说明文档)进行实践操作,重点关注扩散模型的前向加噪与反向去噪过程的设计细节,以及如何将其适配于新能源时序数据的生成任务,通过参数调优与对比实验深入理解模型的生成机制与性能边界。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值