gpt4 book ai didi

javascript - 尝试 "crossover"两个数组使用第一个数组的子集并尽可能保持第二个数组的顺序

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:57:12 25 4
gpt4 key购买 nike

我正在尝试使用以下过程从两个父数组(交叉)生成一个新的子数组。

parentArr1 = [0,1,2,3,4,5,6,7,8,9]
parentArr2 = [9,8,7,6,5,4,3,2,1,0]
parent1Subset = [2,3,4,5]
childArr = [9,8,2,3,4,5,7,6,1,0]

我定义的交叉规则是:

  1. parentArr1 中提取一个连续的子集,并将其插入到新的 childArr 中,与提取的位置相同。
  2. parentArr2 中的元素填充 childArr 中的剩余位置,并保持 parentArr2 中元素围绕子集的顺序。
  3. 不得重复。

这是另一个例子:

parentArr1 = [0,1,2,3,4,5,6,7,8,9]
parentArr2 = [9,8,7,6,5,4,3,2,1,0]
parent1Subset = [7,8,9]
childArr = [6,5,4,3,2,1,0,7,8,9]

我曾多次尝试这样做,但均以失败告终。这是最接近的尝试。

const parentArr1 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
const parentArr2 = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0];
let parent1Subset = [2, 3, 4, 5];
let childArr = crossOver(parentArr1, parentArr2, parent1Subset);
// Expected ouput: 9, 8, 2, 3, 4, 5, 7, 6, 1, 0

function crossOver(pArr1, pArr2, pArr1Subset) {
let _childArr = pArr1Subset.slice(); // suggestion from @r3wt
for (let i = 0; i < pArr1.length; i++) {
for (let j = 0; j < (pArr1.length - _childArr.length); j++) {
if (!_childArr.includes(pArr2[i])) {
_childArr.splice(i, 0, pArr2[i]);
}
}
}
return _childArr;
}
console.log("childArr: " + childArr);
// childArr: 9, 8, 7, 6, 2, 3, 4, 5, 1, 0

最佳答案

您可以为数组 2 使用另一个索引器并检查实际值是否在交叉数组中。

function crossover(p1, p2, sub) {
var j = 0;
return p1.map(i => {
if (sub.includes(i)) {
return i;
}
while (sub.includes(p2[j])) ++j;
return p2[j++];
});
}

console.log(crossover([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [9, 8, 7, 6, 5, 4, 3, 2, 1, 0], [2, 3, 4, 5]).join(' '));
console.log(crossover([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [9, 8, 7, 6, 5, 4, 3, 2, 1, 0], [7, 8, 9]).join(' '));

关于javascript - 尝试 "crossover"两个数组使用第一个数组的子集并尽可能保持第二个数组的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53009880/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com