HITS算法
来源:互联网 发布:淘宝天猫详情页尺寸 编辑:程序博客网 时间:2024/04/29 22:51
本代码实现hits算法的迭代计算和归一化,仅供参考使用,请大家尊重版权~,若需一键下载请移步java实现的hits算法
Main3.java:
package hits;/** * Created by bingo on 16-11-15. */public class Main3 { public static final int VERTERSNUM=4; //设定输入几个节点,现在默认为4个,便于对顶点进行赋初值(确定初始中心值和权威值比重),若要增加节点数量请务必在此先更改. public static void main(String[] args) { DirectedGraph theGraph = new DirectedGraph(); theGraph.addVertex("A");//4个节点 theGraph.addVertex("B"); theGraph.addVertex("C"); theGraph.addVertex("D"); //添加有向边 theGraph.addEdge(0, 1); theGraph.addEdge(0, 3); theGraph.addEdge(1, 3); theGraph.addEdge(2, 0); theGraph.addEdge(2, 1); theGraph.addEdge(3, 2); System.out.println("visit:"); theGraph.visithits(0.01); //进行HITS算法,迭代计算中枢值和权威值, // 收敛条件为0.01,对每个节点的最近两次中心值比重和权威值比重进行分别比较, // 若所有节点的最近两次中心值比重或权威值比重相差都小0.01则结束迭代 }}
package hits;import java.util.ArrayList;/** * Created by bingo on 16-11-15. */public class DirectedGraph { private final int HUB=1;//中心值 private final int AUTH=0;//权威值 private final int MAX_VERETS=20;//最大顶点数 private Vertex3 vertexList[];// 储存顶点的图 private int adjMat[][];//邻接矩阵 private int nVerts;//当前图的顶点数 private Stack3 theStack; public DirectedGraph(){//构建有向图 vertexList=new Vertex3[MAX_VERETS]; adjMat=new int[MAX_VERETS][MAX_VERETS]; nVerts=0; for(int j=0;j<MAX_VERETS;j++) //初始化邻接矩阵,一开始都不相连 for(int k=0;k<MAX_VERETS;k++) adjMat[j][k]=0; theStack=new Stack3(); } //添加顶点,传入一个字符串表示顶点的标志. public void addVertex(String lab){ vertexList[nVerts++]=new Vertex3(lab); } //添加边,连接哪两个点,边的符号1,0 public void addEdge(int start,int end) { adjMat[start][end] = 1; } //展示该顶点的相关值 public void displayVertex(int v){ System.out.println(vertexList[v].lable+" : " +"(中枢值: "+vertexList[v].hub+")" +"(权威值: "+vertexList[v].athu+")" +"(前一次中心值比重: "+vertexList[v].hubs1+")" +"(本次中心值比重: "+vertexList[v].hubs2+")" +"(前一次权威值比重: "+vertexList[v].athus1+")" +"(本次权威值比重: "+vertexList[v].athus2+")" ); } //返回一个由v连向j或j连向v的未被访问的顶点 public int getAdjUnvisitedVertex(int v){ for(int j=0;j<nVerts;j++) if(vertexList[j].wasVisited==false&&(adjMat[v][j]!=0||adjMat[j][v]!=0)) return j; return -1; } //获取连入v节点的所有顶点 public ArrayList<Integer> getAdjInVertex(int v){ ArrayList<Integer> a=new ArrayList<>(); for(int j=0;j<nVerts;j++) if(adjMat[j][v]!=0) a.add(j); return a; } //获取v节点连出的所有顶点 public ArrayList<Integer> getAdjOutVertex(int v){ ArrayList<Integer> a=new ArrayList<>(); for(int j=0;j<nVerts;j++) if(adjMat[v][j]!=0) a.add(j); return a; } //深度优先算法遍历,计算本阶段的中枢值或权威值.(传入参数为1则表示更新中心值,传入参数为0表示权威值) private void dfs(int ishub){ vertexList[0].wasVisited=true; updatehits(0,ishub);//更新中枢值或权威值 theStack.push(0); while(!theStack.isEmpty()){ int v=getAdjUnvisitedVertex(theStack.peek()); if(v==-1) theStack.pop(); else{ vertexList[v].wasVisited=true; updatehits(v,ishub);//更新中枢值或权威值 theStack.push(v); } } for(int j=0;j<nVerts;j++) { vertexList[j].wasVisited = false; updatehitsrats(j,ishub);//更新中枢值或权威值比重 displayVertex(j); } } //更新权威值或中心值比重 private void updatehitsrats(int v,int ishub){ int sum=0; if(ishub==1) { for (int j = 0; j < nVerts; j++) sum = sum + vertexList[j].hub; vertexList[v].hubs1 = vertexList[v].hubs2; vertexList[v].hubs2 = vertexList[v].hub / (double) sum; } else{ for (int j = 0; j < nVerts; j++) sum = sum + vertexList[j].athu; vertexList[v].athus1 = vertexList[v].athus2; vertexList[v].athus2 = vertexList[v].athu / (double) sum; } } //更新权威值或中心值 private void updatehits(int v,int ishub){ ArrayList <Integer> a; int sum=0; if(ishub==1) { a=getAdjOutVertex(v); for(int o:a){ sum=sum+vertexList[o].athu; } if(sum!=0) vertexList[v].hub=sum; } else { a=getAdjInVertex(v); for(int o:a){ sum=sum+vertexList[o].hub; } if(sum!=0) vertexList[v].athu=sum; } }//进行迭代运行HITS算法,迭代计算每个中枢值和权威值,// 收敛条件为0.01,对每个节点的最近两次中心值比重和权威值比重进行分别比较,// 若所有节点的最近两次中心值比重或权威值比重相差都小于p则结束迭代 public void visithits(double p){ int n=1; do { System.out.println("\n第"+n+"次循环"); System.out.println("更新权威值"); dfs(AUTH); System.out.println("更新中心值"); dfs(HUB); n++; }while(!isover(p)); } //遍历所有节点,对每个节点的最近两次中心值比重和权威值比重进行分别比较, // 若所有节点的最近两次中心值比重或权威值比重相差都小p则返回true;否则返回false. private boolean isover(double p){ for(int i=0;i<nVerts;i++) { if((Math.abs(vertexList[i].athus2-vertexList[i].athus1)>=p)||(Math.abs(vertexList[i].hubs2-vertexList[i].hubs1)>=p)) return false; } return true; }}
Vertex3.java
package hits;/** * Created by bingo on 16-11-15. */public class Vertex3 { public String lable;//节点标记 public int hub;//中枢值 p指向的所有节点的athu之和 public int athu;//权威值 所有指向p的所有节点的hub之和 public double hubs1;//前一次中枢值比重 public double hubs2;//本次中枢值比重 public double athus1;//前一次权威值比重 public double athus2;//本次权威值比重 public boolean wasVisited;//是否访问过 public Vertex3(String lable) { this.lable=lable; this.wasVisited = false; this.hub=1; this.athu=1; hubs1=hubs2=1/(double)Main3.VERTERSNUM; athus1=athus2=1/(double)Main3.VERTERSNUM; //这里给顶点的中枢值和权威值比重和赋初值 需要知道当前图中所有的节点数Main3.VERTERSNUM }}
Stack3.java
package hits;/** * Created by bingo on 16-11-15. */public class Stack3 { private final int SIZE=20; private int[] st; private int top; public Stack3() { st=new int[SIZE]; top=-1; } public void push(int j){ st[++top]=j; } public int pop(){return st[top--]; } public int peek(){ return st[top]; } public boolean isEmpty(){ return (top==-1); }}
1 0
- hits算法
- hits 算法
- HITS算法
- HITS算法
- HITS算法及原理
- HITS算法思想
- HITS算法的测试
- HITS算法类PageRank
- HITS算法分析
- PageRank算法和HITS算法
- HITS算法的Java实现
- HITS算法的Java实现
- HITS(HITS(Hyperlink - Induced Topic Search) ) 算法
- 搜索引擎链接算法之:HITS算法解析
- 搜索引擎算法研究专题六:HITS算法
- 链接分析算法之:HITS算法
- 链接分析算法之:HITS算法
- 链接分析算法之:HITS算法
- java计算目录及文件个数,文件夹大小
- C练习(三)
- python定时任务windows服务
- Chapter 1 用Vim配置Python IDE
- MyEclipse10安装PropertiesEditor的插件
- HITS算法
- leetcode_[python/C++逐步深入] 43. Multiply Strings_(大数乘法分析)
- 二叉寻找数的实现
- WebView详解与简单实现Android与H5互调
- leetcode 412. Fizz Buzz
- LeetCode No.82 Remove Duplicates from Sorted List II
- POJ刷题顺序
- 【寒江雪】利用异或性质实现双向链表
- masterJ2SE篇010——OutOfMemoryError