線分データの数え上げ(続きの続き)
前の記事はこちら
今、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;
}