账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    js中如何优化邻接矩阵的存储和赋值?
    70
    0
    根据其特性,主对角线固定为0,根据主对角线对称。目前实际代码中还是使用数组和n*2的空间存储这个矩阵,是否有方案将矩阵vertex的空间优化至n(n-1)/2。我目前就想到setter和getter(还未尝试想要尽可能的减少对代码的修改。仅通过对vertex类型的修改是否就可以完成?codesandbox链接
    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 抹茶味的百奇 普通会员 1楼

      在JavaScript中,邻接矩阵是一种用于存储有向图的数据结构。邻接矩阵是一种二维数组,其中的每个元素表示一个顶点及其周围的边的数量。

      在JavaScript中,可以使用如下方式优化邻接矩阵的存储和赋值:

      1. 使用 Set:

      可以使用Set数据结构来存储邻接矩阵,因为Set不会重复添加元素,所以可以避免重复的边。

      javascript let adjMatrix = new Set(); // 添加边 adjMatrix.add([0, 1, 0]); adjMatrix.add([1, 0, 0]); adjMatrix.add([0, 0, 1]); adjMatrix.add([1, 1, 0]); adjMatrix.add([0, 1, 1]); // 获取边 let edges = adjMatrix.has([0, 1]) ? adjMatrix.get([0, 1]) : null; // 保存邻接矩阵 adjMatrix.set([0, 1, 0]); adjMatrix.set([1, 0, 0]); adjMatrix.set([0, 0, 1]); adjMatrix.set([1, 1, 0]); adjMatrix.set([0, 1, 1]); // 删除边 adjMatrix.delete([0, 1]); adjMatrix.delete([1, 0]); adjMatrix.delete([0, 0]); adjMatrix.delete([1, 1]); adjMatrix.delete([0, 1]); // 获取邻接矩阵 edges = adjMatrix.has([0, 1]) ? adjMatrix.get([0, 1]) : null; // 获取顶点 let vertices = adjMatrix.has([0, 1]) ? adjMatrix.get([0, 1]) : null; // 保存顶点 vertices.set([0, 1]); vertices.set([1, 0]); vertices.set([0, 0]); vertices.set([1, 1]); vertices.set([0, 1]); // 保存顶点 vertices.set([0, 1]); vertices.set([1, 0]); vertices.set([0, 0]); vertices.set([1, 1]); vertices.set([0, 1]); // 保存顶点 vertices.set([0, 1]); vertices.set([1, 0]); vertices.set([0, 0]); vertices.set([1, 1]); vertices.set([0, 1]); // 保存顶点 vertices.set([0, 1]); vertices.set([1, 0]); vertices.set([0, 0]); vertices.set([1, 1]); vertices.set([0, 1]); // 保存顶点 vertices.set([0, 1]); vertices.set([1, 0]); vertices.set([0, 0]); vertices.set([1, 1]); vertices.set([0, 1]);

      1. 使用 Map(数组或对象):

      可以使用Map(数组或对象)来存储邻接矩阵,因为Map可以按照键值对的方式存储元素,这样可以避免重复的边。

      javascript let adjMatrix = new Map(); // 添加边 adjMatrix.set([0, 1], 1); adjMatrix.set([1, 0], 0); adjMatrix.set([0, 0], 2); adjMatrix.set([1, 1], 1); adjMatrix.set([0, 1], 2); // 获取边 let edges = adjMatrix.has([0, 1]) ? adjMatrix.get([0, 1]) : null; // 保存邻接矩阵 adjMatrix.set([0, 1], 1); adjMatrix.set([1, 0], 0); adjMatrix.set([0, 0], 2); adjMatrix.set([1, 1], 1); adjMatrix.set([0, 1], 2); // 删除边 adjMatrix.delete([0, 1]); adjMatrix.delete([1, 0]); adjMatrix.delete([0, 0]); adjMatrix.delete([1, 1]); adjMatrix.delete([0, 1]); // 获取邻接矩阵 edges = adjMatrix.has([0, 1]) ? adjMatrix.get([0, 1]) : null; // 获取顶点 let vertices = adjMatrix.has([0, 1]) ? adjMatrix.get([0, 1]) : null; // 保存顶点 vertices.set([0, 1]); vertices.set([1, 0]); vertices.set([0, 0]); vertices.set([1, 1]); vertices.set([0, 1]); // 保存顶点 vertices.set([0, 1]); vertices.set([1, 0]); vertices.set([0, 0]); vertices.set([1, 1]); vertices.set([0, 1]); // 保存顶点 vertices.set([0, 1]); vertices.set([1, 0]); vertices.set([0, 0]); vertices.set([1, 1]); vertices.set([0, 1]); // 保存顶点 vertices.set([0, 1]); vertices.set([1, 0]); vertices.set([0, 0]); vertices.set([1, 1]); vertices.set([0, 1]);

      1. 使用循环队列:

      可以使用循环队列(数组或对象)来存储邻接矩阵,因为循环队列可以按照元素的添加和删除顺序存储元素。

      javascript let adjMatrix = new Map(); // 添加边 adjMatrix.set([0, 1], 1); adjMatrix.set([1, 0], 0); adjMatrix.set([0, 0], 2); adjMatrix.set([1, 1], 1); adjMatrix.set([0, 1], 2); // 添加元素到循环队列 let queue = new Array(3); queue[0] = [0, 1]; queue[1] = [1, 0]; queue[2] = [0, 0]; queue[0].push([0, 1]); queue[1].push([1, 0]); queue[2].push([0, 0]); // 遍历循环队列 for (let i = 0; i < 3; i++) { let [v, e] = queue[i]; // 保存顶点 vertices.set(v); edges.set(e); } // 删除边 adjMatrix.delete([0, 1]); adjMatrix.delete([1, 0]); adjMatrix.delete([0, 0]); adjMatrix.delete([1, 1]); adjMatrix.delete([0, 1]); // 获取邻接矩阵 edges = adjMatrix.has([0, 1]) ? adjMatrix.get([0, 1]) : null; // 获取顶点 let vertices = adjMatrix.has([0, 1]) ? adjMatrix.get([0, 1]) : null; // 保存顶点 vertices.set([0, 1]); vertices.set([1, 0]); vertices.set([0, 0]); vertices.set([1, 1]); vertices.set([0, 1]); // 保存顶点 vertices.set([0, 1]); vertices.set([1, 0]); vertices.set([0, 0]); vertices.set([1, 1]); vertices.set([0, 1]);

      1. 使用优先队列:

      可以使用优先队列(数组或对象)来存储邻接矩阵,因为优先队列可以按照元素的添加顺序存储元素。

      ```javascript let adjMatrix = new Map(); // 添加边 adjMatrix.set([0, 1], 1); adjMatrix.set([1, 0], 0); adjMatrix.set([0, 0], 2); adjMatrix.set([1, 1], 1); adjMatrix.set([0, 1], 2); // 添加元素到优先队列 let queue = new Array(3); queue[0] = [0, 1]; queue[1] = [1, 0]; queue[2] = [0, 0]; queue[0].push([0, 1]); queue[1].push([1, 0]); queue[2].push([0, 0]); // 遍历优先队列 for (let i = 0; i < 3; i++) { let [v, e] = queue[i]; // 保存顶点 vertices.set(v); edges.set(e); } // 删除边 adjMatrix.delete([0, 1]); adjMatrix.delete([

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部