大數據算法學習筆記(2)-平面圖的直徑算法

問題

給定平面上的m個頂點以及矩陣D,D[i][j]爲第i個點到第j個點的距離;距離是對稱的,且滿足三角不等式(這樣才能保證算法的近似比爲2)。
在這裏插入圖片描述

算法步驟

1.任給k<m(只看某一行)
2.選擇使得Dkl最大的l(只看某一行)
3.輸出Dkl與k,l

算法代碼

Java

import java.util.Random;

public class PlanarGraphDiameter {
    public static void main(String[] args) {
        //初始化一個對稱矩陣,因爲距離是對稱的
        int[][] D = new int[][]{
                {1,2,3},
                {2,3,4},
                {3,4,5}
        };
        Random random = new Random();
        int l = 0, max = Integer.MIN_VALUE;
        int k = random.nextInt(D.length);//隨機取一行
        for (int j = 0; j < D[k].length; j++) {//求這行最大
            if (D[k][j] > max) {
                max = D[k][j];
                l = j;
            }
        }
        System.out.println(k+"\t"+l+"\t"+max);
    }
}

Scala

import scala.util.Random

object PlanarGraphDiameter2 {
  def main(args: Array[String]): Unit = {
    val m = 3;
    val D = Array.ofDim[Int](m, m)
    for(i <- 0 until m; j <- 0 until m) D(i)(j) = j+1 + i
    D.foreach(row=>println(row.mkString("\t")))
    val k = Random.nextInt(m)
    val l = D(k).indexOf(D(k).max)
    //val l = D(k).zipWithIndex.maxBy(_._1)._2//求最大值所在的索引,純粹的函數式手法
    println("k:"+k,"l:"+l,"D(k)(l):"+D(k)(l))
  }
}

Python

import random
m = 3
D = [[i+j+1 for j in range(m)] for i in range(m)]
print(D)
k = random.randint(0, m)
l = D[k].index(max(D[k]))
print("k:%d"%k, "l:%d"%l, "D(k)(l):%d"%D[k][l])
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章