当前位置:编程学习 > JAVA >>

java最近对StackOverflowError问题

import java.util.Scanner;


public class ZuiJinDui {
public static int NUM = 40;
public static int D ;
/**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] number = new int[NUM];
int all = 1;
int k ;
int x ;
boolean repeat;
System.out.println("该程序使用分治法求解一维空间上的最近对。");
System.out.printf("\n请输入要处理点的个数(最多 %d个 ):", NUM);
Scanner sc = new Scanner(System.in);
k = sc.nextInt();

 for (int i = 0 ; i < k ; i++){ 
 //生成随机数
 int a=(int)(Math.random()*2+1);
     int aa=(int)(Math.pow(-1, a));
     int aaa=(int)(Math.random()*100+1);
     int num=aa*aaa;
     /*---------------------------*/
     repeat = false;   
             x = num;   
             for(int j = 0 ; j<all ; j++){   
                 //判断是否存在重复输入的点   
                 if(x==number[j]){   
                     repeat = true;   
                     break;   
                 }   
                
             }   
             if(!repeat){
              number[all-1]=x;   
                 all++;
                 }   
         }   
 
 k = all-1;
 System.out.printf("\n无重复的点的个数为:%d\n",k);
 if(k == 1){
 System.out.printf("最近距离为 0\n");
 }
 else{
 D = dmin1(number,k); 
 System.out.printf("\n其最近距离为:%d\n",Math.abs(D));
 }
 System.out.printf("生成的随机数\n");
 
 int count = 0;
 for(int a = 0 ; a<number.length ; a++ ){
 System.out.print(number[a] + "\t");
 count++;
 if(count%10 == 0){
 System.out.println();
 }
 }
 
}
private static int dmin1(int[] number, int k) {
// TODO Auto-generated method stub
int max;
int min;
int i ;
int m ;
int d1;
int d2;
int max1;
int min1;
int n1;
int n2;
int[] a1 = new  int[NUM];
int[] a2 = new  int[NUM];
/*
 *处理点少于2的情况   */
    if (k<2)   
      D=655359;   
    /*
     *处理点多于等于2的情况 */
    else{   
       max = min = number[0];   
       for(i = 0 ; i < k-1 ; i++){   
           if(number[i+1] > number[i])   
              max=number[i+1];   
           else    
              min=number[i+1];   
       }   
       m=(min+max)/2;//找出中位数   
       n1 = n2 = 0;   
       for( i = 0 ; i < k ; i++){
        if(number[i]<m){
        a1[n1] = number[i]; 
        n1++;
        }
           else{   
               a2[n2] = number[i];  
               n2++;
           }
       }   
       d1=dmin1(a1,n1);   
       d2=dmin1(a2,n2);   
      //找分点两侧的点max1和min1   
       max1=a1[0];   
       for(i=0;i<n1-1;i++){
        if(a1[i+1]>a1[i])
        max1=a1[i+1];
        }
       min1=a2[0];   
       for(i=0;i<n2-1;i++){
        if(a2[i+1]<a2[i])   
        min1=a2[i+1];   
       }   
       /*
        *求最近点的距离D */
       D = MIN(d1,d2,min1-max1);   
     }   
  return D;   
}
private static int MIN(int d1, int d2, int i) {
// TODO Auto-generated method stub
int min=0;
if((d1 <= d2)&&(d1 <= i))   
    min = d1;   
else if((d2 <= d1)&&(d2 <= i))   
min = d2;   
else if((i <= d1)&&(i <= d2))   
min = i;
return min;
}   
}


这是利用分治法写的最近对算法,不知道为啥我输入的处理点的个数接近或过半时的都会输出Exception in thread "main" java.lang.StackOverflowError
这个错误
输入的个数少的话不会有问题


我检查了很久都不知道哪里有问题 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- 把jvm的线程栈调大试试 -Xss
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,