【分治法】中位数问题和Gray码问题——武汉理工大学算法设计与分析课程实验

2023-11-09

1. 中位数问题

« 问题描述

设X[ 0 : n - 1]和Y[ 0 : n – 1 ]为两个数组,每个数组中含有n个已排好序的数。找出X和Y的2n个数的中位数。 

« 编程任务

    利用分治策略试设计一个O (log n)时间的算法求出这2n个数的中位数。

« 数据输入

由文件input.txt提供输入数据。文件的第1行中有1个正整数nn<=200),表示每个数组有n个数。接下来的两行分别是X,Y数组的元素。

  « 结果输出

          程序运行结束时,将计算出的中位数输出到文件output.txt中。

输入文件示例

输出文件示例

input.txt

output.txt

3

5 15 18

3 14 21

14

 

        « 实现提示

   比较两个序列的中位数大小,如果两个数相等,则该数为整个2n个数据的中位数,否则通过比较,分别减少两个序列的查找范围,确定查找的起止位置,继续查找。

2.  Gray码问题

 « 问题描述

Gray码是一个长度为2n的序列。序列中无相同的元素,每个元素都是长度为n位的串,相邻元素恰好只有一位不同。用分治策略设计一个算法对任意的n构造相应的Gray码。 

« 编程任务

    利用分治策略试设计一个算法对任意的n构造相应的Gray码

« 数据输入

由文件input.txt提供输入数据n。

  « 结果输出

          程序运行结束时,将得到的所有编码输出到文件output.txt中。

输入文件示例

输出文件示例

input.txt

output.txt

3

 

0   0   0

0   0   1

0   1   1

0   1   0

1   1   0

1   1   1

1   0   1

1   0   0

 

        « 实现提示

   把原问题分解为两个子问题,分别对两个子问题的每个数组后一位加0和1。

 

实现代码

 

import java.io.*;
public class Main {
    public static void main(String[] args){
        Middle();
        Gray();
    }
    public static void Middle(){
        //读取文件,完成数组a,b的初始化
        int[] a=null;
        int[] b=null;
        int len=0;
        try{
            BufferedReader fr=new BufferedReader(new FileReader("src/file/input_1.txt"));
            String line=fr.readLine();
            len=Integer.parseInt(line);
            String str=fr.readLine();
            String[] sa=str.split(" ");
            str=fr.readLine();
            String[] sb=str.split(" ");
            fr.close();
            a = new int[len];
            b = new int[len];
            for(int i=0;i<len;i++){
                a[i]=Integer.parseInt(sa[i]);
                b[i]=Integer.parseInt(sb[i]);
            }
        }catch(Exception e){
            System.out.println(e);
        }
        boolean ji=len%2==0?false:true;
        findMiddle(a,0,len-1,b,0,len-1,ji);
    }

    public static void findMiddle(int[] a,int start_a,int end_a,int[] b,int start_b,int end_b,boolean j){
        /*
         * 比较两个数组的中位数mid1和mid2,若相等则就是总的中位数mid
         * 若a、b都只剩两个元素,则取四个元素中第二小的为mid
         * 若mid1<mid2,取此时a的右部分,b的左部分,进行递归
         * 若mid1>mid2,取此时a的左部分,b的右部分,进行递归
         * */
        int mid1=(start_a+end_a)/2, mid2=(start_b+end_b)/2;
        System.out.println(a[mid1]+","+b[mid2]);
        if(a[mid1]==b[mid2]){
            writeNum(a[mid1]);
        }
        else if(end_a-start_a<=1&&end_b-start_b<=1){//<=4时直接解决
            int result=0;
            if(end_a-start_a==1&&end_b-start_b==1)//4
                result=getMid(a[start_a],a[end_a],b[start_b],b[end_b]);
            else if(end_a==start_a&&end_b==start_b)//2
                result=a[end_a]>b[end_b]?b[end_b]:a[end_a];
            else if(end_a==start_a)//a1b2,选三者中位数
                result=a[end_a]<b[start_b] ? b[start_b]:(a[end_a]<b[end_b]?a[end_a]:b[end_b]);
            else//a2b1,选三者中位数
                result=b[end_b]<a[start_a]?a[start_a]:(b[end_b]<a[end_a]?b[end_b]:a[end_a]);
            writeNum(result);
            return;
        }
        else if(a[mid1]<b[mid2]){
            if(j)
                findMiddle(a,mid1,end_a,b,start_b,mid2,true);
            else
                findMiddle(a,mid1+1,end_a,b,start_b,mid2,true);
        }
        else{
            if(j)
                findMiddle(a,start_a,mid1,b,mid2,end_b,true);
            else
                findMiddle(a,start_a,mid1,b,mid2+1,end_b,true);
        }
    }

    public static int getMid(int a,int b,int c,int d){//选四个数中的中位数
        System.out.println(a+","+b+","+c+","+d);
        int[] num={a,b,c,d};
        int result,min=0;
        for(int i=1;i<4;i++){
            if(num[i]<num[min])
                min=i;
        }
        result=min==0?num[1]:num[0];
        for(int i=0;i<4;i++){
            if(i!=min&&num[i]<result)
                result=num[i];
        }
        System.out.println("result: "+result);
        return result;
    }

    public static void writeNum(int n){
        try{
            FileWriter fw=new FileWriter(new File("src/file/output_1.txt"));
            fw.write(String.valueOf(n));
            fw.close();
        }catch(IOException e){
            System.out.println(e);
        }

    }

    public static void Gray(){
        int len=0;
        try{
            BufferedReader bf=new BufferedReader(new FileReader("src/file/input_2.txt"));
            len=Integer.parseInt(bf.readLine());
            bf.close();
        }catch(IOException e){
            System.out.println(e);
        }
        int row=(int)Math.pow(2,len);
        int [][] gray=new int[row][len];
        getGray(gray,len,row);
        try{
            File f= new File("src/file/output_2.txt");
            FileWriter fw=new FileWriter(f);
            for(int i=0;i<row;i++){
                String line="";
                for(int j=len-1;j>=0;j--){
                    line=line+String.valueOf(gray[i][j])+"   ";
                }
                line+="\n";
                fw.write(line);
            }
            fw.close();
        }catch(IOException e){
            System.out.println(e);
        }
    }

    public static void getGray(int[][] gray,int n,int row){
        /*
        * n表示gray码的长度,row表示生成的gray码个数
        * 前一半的头一位是0,后一半的头一位是1,n-1,row除2递归
        * 当n=1时“递”结束,利用对称性为其它单元赋值
        * 在gray数组中,每一个gray编码是反向存储的
        * */
        for(int i=0;i<row/2;i++){
            gray[i][n-1]=0;
            gray[row-i-1][n-1]=1;
        }
        if(n==1){//递归结束
            gray[0][n-1]=0;
            gray[1][n-1]=1;
            return;
        }
        getGray(gray,n-1,row/2);
        //利用对称性赋值
        for(int i=row/2;i<row;i++){
            for(int j=0;j<n-1;j++){
                gray[i][j]=gray[row-1-i][j];
            }
        }
    }

}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【分治法】中位数问题和Gray码问题——武汉理工大学算法设计与分析课程实验 的相关文章

随机推荐

  • 2019-CVPR 缺陷/瑕疵检测论文介绍及基于pytorch实现的代码

    Segmentation Based Deep Learning Approach for Surface Defect Detection的介绍和实现 本文介绍 论文解析 1 INTRODUCTION 2 Related Work 3 S
  • 基于Chatbot UI 实现ChatGPT对话-V1.3-预告

    先讲一个悲伤的故事 小红书被封号了 emo 给俺点点关注吧 这次一定好好发言 迷茫的21世纪的新青年 一 预告图 自定义随机量 让回复按需设置 二 更新功能 随机量 参数名 Temperature 温度 我更愿意称之为随机量 它根据调的数值
  • Python报错及解决办法一

    问题一 C Users asus gt print Hello World 无法初始化设备 PRN 解决办法 先执行python解释器 再执行python代码 C Users asus gt python Python 3 10 6 tag
  • ValueError: shapes (1,3) and (100,1) not aligned: 3 (dim 1) != 100 (dim 0)

    ValueError shapes 1 3 and 100 1 not aligned 3 dim 1 100 dim 0 出现这个错误 是你数据的维度不对 这个问题是出现在写logistic Regression 代码时出现的 用scip
  • C++拷贝构造函数

    注意 1 当函数的参数为类的对象时 那么在函数的形参与调用这个函数时的实参并不一定内容一模一样 因为是调用的拷贝构造函数 因此也有可能自定义的拷贝构造函数会导致两个对象的内容不一样 2 拷贝构造函数 只对非静态属性进行拷贝 拷贝构造函数调用
  • OpenCV中读取摄像头

    人脸识别首先要做的就是摄像头数据的读取 这里OpenCV很好的实现了摄像头数据的读取 在OpenCV1 x中用到的函数是 1 打开摄像头或视频文件 CvCapture cvCreateCameraCapture int index inde
  • ubuntu18.04安装dconf-editor以及设置root远程终端

    今天我们将学习一下dconf editor和root远程 方便我们在工作的时候 客户需要安装软件 我们就不用那么麻烦的跑道现场去给客户安装 这也是给咱们运维人员图个方便 dconf editor介绍 这个只是简单配置存储系统 图形编辑器 可
  • linux进程间通信---本地socket套接字(一)---一个server对应一个client

    先给自己打个广告 本人的微信公众号正式上线了 搜索 张笑生的地盘 主要关注嵌入式软件开发 股票基金定投 足球等等 希望大家多多关注 有问题可以直接留言给我 一定尽心尽力回答大家的问题 想要获取完整源码的 关注公众号后回复 socket1 即
  • ipa文件怎么安装到iphone_无需电脑,无需越狱,手机端一键签名安装ipa文件

    很多玩苹果的小伙伴都知道 由于ios系统的封闭性 使得很多第三方软件无法直接安装到手机 因为破解之后都需要打包 签名才可以安装到手机使用 因此好多优秀的第三方软件都无法安装到手机使用 今天 苹果用户的福音来了 一个软件 无需电脑 无需越狱
  • CentOS7环境Grafana监控系统的备份、恢复与迁移

    目的 实现Grafana系统的数据备份 迁移与恢复 最近一直在给客户的环境搭建服务资源 业务与数据库监控 这里记录下实际搭建过程中的一些问题 如下是安装grafana的服务器要迁移 需要备份迁移并做数据恢复 1 备份Grafana相关数据
  • WebService 的一些基本概念

    一 1 Endpoint http www ttdev com SimpleService 这个webservice全名就是所谓的 endpoint 2 RPC type RPC 型的Web Service 方法定义 3 Document
  • 区块链之java(一) 番外篇(数据类型)

    预先善其事 必先利其器 今天俺们讲讲智能合约和java中的一个数据类型 在智能合约中 大概有这些基本类型 能满足开发 是否有漏的呢 我也不太清楚 因为我也没有很深入的了解这块 好了 话不多说 看看具体的东西 智能合约类型如下 uint256
  • 【Python零基础入门篇 · 12】:函数的定义和作用、函数参数、函数嵌套、枚举函数enumerate

    文章目录 函数的定义和作用 函数的结构 函数调用 返回值 函数参数 区分形参和实参 必备参数 默认参数 可变参数 关键字参数 函数嵌套 枚举函数 enumerate 函数的定义和作用 函数 function 是将具有独立功能的代码块组织成为
  • 【BEVformer部署】tensorrt部署整体流程

    1 安装依赖包 CUDA cuDNN TensorRT 下载安装 CUDA 11 6 cuDNN 8 6 0 TensorRT 8 5 1 7 地址 NVIDIA PyTorch安装指令 pip install torch 1 12 1 c
  • Python爬虫 实例 网络爬虫

    一 这里是一个简单的网页爬虫例子 python import requests from bs4 import BeautifulSoup url https example com response requests get url so
  • [小技巧] git 清理 repository

    使用如下命令可以快速清除 repository 里没有被 git 管理的文件 git clean xdf 如果要保留某些后缀的文件 如 txt 文件 使用如下命令 git clean xdfe txt 参考 http stackoverfl
  • 在 NetBeans 中自动生成 get、set 和构造函数

    如果您使用的是 NetBeans 以下内容将为您节省大量时间 您可以在几秒钟内为您的变量以及构造函数自动生成函数get set以下适用于 Java 和 PHP 但我认为它也适用于其他语言 只需将光标指向您希望生成的代码出现的位置 然后按 A
  • elasticsearch 一对多普通文档子对象边界值问题

    一般为保证大数据量 低延时业务数据查询都会用到基于lucene的搜索引擎elasticsearch ES的出现解决了大数据搜索的一大问题 但是由于某些特殊业务数据就可能出现一些问题 比如 一对多业务普通索引的子对象边界值问题 什么是子对象边
  • [游戏开发][Unity]点击Play按钮后卡死很久

    一般小工程不会遇到这个问题 我在公司接手了几个老项目 都遇到了这个问题 每次Play卡顿几分钟甚至十几分钟 很是头疼 原因大概率就是下图 Packing Sprite Atlases 打包纹理图集 Windows上的Unity项目经常不显示
  • 【分治法】中位数问题和Gray码问题——武汉理工大学算法设计与分析课程实验

    1 中位数问题 问题描述 设X 0 n 1 和Y 0 n 1 为两个数组 每个数组中含有n个已排好序的数 找出X和Y的2n个数的中位数 编程任务 利用分治策略试设计一个O log n 时间的算法求出这2n个数的中位数 数据输入 由文件inp