美文网首页
JavaScript 实现笛卡尔乘积

JavaScript 实现笛卡尔乘积

作者: 宫若石 | 来源:发表于2019-05-24 10:16 被阅读0次

题目:
JavaScript 实现笛卡尔乘积,一般用于商品 sku 属性配置,例如输入 ['1', '2'], ['a', 'b'], ['+', '-', 'x'] ,输出 [ '1a+', '2a+', '1b+', '2b+', '1a-', '2a-', '1b-', '2b-', '1ax', '2ax', '1bx', '2bx' ]

解决方案:
case1

function mix(arr) {
  const result = arr.reduce((accArr, currentArr) => {
    let result = []
    currentArr.forEach(c => {
      if (accArr.length) {
        accArr.forEach(a => {
          result.push(a.concat(c))
        })
      } else {
        result.push([c])
      }
    })
    return result
  }, [])
  return result.map(arr => arr.join(''))
}

console.log(mix([['1', '2'], ['a', 'b'], ['+', '-', 'x']]))

case2
若:考察的是dfs全排列,而不是复杂reduce/map

const arr = [['1', '2'], ['a', 'b'], ['+', '-', 'x']]

function mix(arr) {
    let cur = ''
    let res = []

    function search(deep = 0) {
        if (deep >= arr.length) {
            res.push(cur)
            return
       }

      for (let o of arr[deep]) {
          const tmp = cur
          cur += o
          search(deep + 1)
          cur = tmp
      }
}

search(0)
return res
}

 console.log(mix(arr))
const mix = (arr) => arr
  .reduce((acc, cur) => acc.length === 0
    ? cur
    : acc
      // 乘积
      .map(x => cur.map(y => x + y))
      // 拍平
      .reduce((acc, cur) => acc.concat(cur), []),
    []
  )
  .join(', ')

const res = mix([['1', '2'], ['a', 'b'], ['+', '-', 'x']])

console.log(res)

// 其实如果固定参数数量的话这就是一个 Applicative Functor

List.of(x => y => z => [x, y, z].join(''))
  .ap(List.of('1', '2'))
  .ap(List.of('a', 'b'))
  .ap(List.of('+', '-', 'x'))
  .join(', ')

// 所以还可以顺便用 liftA3

liftA3
  (x => y => z => [x, y, z].join(''))
  (List.of('1', '2'))
  (List.of('a', 'b'))
  (List.of('+', '-', 'x'))
  .join(', ')
const mix = (arr) => {
    const help = (a,b) => {
        if(!a.length) return b;
        return a.map(e=>b.map(u=>e+u)).reduce((pre,e)=>pre.concat(e),[])
    }
    return arr.reduce((cur,e)=>help(cur,e),[])
}
console.log(mix([['1','2'],['a','b'],['+','-','x']]))

相关文章

  • JavaScript 实现笛卡尔乘积

    题目:JavaScript 实现笛卡尔乘积,一般用于商品 sku 属性配置,例如输入 ['1', '2'], ['...

  • 三、MySQL多表查询和子查询

    1、隐式连接 1、笛卡尔乘积笛卡尔(Descartes)乘积又叫直积。假设集合A={a,b},集合B={0,1,2...

  • Oracle入门笔记【3】多表查询与分组统计查询

    1,先实现多表查询: (可以发现两个集合发生了乘积,这叫笛卡尔积问题。) 消除笛卡尔积: (这只是消除了显示的笛卡...

  • 17. Letter Combinations of a Pho

    笛卡尔乘积 Cartesian product Given a string containing digits ...

  • 笛卡尔积

    笛卡尔乘积:笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尓积(Cartesian product),又称直积表示为...

  • mysql第四天-连接查询

    连接查询 举例: 笛卡尔乘积现象:select name,boyname from beauty,boys; 添加...

  • 笛卡尔积

    1.什么笛卡尔积 百科:笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尔积(Cartesian product),又...

  • js实现商品SKU算法(笛卡尔乘积)

    笛卡尔乘积指数学中,X和Y两个集合的笛卡尔积。表示为X × Y,第一个对象是X的成员,第二个对象是Y的所有可能有序...

  • 笛卡尔积算法(PHP实现)

    第一、定义 笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尔积(Cartesian product),又称直积,表示...

  • 4.笛卡尔乘积

    笛卡尔乘积 不封闭 有序对(x,y) n元组 克林闭包=空集+正闭包 正闭包 乔姆斯基 语言,字母表 有穷集合的基...

网友评论

      本文标题:JavaScript 实现笛卡尔乘积

      本文链接:https://www.haomeiwen.com/subject/xrwwzqtx.html