【发布时间】:2021-04-15 05:28:00
【问题描述】:
这是一个代码挑战。我在 SO 上遇到了this question,关于测试一个数字是否包含在给定的集合中。典型的解决方案是:
const givenSet = [9, 91, 20, 18, 17, 37]
function isIncluded(x) {
return givenSet.includes(x)
}
但是,我想知道这个问题是否存在使用位掩码的解决方案?有人可以在下面填写CREATE_BITMASK和JUDGEMENT吗?
const givenSet = [9, 91, 20, 18, 17, 37]
const bitmask = CREATE_BITMASK(givenSet)
function isIncluded(x) {
return JUDGEMENT(x, bitmask)
}
其中givenSet 由适合Int32 的任意正整数组成。
我的即时观察是,如果x 等于给定集合中的n,那么我们可以应用异或来获得x ^ n === 0。 0 是一个我们可以利用的特殊数字。但我没有更多的想法。
供您参考,这里是Bitwise Operator Laws
更新:@coderLMN 指出,上述形式可能具有误导性。
基本上,我正在寻求一次性解决方案,无需遍历给定集合中的每个元素。
我真正要问的是,是否可以将要求编码(给定的集合)一个单一的数据结构(很可能是位掩码)。
一个有效的解决方案可以采用任何形式,只要它不需要为每个单独的测试迭代给定的集合。不要限制自己。
【问题讨论】:
-
“基本上我正在寻找一次性解决方案,而不需要遍历给定集合中的每个元素。”听起来您要的是 Set 对象。见developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… ...
-
不,这更像是一道数学题。真正的问题是,我们可以在多大程度上将多个元素(给定的正整数集)编码为压缩数据结构(位掩码),同时保留必要的信息(足以区分传入元素是否包含在原始集合中)。
-
我认为 coderLMN 是正确的,因为不可能将它们编码为 one 位掩码。但我想仍然可以将它们压缩成两三个这样的结构?还在想。
-
如果您的整数范围是 0...n,其中 n 在合理范围内并且您没有重复值,那么您可以使用类型化数组(例如,Uint32Array)位的索引代表数字。例如,如果设置了第 12 位,则数字 12 是您设置的一部分。如果设置了第 320 位(即 Uint32Array 中第 10 个元素的第 0 位),则数字 320 是该集合的一部分。通过这种方式,可以直接确定一个数字是否是集合的一部分,而无需扫描数组。否则,我倾向于同意 coderLMN。
标签: javascript bitmask