zoukankan      html  css  js  c++  java
  • 软件工程课堂二

    本次课堂的个人作业是导入文本中的数组,并计算出子数组和的最大值,最主要是为了我们学习体会数据溢出怎么处理和处理大量的数据。

    考虑数据的溢出我们使用BigInteger和BigDecimal分别处理整数类型和浮点类型。因为没有接触过数据溢出的算法一开始我是使用到double类型,不过使用BigInteger类型也有点bug就是它没有办法处理过多的数据,我使用转换成double类型的方法可以处理三千万的数据,可是用BigInteger类型的数据就只能处理一千两百万的数据,多一百万都会报OutOfMemoryError。

    以下是随机生成一千两百万的溢出的int类型数组进行处理的一个算法

    package test3;
    import java.io.BufferedReader;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.math.BigInteger;
    import java.util.Random;
    import java.util.Scanner;
    public class The_second_test {
     public static void main(String[] args) throws IOException {
      /**
       * 数据定义
       */
      BigInteger a[] = new BigInteger[20000000];
      BigInteger b[] = new BigInteger[20000000]; // 用于储存子数组的最大值
      
      /**
       * 文本数据写入
       */
      FileWriter fs = new FileWriter("D:\test.txt");
      try {
       Random random = new Random(System.currentTimeMillis());
       for(int i=0;i<12000000;i++) {
        int as = random.nextInt(2147483637)+400000;
        fs.write(as+" ");
       }
       
      }
      catch (IOException e)
      {
       e.printStackTrace();
      }
      finally {
       if(fs!=null)
       fs.close();
      }
      /**
       * 文本数据导入
       */
      int n=0;
      try (Scanner scanner = new Scanner(new BufferedReader(new FileReader(
        "D:\test.txt")));) {
       scanner.useDelimiter("[?|,|。|' ']");
       while (scanner.hasNext()) {
        a[n]=new BigInteger(scanner.next());
    //    System.out.println(a[n]);
        n++;
        
        if(n>=120000000) {
         System.out.println("数据量过大!请重新设置一个小100000个的数组");
         System.exit(0);
        }
       }
      } catch (FileNotFoundException e) {
                System.out.println("文件打开失败");
       e.printStackTrace();
       System.exit(0);
      }
      
      
      b[0] = a[0];
      for(int i=1;i<n;i++) {
       b[i]= BigInteger.valueOf(0);
      }
      /**
       * 统计所有以一开头的子数组
       */
      for (int i = 1; i < n; i++) {
       b[i]=b[i].add(b[i-1]).add(a[i]);
      }
      BigInteger max = b[0];
      int mas, mis;
      mas = mis = 0;
      BigInteger min = b[0];
      /**
       * 比较这些子数组里的最大值和最小值
       */
      for (int i = 1; i < n; i++) {
       if (max.compareTo(b[i])==-1) {
        max = b[i];
        mas = i;
       }
       if (max.compareTo(b[i])==1) {
        min = b[i];
        mis = i;
       }
      }
      /**
       * 判断最小子数组的成员个数是否大于最大子数组的成员个数
       */
      if (mis > mas) {
       min = b[0];
       mis=0;
       for (int i = 0; i <= mas; i++) {
        if (max.compareTo(b[i])==-1) {
         min = b[i];
         mis=i;
        }
       }
      }
      /**
       * 判断最小子数组的和值是否小于零
       */
      if(mis!=0)
      {
       if (min.compareTo(BigInteger.valueOf(0))==0||min.compareTo(BigInteger.valueOf(0))==-1)
        System.out.println("最大子数组的值为" + max.subtract(min));
       else
        System.out.println("最大子数组的值为" + max);
      }else
       System.out.println("最大子数组的值为" + max);
      
     }
    }
    算法截图:

    这是一个随机生成int类型溢出数据的文本大小为199MB

     
  • 相关阅读:
    关于gitlab怎样merge request的流程
    有访问权限的gitlab如何把上面的代码clone到本地
    macpro终端打开mysql
    Hbase实验:java创建和删除table
    齐次递推式拆数学式
    一些生成函数
    圆锥表面曲线方程
    扩展欧拉降幂
    scanf读入有空格字符串
    线性筛素数的一个用途
  • 原文地址:https://www.cnblogs.com/goubb/p/10543806.html
Copyright © 2011-2022 走看看