数组中与组件

时间:2018-06-06 06:03:37

标签: algorithm data-structures

给定n个元素的数组。问题是从数组中找到与原始数组相同OR的最小元素数。

例如arr[] = {1,2,3,4,6}。数组中所有值的OR为 7 。 如果我们只考虑元素 6,1 和OR,我们会得到 7 。所以答案是 2

我的方法是构造一个0和1的二叉树,0表示左子,1表示右子。

获取最终答案(即7)遍历树并找到最接近的数字,该数字几乎覆盖了所有位数7.在第一步之后被击中的类型。

任何人都可以提示如何继续下一次迭代。

3 个答案:

答案 0 :(得分:2)

这是Set Cover problem,这是NP难的。 OR-ed数组中的1位是被覆盖的集合,数组映射子集中的数字,即每个数字代表以二进制表示形式设置的数字的子集。

贪心算法产生log(N)近似比。证明:https://www.cs.cmu.edu/~avrim/451f12/lectures/lect1106.pdf

答案 1 :(得分:0)

有助于优化的一些见解。

  1. 任何被另一个人“完全屏蔽”/黯然失色的数字,其OR操作例如是a | b == b是真的,那么a对解决方案没用。

  2. 设置的二进制位数很重要,设置的位数越多,越多 可能它将成为最终解决方案的一部分。

  3. 与其他许多共同位的数字不太可能出现在 溶液

  4. 因此,我认为进入的方向是计算每个数字中唯一位的数量,这些位数不会出现在任何其他数字上。如果你找到一个,那将是解决方案。如果没有,请选择设置数量最少的数字,然后递归分解问题。

    一旦您将问题缩小到单个数字的单个数字,您就可以计算其他每个数据中唯一比特的数量,这与已经在解决方案中找到的数量不同。

    多次这样做,递归应该让你得到答案。

    如何进一步优化它我不知道。

答案 2 :(得分:0)

我认为这只能通过尝试所有可能的组合并选择(一个)整数的最小组合来解决,这些整数具有与所有值相同的'或'值'或者在一起。

对于更大的整数集,这会爆发。

使用我的greedy algorithm可以获得良好的结果。 如果数字(映射到测试)由表示在其二进制表示中设置哪些位(映射到测试覆盖)来表示,则贪婪算法将给出覆盖所有可能位的整数子集,通常非常小

相关问题