📄 bigtree_clustering.java~20~
字号:
package fuzzy_project;
class Bigtree_Clustering
{
private double Matrix[][];
private int row;
private int col;
private int x;
private int p;
private Edges[] Value_Array; //存储边
private Edges[] Bigtree_Array; //存放最大树边
private int[][] Clustering_Matrix; //存储所有可能的分类结果
private int loop[];
private int Clustering_result[][];
private int length[]; //记录二维数组Clustering_result中每行非零元素的个数
private byte visited[]; //标记节点是否被访问
private String result;
public Bigtree_Clustering(double array[][],int r,int c)
{
Matrix=array;
row=r;
col=c;
x=0;
p=0;
Value_Array=new Edges[row*(row-1)/2]; //一个完全无向图的边数有row*(row-1)/2条
Bigtree_Array=new Edges[row-1]; //生成树的边数有row-1条
Clustering_Matrix=new int[row][col];
loop=new int[row*(row-1)/2];
Clustering_result=new int[r][c];
length=new int[c];
visited=new byte[r+1];
result="#";
for(int i=0;i<row;i++)
for(int j=i+1;j<col;j++)
{
Value_Array[x]=new Edges(i,j,Matrix[i][j]); //把相似矩阵的每条边存储在Edges类型的数组Value_Array中
x++;
}
for(int x=0;x<row;x++)
{
Clustering_Matrix[x][0]=x; //给矩阵赋初始值
}
quickSort(Value_Array,0,row*(row-1)/2-1); //对数组sort_array中的权值进行排序
Bigtree_exe();
for(int i=0;i<row;i++)
{
length[i]=1;
}
for(int i=0;i<row;i++)
{
Clustering_result[i][0]=i+1;
}
}
public void quickSort(Edges array[],int low,int high) //快速排序算法
{
int i,j;
Edges temp;
i=low;
j=high;
temp=array[low];
while(i<j)
{
while(array[j].weight>=temp.weight&&i<j)
{j--;}
array[i]=array[j];
while(array[i].weight<=temp.weight&&i<j)
{i++;}
array[j]=array[i];
}
array[i]=temp;
if(i-1>low)
{quickSort(array,low,i-1);}
if(high>i+1)
{quickSort(array,i+1,high);}
}
public void Bigtree_exe() //生成最大树
{
int x=0;
int v1,v2;
for(int i=row*(row-1)/2-1;i>=0;i--) //判断是否构成回路
{
v1=seek(loop,Value_Array[i].start);
v2=seek(loop,Value_Array[i].end);
if(v1!=v2)
{
Bigtree_Array[x] = Value_Array[i];
loop[v1]=v2;
x++;
}
if(x==row-1)
break;
}
}
public String Clustering_exe(double param) //在最大树基础上进行聚类
{
for(int i=0;i<row-1;i++)
{
if(Bigtree_Array[i].weight>=param) //选取权值大于等于聚类参数的边
{
Clustering(Bigtree_Array[i].start,Bigtree_Array[i].end);
}
}
for(int i=1;i<=row;i++)
{
if(visited[i]==0)
{
dfs(Clustering_result, i, i - 1, 0); //调用图的遍历函数
result=result+"#";
}
}
return result;
}
private void Clustering(int x,int y) //根据当前最大树边的起点与终点值,生成聚集结果
{
Clustering_result[x][length[x]]=y+1;
length[x]++;
Clustering_result[y][length[y]]=x+1;
length[y]++;
}
private int seek(int loop[],int v)
{
int i=v;
while(loop[i]>0)
{i=loop[i];}
return i;
}
private void dfs(int cr[][],int v,int x,int y) //基于邻接表的图深度遍历实现
{
visited[v]=1;
result=result+v+",";
p=cr[x][++y];
while(p!=0)
{
if(visited[p]==0)
{
dfs(cr, p, p - 1, 0);
}
if(y<col-1)
{
p=cr[x][++y];
}
else
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -