约束下存在排列的存在(访谈街 - 操纵数)

时间:2012-06-22 17:43:50

标签: algorithm constraints permutation

我正在尝试解决此问题:https://www.interviewstreet.com/challenges/dashboard/#problem/4f9a33ec1b8ea

假设A是n个数字(A1,A2,A3,...,An)的列表,B(B1,B2,B3,...,Bn)是这些数字的排列。我们说B是K-Manipulative当且仅当它的值如下:

M(B)= min(B1 Xor B2,B2 Xor B3,B3 Xor B4,...,Bn-1 Xor Bn,Bn Xor B1)不小于2 ^ K. 你得到n号A1到An,你必须找到最大的K,这样就存在这些数字的排列B,这是K-Manipulative。

输入:

在输入的第一行有一个整数N. 在第二行输入中,有N个整数A1到An N不超过100。 Ai是非负的,适合32位整数。

输出:

将一个整数打印到作为测试答案的输出。如果输出没有这样的K打印-1。

示例输入

3 13 3 10

示例输出

2

示例输入

4 1 2 3 4

示例输出

1

解释

首次样品测试 列表A是{13,3,10}。 A的一种可能的排列是,B =(10,3,13)。

对于B,min(B1 xor B2,B2 xor B3,B3 xor B1)= min(10 xor 3,3 xor 13,13 xor 10)= min(9,14,7)= 7.

因此存在A的置换B使得M(B)不小于4,即2 ^ 2。然而,不存在A的任何排列B使得M(B)不小于8,即2 ^ 3。所以K的最大可能值是2。

=============================================== ===================================

以下是我到目前为止的尝试。


尝试1:贪婪算法

  1. 将输入放在数组A [1..n]
  2. 计算值M(A)。这给出了最小XOR值(i,(i + 1)%n)
  3. 的位置
  4. 检查A [i]或A [(i + 1)%n]与阵列的任何其他元素的交换是否增加了M(A)的值。如果存在这样的元素,请进行交换。
  5. 重复步骤2& 3直到值M(A)无法改善。
  6. 这肯定会给出局部最大值,但我不确定这是否给出了全局最大值。


    尝试2:在给定邻居约束的情况下检查是否存在排列

    1. 给定输入A [1..n],For i = 1..n且j =(i + 1).. n compute x_ij = A [i] XOR A [j]
    2. 计算max(x_ij)。注意,2 ^ p <= max(x_ij)&lt;某些p
    3. 为2 ^(p + 1)
    4. 收集所有x_ij,使x_ij&gt; = 2 ^ p。请注意,如果x_ij> = 2 ^ p,则此集合可被视为具有节点{1,2,... n}的图G,并且节点i和j之间具有无向边。
    5. 检查图表G是否具有一次访问每个节点的周期。如果存在这样的循环,则k = p。否则,让p = p - 1,转到第3步。
    6. 这给出了正确答案,但请注意,在第4步中,我们基本上检查图形是否具有哈密顿周期,这是一个非常难的问题。


      任何提示或建议?

3 个答案:

答案 0 :(得分:3)

有可能在不深入图论的情况下解决这个问题。

密钥推断

rich建议的属性是解决此问题的关键:

  

跟进我的评论:B1 Xor B2&lt; 2 ^ K当且仅当B1和B2时   同意除K低位之外的所有位

基于上述属性,我们只需找到每个A [i]的每个唯一高阶位最多n/2次出现的最高k。

换句话说,在值A[i] >> k组中,如果每个值最多重复n/2次,则存在all the XOR values >= (2^k)的k-操纵排列。

为什么n / 2

假设如果确实有超过n/2次出现的任何唯一高阶位,则不可能获得置换B,所有循环XOR都不为零,即将存在至少有一个B[i] XOR B[(i+1) % N],所有高阶位都变为零,因此M(B) < 2^k

的伪代码

k = -1
for (bit = (MAX_BITS - 1) to 0) {
    HashMap count
    for (i = 0 to N - 1) {
        higherOrderVal = A[i] >> bit
        if (higherOrderVal exists in count) {
            count[higherOrderVal] += 1
        }
        else {
            count[higherOrderVal] = 1
        }
    }

    isValid = true
    for (element in count) {
        if (element > N/2) {
            isValid = false
            break
        }
    }
    if (isValid) {
        k = bit
        break
    }
}

此解决方案的时间复杂度为O(M * N),其中M是表示用于表示数字(32位,64位等)的最大位数的常量因子,以及N是输入数组A的大小。

答案 1 :(得分:2)

跟进我的评论:B1 Xor B2&lt; 2 ^ K当且仅当B1和B2同意除K低位之外的所有位时,因此G具有完全多部分的非常特殊的结构,分区标签由除K低位之外的所有位组成。当且仅当没有多数分区时,完整的多部分图是哈密顿量。将此事实插入尝试2。

答案 2 :(得分:0)

贪婪方法#priority_queue

首先插入所有对xor值以及连续的索引i和j-> pq.push(tuple(v [i] ^ v [j],i,j)) 现在弹出第一个maxm xor值,并设置索引i和j 现在再次弹出来自i或j的maxm xor值 此操作最多执行1到n 然后返回第n个弹出的xor值