Skip to content

Instantly share code, notes, and snippets.

@suhininalex
Created February 19, 2018 14:02
Show Gist options
  • Save suhininalex/999d92d66baaee264f427d3cccd7cfa2 to your computer and use it in GitHub Desktop.
Save suhininalex/999d92d66baaee264f427d3cccd7cfa2 to your computer and use it in GitHub Desktop.
class PageRank(val connections: Map<String, List<String>>) {
private val reversed: Map<String, List<String>> = connections
.flatMap { (k, v) -> v.map { it to k } }
.groupBy { it.first }
.mapValues { (_, v) -> v.map { it.second } }
private var pageRank: Map<String, Double> = connections.mapValues { (_, _) -> 0.0 }
private fun partialSum(point: String): Double {
return (pageRank[point] ?: 0.0) / (connections[point].orEmpty().size)
}
private fun newPageRank(point: String, d: Double = 0.85): Double {
return 1 - d + d * reversed[point].orEmpty().map { partialSum(it) }.sum()
}
fun calculate(iterations: Int = 50): Map<String, Double> {
(1..iterations).forEach { pageRank = pageRank.mapValues { (k, v) -> newPageRank(k)} }
return pageRank
}
}
fun main(args: Array<String>) {
val connections: Map<String, List<String>> = mapOf(
"Home" to listOf("About", "Product", "More"),
"About" to listOf("Home"),
"Product" to listOf("Home"),
"More" to listOf("Home")
)
val pr = PageRank(connections).calculate()
println(pr)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment