【问题标题】:Is there an efficient algorithm in JavaScript to find the number of distinct arrays within a larger array set?JavaScript 中是否有一种有效的算法来查找较大数组集中不同数组的数量?
【发布时间】:2019-12-27 08:05:55
【问题描述】:

给定以下数组

let array = [[1, 2], [1, 2], [3, 4], [5, 6], [2, 1]]

我想返回这个集合中不同数组的数量。所以上面的例子应该返回3。我如何实现这一目标?我尝试了下面的代码,但它没有给出正确的答案

let distinct = 0
for (let i = 0; i < array.length; i++) {

  for (let j = i + 1; j < array.length - i; j++) {
    let difference = ingredients[i].filter(x => !array[j].includes(x))
     if (difference.length > 0) {
       distinct += 1;   
     } 
   }
 }

 return distinct;

【问题讨论】:

    标签: javascript arrays algorithm


    【解决方案1】:

    如果子项内的顺序很重要

    使用Array.map()将每个子数组转换成字符串(我用String()作为suggested by @trincot),从数组中创建一个Set来去除重复,并得到Set的大小:

    const array = [[1, 2], [1, 2], [3, 4], [5, 6]]
    
    const distinct = new Set(array.map(String))
    
    console.log(distinct.size)

    如果顺序无关紧要

    对每个子项进行排序,然后转换为字符串:

    const array = [[2, 1], [1, 2], [3, 4], [5, 6]]
    
    const distinct = new Set(array.map(o => String(o.sort())))
    
    console.log(distinct.size)

    【讨论】:

    • 我觉得JSON.stringify足以区分数组,不用join
    • @VLAZ 虽然加入可能会稍微更有效率?不过,如果这能产生影响的话。
    • 您甚至可以只使用map(String),前提是可以保证输入包含没有分隔符的内容。这将在内部执行join,因此至少同样有效。
    • 有时候 JS 看起来真的很好,它读起来就像“映射到字符串的新数组集”。
    • 顺便说一句,通常按数字对数字进行排序很重要,例如:o.sort((a, b) =&gt; a - b)。在这里,我们可以“摆脱”按字母顺序对它们进行排序,例如:o.sort(),因为我们不需要有意义的排序顺序,只需一个一致的排序即可。
    【解决方案2】:

    我根本没有检查你的算法,只是更正了你的语法。这是你要写的吗?:

    let array = [
      [1, 2],[1, 2],[3, 4],[5, 6]
    ];
    
    console.log(countDistinctArrays(array));
    
    function countDistinctArrays(parentArray) {
      let distinct = 0;
      for (let i = 0; i < parentArray.length; i++) {
        for (let j = i + 1; j < parentArray.length - i; j++) {
          let difference = parentArray[i].filter(x => !parentArray[j].includes(x))
          if (difference.length > 0) {
            distinct += 1;
          }
        }
      }
      return distinct;
    }

    【讨论】:

    • 很好地分析和修复了原始算法,尽管如此简单的操作只需一行代码即可完成。不过,修复原始代码值得 +1。
    【解决方案3】:

    这是您可以尝试的方法。尝试将内部数组转换为字符串,然后过滤欺骗并再次解析字符串

    var pp =  [[1, 2], [1, 2] ,[3, 4] ,[5, 6]];
    var distict = pp.map(ar=>JSON.stringify(ar))
      .filter((itm, idx, arr) => arr.indexOf(itm) === idx)
      .map(str=>JSON.parse(str));
    
    console.log(distict.length);

    【讨论】:

    • 我正在寻找一种不依赖于数组项顺序的算法。例如,如果我添加数组 [2, 1] 我应该仍然能够得到 3。但我得到 4。我希望 [2, 1] 与 [1, 2] 无法区分
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-17
    • 2011-12-11
    • 2011-10-08
    • 1970-01-01
    • 2017-04-30
    • 1970-01-01
    相关资源
    最近更新 更多