js中如何优化邻接矩阵的存储和赋值?

image.png
根据其特性,主对角线固定为0,根据主对角线对称。
目前实际代码中还是使用数组和n*2的空间存储这个矩阵,是否有方案将矩阵vertex的空间优化至n(n-1)/2。
我目前就想到setter和getter(还未尝试
想要尽可能的减少对代码的修改。仅通过对vertex类型的修改是否就可以完成?
codesandbox链接

阅读 2.1k
1 个回答

通过代理可以完成该需求。目前计算出来的结果是正确的。目前就chunk的时候使用的reduce好像获取总长度还是有点问题。

const isSymbol = val => typeof val === 'symbol';
// 转换标准下标到邻接矩阵数组下标
const transformIndex = (index) => {
    let x = index % typeLength;
    let y = Math.floor(index / typeLength)
    x < y && ([x, y] = [y, x])
    return y * typeLength + x - (1 + (y + 1)) * (y + 1) / 2
}
const vertexBase = Array(typeLength * (typeLength - 1) / 2).fill(0)
const vertex = new Proxy(vertexBase, {
    set: function (target, key, value) {
        if (!isSymbol(key) && Number(key) >= 0) {
            const index = Number(key)
            if (index % (typeLength + 1) === 0) {
                // 主对角线 无需设置
                return
            }
            return target[transformIndex(index)] = value;
        } else {
            target[key] = value;
        }
    },
    get: function (target, key, value) {
        if (!isSymbol(key) && Number(key) >= 0) {
            const index = Number(key)
            if (index % (typeLength + 1) === 0) {
                //主对角线
                return 0
            }
            return target[transformIndex(index)];
        } else if (key === 'length') {
            return typeLength * typeLength
        } else {
            return target[key];
        }
    }
});

reduce长度的问题也解决了。就是伪数组转换一下即可。(reduce只是为了分组展示,其实不是最终需求所属部分,所以这部分代码仅调试用。空间占用不管)
image.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题