读者盆友,中午好,这里分享下PageRank算法的核心思想。
本博客代码示例均来自:算法 Algorithmes Forth Edition
[美] Robert Sedgewick Kevin Wayne 著 谢路云译
S.Brin 和L.Page 发明的PageRank算法,里面非常重要的思想是:
网页总数虽然很多,但是单个网页的链接并不多。
背后的数学思想:矩阵*向量 -》 稀疏的
package com.cmh.algorithm;
import edu.princeton.cs.algs4.ST;
/**
* 能够完成点乘的稀疏向量
* <p>
* Author:起舞的日子
* Date: 2020/4/18 上午8:13
*/
public class SparseVector {
private ST<Integer, Double> st;
public SparseVector() {
st = new ST<>();
}
public int size() {
return st.size();
}
public void put(int i, double x) {
st.put(i, x);
}
public double get(int i) {
if (!st.contains(i)) {
return 0.0;
} else {
return st.get(i);
}
}
public double dot(double[] that) {
double sum = 0.0;
for (int i : st.keys()) {
sum += that[i] * this.get(i);
}
return sum;
}
/**
* 总结:
* 1、PageRank算法的核心思想:矩阵和向量的乘法+稀疏向量
*/
public void classicMatrixImp() {
int N = 10000000;
double[][] a = new double[N][N];
double[] x = new double[N];
double[] b = new double[N];
/**
* 初始化省略
*/
for (int i = 0; i < N; i++) {
double sum = 0.0;
for (int j = 0; j < N; j++) {
sum += a[i][j] * x[j];
}
b[i] = sum;
}
}
}
https://github.com/cmhhcm/my2020.git
这篇博客单独成篇,虽然内容少,但是借此提醒自己这个算法背后的思想是多么的重要。
使用符号表能够将矩阵和向量乘法的速度提升10亿甚至更多。
另外对作者说的那句话印象深刻,记录下:
这种应用(用符号表来实现巨型稀疏矩阵)虽然简单但非常重要,不愿意挖掘其中省时省力的潜力的程序员解决实际问题能力的潜力也必然是有限的,能够将运行速度提升几十亿倍的程序员勇于面对看似无法解决的问题。
经典!