如何在JavaScript中将邻接矩阵转换为邻接列表?

时间:2019-03-11 22:07:10

标签: javascript multidimensional-array adjacency-matrix adjacency-list converters

我正在尝试实现一种将邻接矩阵转换为邻接表的方法。我的实现无法正确地从矩阵转换为列表。 这是我第一次尝试,

//Adjacency Matrix to Adjc list

function convertToAdjList(adjMatrix) {
  var adjList = new Array(adjMatrix.length - 1);

  for (var i = 0; i < adjMatrix.length; i++) {
    if (adjMatrix[i] == 1) {
      //I think i have to do something here.
    }
    for (var j = 0; j < adjMatrix.length - 1; j++) {
      if (adjMatrix[i][j] == 1) {
        adjList[i] = i;//not sure if this is quite right.
      }
    }
  }
  return adjList;
}
var testMatrix = [
  [0, 1, 1, 1],
  [1, 0, 0, 0],
  [1, 0, 0, 0],
  [1, 0, 0, 0]
];
console.log(convertToAdjList(testMatrix)); //[[1,2,3],[0],[0],[0];

输出只是我希望代码输出的4个数组之一,加上索引0处的零。是否有人知道如何解决该问题?

2 个答案:

答案 0 :(得分:1)

您可以将索引或-1映射为不需要的值,然后过滤该值。

function convertToAdjList(adjMatrix) {
    return adjMatrix.map(a => a.map((v, i) => v ? i : -1).filter(v => v !== -1))
}

var testMatrix = [ [0, 1, 1, 1], [1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0]];

console.log(convertToAdjList(testMatrix)); // [[1, 2, 3], [0], [0], [0]]
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:1)

不使用“地图”的另一种方法是像下面这样编写,虽然效果不佳,但仍然可以完成工作。

function convertToAdjList(adjMatrix) {
  var adjList = [];
  for (var i = 0; i < adjMatrix.length; i++) {
    var array=[];
    for (var j = 0; j < adjMatrix.length; j++) {
      if (adjMatrix[i][j] == 1) {
        array.push(j);
      }
    }
    adjList[i]=array;

  }
   return adjList;
}

可以提到,时间复杂度就像O(V ^ 2)。但是,我想如果要将邻接列表转换为邻接矩阵,则时间复杂度将类似于O(V * E)。