【问题标题】:Finding Unique Arrays In a List在列表中查找唯一数组
【发布时间】:2021-11-08 02:37:17
【问题描述】:

我正在构建一个游戏,用户从符号列表中进行选择,然后确定这些选择是什么。

例子:

符号:[A、B、C、D、E、F、G]

用户选择 [B, F, G],这个代表数组 [0, 1, 0, 0, 0, 1, 1] 被保存到数据库中

当用户正确复制选择时,如果选择是唯一的,我希望能够奖励积分。

唯一我的意思是如果选择与所有以前的选择有足够的不同。 到目前为止,我考虑的是将用户的选择数组与所有以前的选择数组进行比较,并检查“方差”是否至少是某个 X 值

示例 以前的选择:

  1. [1, 1, 0, 0, 0, 0, 0]
  2. [0, 1, 0, 0, 0, 0, 0]

用户的选择: [0, 1, 0, 0, 0, 1, 1]

将用户的选择数组与之前的比较,找出有多少索引不同

1)
       [0, 1, 0, 0, 0, 1, 1]
       [1, 1, 0, 0, 0, 0, 0] ---- variance = 3

2)
       [0, 1, 0, 0, 0, 1, 1]
       [0, 1, 0, 0, 0, 0, 0] ---- variance = 2

对于 3 的最小方差 (X),此用户不会获得任何奖励积分 但是对于2,他确实

有没有更好的方法来思考和实施这个?

编辑

澄清一下。我将最小方差设置为 3。 因此,在计算出用户的规则与所有其他现有规则之间的方差后,如果找到的最小方差大于 3,则用户获得奖励积分,否则不奖励。

【问题讨论】:

  • 哪种语言更适合您?也许您可以提及或标记
  • 您可以检查布隆过滤器并可能实施修改版本llimllib.github.io/bloomfilter-tutorialyoutu.be/-jiOPKt7avE
  • @mcvkr 我正在使用 Javascript,添加了标签。
  • “检查“方差”是否至少是某个 X 值” 似乎与 “对于 3 的最小方差 (X),此用户不' 没有得到任何奖励积分但是对于 2,他有”。我错过了什么?
  • @trincot 我做了一些编辑来澄清这一点

标签: javascript arrays algorithm


【解决方案1】:

您有一组大小为 7 --> [A, B, C, D, E, F, G] 的集合,对于代表性数组,您只能有 2^7 = 128 个可能的先前值。

一旦你有一个有效的查询来从数据库中选择不同的代表性数组,你的算法应该运行得非常快,即使它不是最好的时间复杂度算法。可能不值得让您的算法变得更复杂,但这是在您执行new selection & previous selection 之后找到方差的好方法:Count number of 1's in binary representation

在我看来,您应该更多地关注从数据库中检索以前不同的数组表示。您可以通过创建表示的 uniq 散列并将其与以前的表示一起存储来做到这一点。对于这个问题,你有一个很好的功能,只需计算你的表示的十进制值如下:

0 = [0, 0, 0, 0, 0, 0, 0] = 0 * 2^0 + 0 * 2^1 + 0 * 2^2 + 0 * 2^3 + 0 * 2^4 + 0 * 2^5 + 0 * 2^6   
1 = [1, 0, 0, 0, 0, 0, 0] = 1 * 2^0 + 0 * 2^1 + 0 * 2^2 + 0 * 2^3 + 0 * 2^4 + 0 * 2^5 + 0 * 2^6 
    .
    .
    .
    
127 = [1, 1, 1, 1, 1, 1, 1] = 1 * 2^0 + 1 * 2^1 + 1 * 2^2 + 1 * 2^3 + 1 * 2^4 + 1 * 2^5 + 1 * 2^6 

当您选择不同的值时,它将保证您不会超过 128 次比较

【讨论】:

    【解决方案2】:

    我认为您正在寻找 XOR ^ 运算符,然后您可以计算“一”的数量以找到差异。数据库中不需要存储数组,可以是一个简单的INT类型列。

    在你的例子中:

    1)
    0100011 -> 35   
    1100000 -> 96   
    

    然后在javascript中你可以这样做:

    a = parseInt("0100011", 2);   // it will give 35 (store only 35 as INT)
    b = parseInt("1100000", 2);   // it will give 96 (store only 96 as INT)
    
    // later when you want to calculate variance
    varDec = a ^ b;                       // varDec = 67  
    varBin = varDec.toString(2)           // varBin = "1000011"
    

    然后您应该计算varBin 变量中“一”的数量。关于这个问题的答案很少(即How to find the number of 1's in a binary representation of a number?

    variance = varBin.split('1').length-1;    // variance = 3
    

    【讨论】:

      【解决方案3】:

      我可能在这里遗漏了一些东西,但这听起来是一个相当简单的问题。我们需要一个函数来计算两个数组中的元素不匹配的索引数,称之为variance,我们需要一个函数来针对先前的列表运行当前选择并取最小值价值,称之为minVariance。这个 sn-p 有两个相当简单的版本:

      const variance = (xs) => (ys) => 
        xs .reduce ((c, x, i) => x == ys [i] ? c : c + 1, 0)
      
      const minVariance = (curr) => (prevs) => 
        Math .min (... prevs .map (variance (curr)))
      
      const prevs = [
        [1, 1, 0, 0, 0, 0, 0],
        [0, 1, 0, 0, 0, 0, 0],
      ]
      const curr = [0, 1, 0, 0, 0, 1, 1]
      
      console .log (minVariance (curr) (prevs))

      正如其他人所指出的,有些技术可能会帮助您进一步节省存储成本,但最终您将需要比较位图或整数,或转换为您已经计划好的数组。我们的minVariance 可以保持不变,只更改简单的variance

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-15
        • 2017-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-24
        相关资源
        最近更新 更多