javascript – 两个数组,其中数组x中的项可以在数组y中但反之亦然,测试所有排列
作者:互联网
我编写的一个小应用程序允许用户将各种项添加到两个数组中.一些逻辑根据每个数组的内容计算一个数字.
数组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