Java计算图的匹配率
2016-07-02

大概意思就是这样了,代码里我貌似没有计算最后一步,但是原理都是一样的、、、、、R1有5个点P1有四个点,他们共同的点是4个,那就是共同点4*4/(R1的5个点*P1的四个点就是0.8啦)
我这个代码又一个投机取巧的地方,就是你算两个图的最大共有连通子图的时候,不单单要两个图都有这些点,这些点所连接得边其实也是必须一样,我这里就是找有公共的点但是这些点连接的边是否都有我并没考虑。。。。。。。。
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner; public class catchmain {
void initgraph(int a,catchrate []pis)
{
for(int z=1;z<=a;z++) { System.out.println("请输入该组第"+z+"个图的节点数:");
Scanner cinn=new Scanner(System.in);
int n,e;//分别代表结点个数和边的数
n=cinn.nextInt();
System.out.println("请输入该组第"+z+"个图的起始点char型表示:");
Scanner cinn2=new Scanner(System.in);
String str=cinn2.next();
//String labels[]=new String[n];//结点的标识
catchrate graph=new catchrate(n);
// pis[z-1]=graph; for(int i=0;i<n;i++) {
char sss=(char)(str.charAt(0)+i); graph.insertVertex(sss);//插入结点
}
//插入e条边
System.out.println("请输入该组第"+z+"个图的边数:");
Scanner cinn3=new Scanner(System.in);
e=cinn3.nextInt();
for(int aa=0;aa<e;aa++)
{
System.out.println("from:");
Scanner top=new Scanner(System.in);
System.out.println("to:");
Scanner bottom=new Scanner(System.in);
graph.insertEdge(top.nextInt()-1, bottom.nextInt()-1, 1);
} System.out.println("结点个数是:"+graph.getNumOfVertex());
System.out.println("边的个数是:"+graph.getNumOfEdges());
pis[z-1]=graph;
} }
public Object clone()
{
Object o=null;
try
{
o=(ArrayList)super.clone();//Object 中的clone()识别出你要复制的是哪一个对象。
}
catch(CloneNotSupportedException e)
{
System.out.println(e.toString());
}
return o;
}
int Jiao(ArrayList A,ArrayList B)
{
ArrayList temp=new ArrayList(A.size()); temp=(ArrayList) A.clone();
//System.out.print(A.size()+",,,"+temp.size());
temp.retainAll(B);
//System.out.println(temp);
//System.out.print(A.size()+",,,"+temp.size());
return temp.size();
}
public static void main(String args[]) {
catchmain A=new catchmain(); System.out.print("第一组图的个数:");
Scanner cin=new Scanner(System.in);
int numgraph=cin.nextInt(); catchrate pis1[]=new catchrate[numgraph];
A.initgraph(numgraph,pis1); //............................................
System.out.print("第2组图的个数:");
Scanner con=new Scanner(System.in);
int numg2=cin.nextInt(); catchrate pis2[]=new catchrate[numg2];
A.initgraph(numg2,pis2); //取两个图的交集retainall、、边的交集也要比对是否存在,这里为了方便假设点交集中所有的连接边
//在R中有的边在p中也都有,免去边求交集的步骤。
for(int i=0;i<numgraph;i++)
{
for(int j=0;j<numg2;j++)
{
int result=A.Jiao(pis1[i].getarraylist(),pis2[j].getarraylist());
System.out.println("公共节点数:"+result);
System.out.println("num of node everygraph:"+pis1[i].getarraylist().size()+"....."+pis2[j].getarraylist().size());
int fenmu=(pis1[i].getarraylist().size())*(pis2[j].getarraylist().size());
float rate=(float)(result*result)/(fenmu);
float b = (float)(Math.round(rate*100))/100;
System.out.println("第一组"+(i+1)+"图和第二组"+(j+1)+"图的匹配率为"+b);
}
} }
}
import java.util.ArrayList;
import java.util.LinkedList;
/**
* @description 邻接矩阵模型类
* @author beanlam
* @time 2015.4.17
*/
public class catchrate {
private ArrayList vertexList;//存储点的链表
private int[][] edges;//邻接矩阵,用来存储边
private int numOfEdges;//边的数目 public catchrate(int n) {
//初始化矩阵,一维数组,和边的数目
edges=new int[n][n];
vertexList=new ArrayList(n);
numOfEdges=0;
}
public ArrayList getarraylist()
{
return vertexList;
}
//得到结点的个数
public int getNumOfVertex() {
return vertexList.size();
} //得到边的数目
public int getNumOfEdges() {
return numOfEdges;
} //返回结点i的数据
public Object getValueByIndex(int i) {
return vertexList.get(i);
} //返回v1,v2的权值
public int getWeight(int v1,int v2) {
return edges[v1][v2];
} //插入结点
public void insertVertex(Object vertex) {
vertexList.add(vertexList.size(),vertex);
} //插入边
public void insertEdge(int v1,int v2,int weight) {
edges[v1][v2]=weight;
edges[v2][v1]=weight;
numOfEdges++;
} //删除边
public void deleteEdge(int v1,int v2) {
edges[v1][v2]=0;
numOfEdges--;
} //得到第一个邻接结点的下标
public int getFirstNeighbor(int index) {
for(int j=0;j<vertexList.size();j++) {
if (edges[index][j]>0) {
return j;
}
}
return -1;
} //根据前一个邻接结点的下标来取得下一个邻接结点
public int getNextNeighbor(int v1,int v2) {
for (int j=v2+1;j<vertexList.size();j++) {
if (edges[v1][j]>0) {
return j;
}
}
return -1;
}
}
这个代码是自己输入图图的顶点图得边以及每个组有几个图,我没有仔细试试,估计错误会有很多,网批评指正吧。
Java计算图的匹配率的更多相关文章
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- Floyd算法(三)之 Java详解
前面分别通过C和C++实现了弗洛伊德算法,本文介绍弗洛伊德算法的Java实现. 目录 1. 弗洛伊德算法介绍 2. 弗洛伊德算法图解 3. 弗洛伊德算法的代码说明 4. 弗洛伊德算法的源码 转载请注明 ...
- 【转】java开源类库pinyin4j的使用
最近CMS系统为了增加查询的匹配率,需要增加拼音检索字段,在网上找到了pinyin4j的java开源类库,提供中文转汉语拼音(并且支持多音字), 呵呵,看了看他的demo,决定就用它了,因为我在实际使 ...
- 2013第四届蓝桥杯决赛Java高职高专组题目以及解法答案
2013第四届蓝桥杯决赛Java高职高专组题目以及解法答案 不知不觉离决赛都过去一个月了,一直忙于各种事情,都忘记整理一份试题.当作回忆也好. 1. 标题:好好学习 汤姆跟爷爷来中国旅游.一天,他帮助 ...
- Dijkstra算法之 Java详解
转载:http://www.cnblogs.com/skywang12345/ 迪杰斯特拉算法介绍 迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主 ...
- Java图片比对
在自动化测试中,除了普通的值验证,经常还有一些图片验证,比如图片的匹配率,输出图片的差异图片等.本文主要用到了BufferedImage类来操作图片比对和输出差异图片,大体的思路如下: 1. 通过Im ...
- 20172302 《Java软件结构与数据结构》第九周学习总结
2018年学习总结博客总目录:第一周 第二周 第三周 第四周 第五周 第六周 第七周 第八周 第九周 教材学习内容总结 第十五章 图 1.图:图(graph)是由一些点(vertex)和这些点之间的连 ...
- Fork/Join 框架-设计与实现(翻译自论文《A Java Fork/Join Framework》原作者 Doug Lea)
作者简介 Dong Lea任职于纽约州立大学奥斯威戈分校(State University of New York at Oswego),他发布了第一个广泛使用的java collections框架实 ...
- 算法笔记_204:第四届蓝桥杯软件类决赛真题(Java语言C组)
目录 1 好好学习 2 埃及分数 3 金蝉素数 4 横向打印二叉树 5 危险系数 6 公式求值 前言:以下代码仅供参考,若有错误欢迎指正哦~ 1 好好学习 汤姆跟爷爷来中国旅游.一天,他帮助中国的 ...
随机推荐
- linux 查看文件夹下的文件个数(当前目录的文件数)//包含子目录
ls -l |grep "^-"|wc -l //验证了redhat好用 或 find ./company -type f | wc -l 查看某文件夹下文件的个数,包括子文件 ...
- 用linux的iconv函数 转换编码
inux shell 配置文件中默认的字符集编码为UTF-8 .UTF-8是unicode的一种表达方式,gb2312是和unicode都是字符的编码方式,所以说gb2312跟utf-8的概念应该不是 ...
- Mongodb 主从同步
第一步:我们把mongodb部署多服务器上10.12.0.3和10.14.0.1. 第二步:启动10.12.0.3上的mongodb,把该数据库指定为主数据库 先启动主: mongod --port ...
- MongoDB整库备份+整库导入
备份前检查: [root@Load29 tmp]# mongo localhost: MongoDB shell version: connecting to: localhost:/test Ser ...
- ESXI5.5设置主机的时间自动同步服务 NTP
背景:现在公司的很多线上服务也都通过虚拟化来实现,最近遇到一个小问题,虚拟机上的时间不准确.原来是虚拟机会主动同步宿主机时间,一般虚拟机中都安装vmware tool工具,这个工具会自动和宿主机进行时 ...
- Logistic回归的两种形式y=0/1,y=+1/-1
第一种形式:y=0/1 第二种形式:y=+1/-1 第一种形式的损失函数可由极大似然估计推出: 第二种形式的损失函数: , 参考:https://en.wikipedia.org/wiki/Loss ...
- C# Atomic<T> Generic
using System; using System.Threading; /// <summary> /// Provides lock-free atomic read/write u ...
- 配置Ubuntu虚拟环境
1.ubuntu默认root用户没有激活,激活root用户,就要为root用户创建密码 $sudo passwd root 2.修改主机名 $vi /etc/hostname 3.安装ssh服 ...
- 查看shell环境下,网络是否连通-curl/ping
检查网络是否可用 curl www.baidu.com <!--STATUS OK--><html>...</html> ping www.baidu.com注意: ...
- DistCp 集群之间数据拷贝工具
DistCp(分布式拷贝)是用于大规模集群内部和集群之间拷贝的工具.可以将数据拷贝到另个一集群,也可以将另一个集群的数据拷贝到本集群.