📜  打印给定数组中所有可能的对的绝对差值

📅  最后修改于: 2021-04-26 06:17:24             🧑  作者: Mango

给定一个大小为N的数组arr [] ,任务是找到给定数组所有可能对的绝对差值。

例子:

天真的方法:解决此问题的最简单方法是生成给定数组的所有可能对,并将每个对的绝对差插入Set中。最后,打印集合中的所有元素。
时间复杂度: O(N 2 * log(N))
辅助空间: O(N 2 )

方法:可以使用Bitset对上述方法进行优化。请按照以下步骤解决问题:

  • 初始化一个比特集,比方说BSET,其中BSET [I]检查,如果i是存在于阵列或不英寸
  • 遍历数组arr []并将所有数组元素存储在bset中
  • 初始化一个Bitset,例如diff ,其中diff [i]存储数组中是否存在值等于i的任何对的绝对差。
  • 查找数组中最大的元素,例如Max
  • 迭代[0,Max]范围。在i次迭代中,检查bset [i]是否为true。如果确定为真,则使用diff = diff |将i与所有其他数组元素的绝对差值插入。 (bset >> i)
  • 最后,在[0,Max]范围内进行迭代,并检查diff [i]是否为true。如果发现是真的,则打印i

下面是上述方法的实现:

C++
// C++ program for the above approach
  
#include 
using namespace std;
#define Max 100005
  
// Function to find all distinct
// absolute difference of all
// possible pairs of the array
void printUniqDif(int n, int a[])
{
  
    // bset[i]: Check if i is present
    // in the array or not
    bitset bset;
  
    // diff[i]: Check if there exists a
    // pair whose absolute difference is i
    bitset diff;
  
    // Traverse the array, arr[]
    for (int i = 0; i < n; i++) {
  
        // Add in bitset
        bset.set(a[i]);
    }
  
    // Iterate over the range[0, Max]
    for (int i = 0; i <= Max; i++) {
  
        // If i-th bit is set
        if (bset[i]) {
  
            // Insert the absolute difference
            // of all possible pairs whose
            // first element is arr[i]
            diff = diff | (bset >> i);
        }
    }
  
    // Stores count of set bits
    int X = bset.count();
  
    // If there is at least one
    // duplicate element in arr[]
    if (X != n) {
  
        cout << 0 << " ";
    }
  
    // Printing the distinct absolute
    // differences of all possible pairs
    for (int i = 1; i <= Max; i++) {
  
        // If i-th bit is set
        if (diff[i]) {
            cout << i << " ";
        }
    }
}
  
// Driver Code
int main()
{
  
    // Given array
    int a[] = { 1, 4, 6 };
  
    // Given size
    int n = sizeof(a) / sizeof(a[0]);
  
    // Function Call
    printUniqDif(n, a);
  
    return 0;
}


Python3
# Python3 program for the above approach
Max = 100005
  
# Function to find all distinct
# absolute difference of all
# possible pairs of the array
def printUniqDif(n, a):
  
    # bset[i]: Check if i is present
    # in the array or not
    bset = [0 for i in range(33)]
  
    # diff[i]: Check if there exists a
    # pair whose absolute difference is i
    diff = 0
  
    # Traverse the array, arr[]
    for i in range(n):
        bset[a[i]] = 1
  
    # Iterate over the range[0, Max]
    d = 0
  
    for i in range(1,33):
        d = d | (bset[i]<> i
            # print(bin(diff))
  
    # Stores count of set bits
    X, Y = bset.count(1), str(bin(diff)[2:])
  
    # If there is at least one
    # duplicate element in arr[]
    if (X != n):
  
        print(0, end=" ")
  
    # Printing the distinct absolute
    # differences of all possible pairs
    for i in range(1, len(Y)):
  
        # If i-th bit is set
        if (Y[i] == '1'):
            print(i, end = " ")
# Driver Code
if __name__ == '__main__':
  
    # Given array
    a = [1, 4, 6]
  
    # Given size
    n = len(a)
  
    # Function Call
    printUniqDif(n, a)
  
    # This code is contributed by mohit kumar 29


输出:
2 3 5

时间复杂度: O(N + Max),其中Max是数组中的最大元素。
辅助空间: O(Max)