假设你有一个长度为n的二进制向量(每个元素可以是0,1或X,对应于0或1)。
例如,给定N=4:
1001是单个二进制向量1XX1表示四个不同的二进制向量{1001,1011,1101,1111}
现在假设你有三种不同的描述,例如
X11X 1XX1 11XX
找到这组规范描述的唯一二进制向量的数量的有效解决方案是什么?
请注意,当N增长时,蛮力解决方案变得不切实际,因此列出所有可能的向量并删除重复项不是可行的解决方案。还请注意,我们只想知道唯一向量的数量,但不需要计算它们的确切值。
使用此示例的解决方案进行编辑,该解决方案为:
X11X -
1XX1 -
11XX --
在这12个向量中,我们只想计算唯一的向量,即8个。
0110 0111 1110 1111 1001 1011 1101 1100
如果模式数量保持较小,则可以使用包含-排除类型方法解决此问题。
每个模式的二进制向量的数量很容易计算:它正好是2的适当幂。现在,模式的总数就是每个模式的二元向量的和,减去每对模式的公共解的二元向量的数量,加上每个三元组的公共解的数量,等等。
集合模式的常见解再次是单个模式的解决方案:如果在某个位置,一个模式具有 0,而另一个模式具有 1,则没有公共解决方案。否则,如果其中一个形态在此位置处有 0 或 1,则我们通过将 0 或 1 放在某个位置来获得形态,如果所有形态在此位置都有 X,则为 X。
我会使用包含排除原则。您想知道集合的并集的基数。对于您的示例,您有:
N(X11X || 1XX1 || 11XX) = N(X11X) + N(1XX1) + N(11XX) -
N(X11X && 1XX1) - N(X11X && 11XX) - N(1XX1 && 11XX) +
N(X11X && 1XX1 && 11XX)
“单个”元素的基数很容易计算(2^Nx,其中Nx是X元素的数量)。对于交点,逐个元素进行比较。如果它们与X不同,并且彼此不同,则为零。如果两者都相等,则为1。如果有一个X和一个数字,则为一。如果你有X和X,你就有两个。然后将这些数字相乘。例如:
N(X11X && 1XX1) = 1 * 1 * 1 * 1 = 1.
对应于唯一的公共序列(1111)。这可以很容易地推广到任何N,并且应该不难在任何语言中实现。
问题内容: 在最近的一次采访中有人问我这个问题。 您将获得一个包含一百万个元素的数组。除了一个元素外,所有元素都是重复的。我的任务是找到独特的元素。 我的做法是要经过在整个数组循环,然后创建一个索引作为数组中和的数组中出现的次数。然后再次遍历我们的地图,并返回值为1的索引。 我说我的方法会花费时间。面试官告诉我要以低于复杂度的方式对其进行优化。我说过,我们不能,因为我们必须遍历具有一百万个元素的整
我有两个Arraylist,A和B。 ArrayList B由不同的类组成,这些类包含不同的数据集,包括。对此列表中的每个项都是唯一的。示例:。 这两个列表都按进行排序,希望这样做更容易。 我要做的是创建一个新的列表C,它由listB中至少与Lista有一个交集的项组成。因此列表C应该包含上述给定输入的项。
假设我有数据表(如上所述): 如何有效地计算唯一列?在这种情况下,只有3个。 请假设一般情况下: 始终是数据表而不是矩阵;尽管列始终是数字 是否可以在不制作额外数据副本的情况下执行此操作? 我目前的方法是使用
有没有办法将第一个和第二个元素替换为向量中的所有元组?假设我有这样的东西: 元组的第一个元素现在是1和3,第二个元素是2和4。有容易使2和4成为第一个元素吗?
我有两个大小相等的向量,例如。 我感兴趣的是在两个相同大小的向量A中找到最接近的值(几乎相等) 为了清楚起见,我不想在单个向量中找到最接近的值。上面例子的答案是2.56和2.52。
我试图写一个算法,它需要可变数量的通用数组,存储在中,并收集其中所有唯一的元素(元素只发生一次),并将其存储在一个数组中,称为。例如,数组: 将生成包含内容的数组。 以下是我当前的流程算法: 请注意,是一个数组,它包含