線分データの数え上げ(続きの続き)
前の記事はこちら
今、N個のデータが得られるとする。そのデータは、1次元尺度上の線分に相当するデータであるものとする。簡単に言えば、aiからbiまでというようなデータが、N個得られるとする。このようなデータから、ある値xについて、[tex:ai<=c
public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ double[][] data ={ {2,5}, {4,6}, {5,9}, {1,3} }; double[][] list = segprob(data); for(int i=0;i<list.length;i++){ System.out.println(list[i][0]+"\t"+list[i][1]); } } public static double[][] segprob(double[][] d){ double[][] ret = new double[d.length*2][2]; double[][] list = new double[d.length*2][2]; int counter=0; for(int i=0;i<d.length;i++){ list[counter][0]=d[i][0]; list[counter][1]=1; list[counter+1][0]=d[i][1]; list[counter+1][1]=-1; counter+=2; } for(int i=0;i<list.length;i++){ for(int j=0;j<list[i].length;j++){ System.out.print(list[i][j]+"\t"); } System.out.println(); } int N=0; double[][] sortedlist = StatUtilsY.MiscUtilX.bublSortListsByColNo2X(list, N); for(int i=0;i<sortedlist.length;i++){ ret[i][0]=sortedlist[i][0]; if(i==0){ ret[i][1]=sortedlist[i][1]; }else{ ret[i][1]=ret[i-1][1]+sortedlist[i][1]; } } int counter2=0; double[][] ret2=new double[ret.length][ret[0].length]; for(int i=0;i<ret.length;i++){ if(i==0){ ret2[0][0]=ret[0][0]; ret2[0][1]=ret[0][1]; }else{ if(ret[i][0]==ret[i-1][0]){ ret2[counter2][0]=ret[i][0]; ret2[counter2][1]=ret[i][1]; }else{ counter2++; ret2[counter2][0]=ret[i][0]; ret2[counter2][1]=ret[i][1]; } } } //return sortedlist; //System.out.println("counter2="+counter2); double[][] ret3=new double[counter2+1][2]; for(int i=0;i<ret3.length;i++){ for(int j=0;j<ret3[i].length;j++){ ret3[i][j]=ret2[i][j]; } } return ret3; }
public static double[][] bublSortListsByColNo2X(double[][] p, int N){ double[] listTobeSorted=new double[p.length]; for(int i=0;i<p.length;i++){ listTobeSorted[i]=p[i][N]; } for(int i=0;i<listTobeSorted.length;i++){ System.out.println(listTobeSorted[i]); } int[] order = bublSortRetInt(listTobeSorted); double[][] ret = new double[p.length][p[0].length]; for(int i=0;i<ret.length;i++){ System.out.println(order[i]); for(int j=0;j<ret[i].length;j++){ ret[order[i]][j]=p[i][j]; } } return ret; }
public static int[] bublSortRetInt(double[] p){ double[] copyP = DeepCopyDouble1(p); int[] ret = new int[p.length]; for(int i=0;i<ret.length;i++){ ret[i]=i; } boolean flag=true; boolean sameflag=false; for(int i=copyP.length-1;i>=0;i--){ for(int j=1;j<=i;j++){ if(copyP[j-1]==copyP[j]){ sameflag=true; //ret = 0; //return ret; } if(copyP[j-1]>copyP[j]){ double tmp = copyP[j-1]; int tmpint = ret[j-1]; copyP[j-1]=copyP[j]; ret[j-1]=ret[j]; copyP[j]=tmp; ret[j]=tmpint; //ret+=1; if(flag){ flag=false; }else{ flag=true; } } } } /* for(int i=0;i<copyP.length;i++){ System.out.println(copyP[i]); System.out.println(ret[i]); } */ int[] ret2 = new int[ret.length]; for(int i=0;i<ret.length;i++){ ret2[ret[i]] = i; } return ret2; }