软件工程课堂二

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

考虑数据的溢出我们使用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

 

猜你喜欢

转载自www.cnblogs.com/goubb/p/10543806.html
今日推荐