这个实现,我打算设定一个一维数组作为节点的集合,另外设定一个二维数组,并赋好初值,例如,{1,2}就意味着节点1和节点2之间相连,二维数组就是边缘Edge的集合,我打算用下图的数据进行SCAN算法的验证。

SCAN:网络结构聚类算法(二)_java

1. 节点相似度

      节点相似度定义为两个节点共同邻居的数目与两个节点邻居数目的几何平均数的比值

2.  邻居节点
       邻居定义为与其相似度不小于  的节点所组成的集合。

3. 核节点
      核节点是指邻居数目大于u的节点

4. 直接可达
       节点是核心节点的邻居,那么就称直接可达 .

5. 可达
      节点可达,当且仅当存在一个节点链 ,使得两个节点相连

6. 相连
      若核节点u可达节点v和节点w,则称节点v和节点w相连.

7.相连聚类
      如果一个非空子图C中的所有节点是相连的,并且C是满足可达的最大子图,那么称C是一个相连聚类。

8. 桥节点(hub)
      与至少两个聚类相邻的孤立节点.

9. 离群点(outlier)
       只与一个聚类相邻或不与任何聚类相邻的孤立节点.

10. 引理:
      如果是一个核心节点,那么从可达的节点集是一个结构相连聚类

      

      在计算结构相似性的过程中,我需要构造另外一个函数,来计算二维数组的边缘中,包含第一个点的二维数组,和包含第二个点的二维数组,之后将它们相与,从二维数组中的第一列找出与第一个点相同的数组,之后再从二维数组的第二例中找出与第二个点相同的数组,如果有一个既包含第一个点也包含第二个点的集合,count加1,那么count就只有0或者1两个值,之后判断sim与阈值的关系来判断核心节点。

int []NI= {1,2,3,4,5,6,7,8,9,10,11,12,13};
    int [][]Edge = {{0,4},{0,5},{0,6},{4,5},{4,6},{1,2},{1,0},{1,5},{2,3},{2,5},{3,4},{3,5},{3,6},{6,7},{6,11},{6,10},{7,11},{7,12},{7,8},{8,12},{8,9},{9,12},{9,10},{9,13},{10,11},{10,12},{11,12}};
    public static void main(String[] args) {
        // TODO code application logic here
        Scanner input = new Scanner(System.in);
        System.out.println("please enter e:");
        double e = input.nextDouble();
        System.out.println("please enter u:");
        int u = input.nextInt();
        int CurClusterNum = 0;
     这是设置的核心节点以及二维数组,我用数据直接进行初始化,也可以像我们之前提到过的一样,分别从键盘键入一维数组和二维数组。

public static int Contain(int I){
      int number = 0;
      for(int i=0;i<2;i++)
          for(int j=0;j<27;j++){

      这个就是简单的包含的函数,用来比较第一列和第二列中是否有与输入的I相同的数组序号。