ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

javascript – 两个数组,其中数组x中的项可以在数组y中但反之亦然,测试所有排列

2019-09-23 07:35:32  阅读:178  来源: 互联网

标签:javascript arrays for-loop bit-manipulation powerset


我编写的一个小应用程序允许用户将各种项添加到两个数组中.一些逻辑根据每个数组的内容计算一个数字.

数组x中的任何项都可以放入数组y,然后再放回.属于数组y的项永远不能移动(除非它们是从数组x移动的).

用户可以使用简单的javascript ui在两个列表中移动这些项目.为了简单起见,我最初编写了一个天真的脚本:

>将项目从a移动到y.
>使用这种“可能性”执行一些逻辑
>如果结果小于之前,则将x保留为y.
>如果不是,则x保持在x中.
>转到x中的下一个项目并重复.

我知道这是无效的.我已经阅读并且被告知这样做使用按位数学来记住可能性或“排列”但我正在努力在这个阶段解决这个特定问题.

如果有人能够解释(伪代码是好的)什么是实现以下的最佳方式,我将非常感激.

数组x = [100,200,300,400,500]
   数组y = [50,150,350,900]

使用这两个数组,对于x中的每个值,将该值的所有组合以及x中的所有其他值推送到数组y.对于每一个,我将执行一些逻辑(即测试结果并将此’置换’存储在一个数组中(两个数组的对象代表x和y).我预见这对于大型数组来说相当昂贵,可能会重复很多组合.我觉得我几乎就在那里,但在最后阶段输了.

很抱歉很长的解释,并提前感谢!

解决方法:

用它来创建x的power set

function power(x, y) {
    var r = [y || []], // an empty set/array as fallback
        l = 1;
    for (var i=0; i<x.length; l=1<<++i) // OK, l is just r[i].length, but this looks nicer :)
        for (var j=0; j<l; j++) {
            r.push(r[j].slice(0)); // copy
            r[j].push(x[i]);
        }
    return r;
}

用法:

> power([0,2], [5,6])
[[5,6,0,2], [5,6,2], [5,6,0], [5,6]]

I have been told do this using bitwise math to remember the possibilities or ‘permutations’ but I am struggling to get my head around this particular problem at this stage.

它将迭代到2n(对于长度为n的数组),使用单个位来确定项是否应该包含在子集中.数组[a,b]的示例:

i   binary   included in set
-----------------------------
0   00       {      }
1   01       {    b }
2   10       { a    }
3   11       { a, b }

我们可以在JS中使用bitwise operators来获取最多31个项目的数组(这应该足够了).

function power(x, y) {
    var l = Math.pow(2, x.length),
        r = new Array(l);
    for (var i=0; i<l; i++) {
        var sub = y ? y.slice(0) : [];
        for (var j=0; j<x.length; j++)
            // if the jth bit from the right is set in i
            if (i & Math.pow(2,j)) // Math.pow(2,j) === 1<<j
                sub.push(x[j]);
        r[i] = sub;
    }
    return r;
}

标签:javascript,arrays,for-loop,bit-manipulation,powerset
来源: https://codeday.me/bug/20190923/1814304.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有