页面权值

这两天为了完成作业写了一个计算页面计算权值的程序。
通过一个邻接表进行记录页面之间的关系。计算每一个页面的权值、
当前我只做了三个页面的,希望大虾们提意见让这个破程序一点点的完善

import java.util.*;
public class MyPageRank {
double a = 1.0;//代表三个页面的权值
double b = 1.0;
double c = 1.0;
double oldA = 1.0;//保存三个页面的权值
double oldB = 1.0;
double oldC = 1.0;
Map<Integer,Number> m = new HashMap<Integer,Number>();//用来记录索引和变量之间的关系
int [][]degree = new int[3][3];//记录临街表
int []out = new int[3];//记录每一个页面的出度
List<Integer> l1 = new ArrayList<Integer>();//用来存储链入当前页面的页面
List<Integer> l2 = new ArrayList<Integer>();
List<Integer> l3 = new ArrayList<Integer>();
/**
* 初始化m值
*/
public MyPageRank(){
m.put(0, a);
m.put(1, b);
m.put(2, c);
}
/**
* 初始化邻接表
*/
public void initMatrix(){
degree[0][0] = 0;
degree[0][1] = 1;
degree[0][2] = 1;
degree[1][0] = 0;
degree[1][1] = 0;
degree[1][2] = 1;
degree[2][0] = 1;
degree[2][1] = 0;
degree[2][2] = 0;
}
/**
* 计算出度值
* @return 出度值
*/
public int[] calculateO(){


for(int i=0;i<degree.length;i++){
for(int j=0;j<degree.length;j++){
if(degree[i][j]==1){
out[i]++;
}
}
//System.out.println(out[i]);
}
return out;

}

/**
*计算每一个页面的入度
*/
public void calculateWI(){

for(int i=0;i<degree.length;i++){
for(int j=0;j<degree.length;j++){
if(degree[i][j]==1&&j==0)l1.add(i);
else if(degree[i][1]==1&&j==1)l2.add(i);
else if(degree[i][2]==1&&j==2)l3.add(i);
}
}
}

/**
* 计算每一个页面的权值
*/
public void calculate(){
this.initMatrix();
this.calculateO();
this.calculateWI();
double linA = 0.0;
double linB = 0.0;
double linC = 0.0;


while(true){
/*
* 计算a值
*/
for(int i=0;i<l1.size();i++){

double d = (Double)m.get(l1.get(i));
int l = out[l1.get(i)];
linA += d/l;
}
a = 0.5 + 0.5*linA;
linA = 0.0;
m.remove(0);
m.put(0, a);

/*
* 计算b值
*/
for(int i=0;i<l2.size();i++){

double d = (Double)m.get(l2.get(i));
int l = out[l2.get(i)];
linB +=d/l;
}
b = 0.5 + 0.5*linB;
linB = 0.0;
m.remove(1);
m.put(1, b);

/*
* 计算c值
*/
for(int i=0;i<l3.size();i++){

double d = (Double)m.get(l3.get(i));
int l = out[l3.get(i)];
linC +=d/l;
}
c = 0.5 + 0.5*linC;
linC = 0.0;
m.remove(2);
m.put(2, c);

/*
* 符合条件时跳出
*/
if(oldA==a&&oldB==b&&oldC==c){
break;
}

oldA = a;
oldB = b;
oldC = c;


System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println("---------------");
}
}


public static void main(String []args){

MyPageRank mpr = new MyPageRank();
mpr.calculate();

}



}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值