如何将数字二维数组按相似度排序?

对具体的顺序没有要求,只需要将相似的排在一起即可。
排序的期望效果:

let source = [
    [1,3,5,7,9],
    [1,3,5,7,9],
    [1,4,5,7,9],
    [2,4,5,7,9], // 只要相似的就放在一起
    [2,5,6,7,8],
    [2,7,8,9,10],
]

需求:为了把订单按照内容快速归类提升分拣速度:即相似物料的订单会相邻放置,这样会提升物流效率。

单纯的排序算法似乎无法满足需求,因为可能只有一个高位不同,求问如何实现类似算法。

阅读 3.6k
3 个回答

一个可能的算法:
根据物料种类,设计一个关于物料的权重表(一种对照表,每个物料对应的值不同,且有一定的区分度),更重要的权重更高。

计算每个产品需求对应的物料值(比如权重相加,每种物料只计算1次)来排序即可。

let source = [
            [1, 3, 5, 7, 9],
            [1, 3, 5, 7, 9],
            [1, 4, 5, 7, 9],
            [2, 4, 5, 7, 9], // 只要相似的就放在一起
            [2, 5, 6, 7, 8],
            [2, 7, 8, 9, 10],
            [2, 3, 5, 7, 9],
        ]

        function toSort(source) {
            var list_src = JSON.parse(JSON.stringify(source));
            var list_dest = list_src.sort((cur, next) => getSortVal(cur) - getSortVal(next))
            return list_dest;
        }

        function getSortVal(arr) {
            var base = [1, 2, 3, 4, 5];
            var temp = arr.map((item, index) => Math.abs(item - base[index]))
            var sum = temp.reduce((total, cur) => total + cur)
            return sum;
        }

        console.log(toSort(source))
function sort(arr) {
    var ret = [];
    for (var i = 0; i < arr.length; ++i) {
        ret[i] = arr[i].slice().sort(function(a, b) {
            return a - b;
        });
    }
    return ret.sort(function(a, b) {
        var length = Math.min(a.length, b.length), offset = 0;
        for (var i = 0; i < length; ++i) offset += a[i] - b[i];
        return offset > 0 ? 1 : offset < 0 ? -1 : a.length - b.length;
    });
}
var source = [
    [2, 7, 8, 9, 10],
    [2, 4, 5, 7, 9],
    [2, 5, 6, 7, 8],
    [1, 4, 5, 7, 9, 10],
    [2, 5, 6, 7, 8, 9],
    [1, 3, 5, 7, 9],
    [1, 4, 5, 7, 9],
    [1, 3, 5, 7, 9]
];
console.dir(sort(source));
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题