双关系递推队列---Java实现

本文介绍了一种双关系递推队列的实现方法,主要关注如何找到集合M中小于或等于某个给定值n的第n个元素。通过分析1, 2x+1, 3x+1之间的关系,将问题分解为两个数列:2x的情况和3x的情况,分别进行递推计算,从而解决排序问题。" 83655196,8050897,逆深度参数化在视觉SLAM中的应用,"['视觉SLAM', '逆深度参数化', '3D重建', '特征点优化', '非线性优化']

在这里插入图片描述
思路:
首先,1属于集合M,x也属于集合M,那么x肯定是大于或者等于1的,然后,2x+1于3x+1也属于集合M,且要求求集合M的元素从小到大排序的第n个元素。那么,必然有2x>3x或2x<=3x的情况,说明2x与3x不能是在同一个数列,所以可以分成两个数列,一个是2x情况的数列,一个是3x情况的数列。

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Scanner;

/**
 * Created on 09:05  01/11/2019
 * Description:
 * 1->M  x->M x>=1  2x+1->M   3x+1->M  必须要保证从小到大  2x>3x--> 3x ||  2x
 *
 * @author Weleness
 */

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(new BufferedReader(new InputStreamReader(System.in)));
        int n = sc.nextInt();
        long[] m = new long[1000001];
        m[1] = 1;//1->M
        int p2 = 1, p3 = 1;// x->M x>=1  分为两个数列p2代表2x  p3代表3x
        if(n<1) {
            System.out.println(0);
            return;
        }
        for (int i = 2; i <=n ; i++){
            if(2*m[p2]<3*m[p3]){//如果小于
                m[i] = 2*m[p2]+1;//将小的元素存进集合M
                p2++;//下标往右移动
            }
            else {//否则
                m[i] = 3*m[p3]+1;//将小的元素存入集合M
                if(2*m[p2]==3*m[p3]){//判断两个元素会不会相等,如果相等就都往右移动
                    p2++;
                }
                p3++;
            }
        }
        System.out.println(m[n]);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值