在Python中使用位数组查找数组的重复项
假设我们有n个不同数字组成的数组;n最多为32,000。该数组可能有重复的条目,我们不知道n的值是什么。现在,如果我们只有4KB的内存,将如何显示数组中的所有重复项?
因此,如果输入类似于[2,6,2,11,11,13,11],则输出将为[2,11],因为2和11在给定数组中出现多次。
为了解决这个问题,我们将遵循以下步骤-
创建一个字节数组类型的数据结构bit_arr,它具有以下方法
定义构造函数这将花费n
arr:=大小为(n/2^5)+1的数组,用0填充
定义一个函数get_val()。这将需要pos
索引:=pos/2^5
bitNo:=位置与31
当(arr[index]AND(2^bitNo))不等于0时返回true
定义一个函数set_val()。这将需要pos
索引:=pos/2^5
bitNo:=位置与31
arr[index]:=arr[index]OR(2^bitNo)
从主要方法中,执行以下操作-
arr:=bit_arr(320000)
对于范围在0到arr大小之间的i,执行
显示数字
num:=arr[i]
如果arr.get_val(num)不为零,则
除此以外,
set_val(num)的arr
示例
让我们看下面的实现以更好地理解-
class bit_arr:
def __init__(self, n):
self.arr = [0] * ((n >> 5) + 1)
def get_val(self, pos):
self.index = pos >> 5
self.bitNo = pos & 31
return (self.arr[self.index] & (1 << self.bitNo)) != 0
def set_val(self, pos):
self.index = pos >> 5
self.bitNo = pos & 31
self.arr[self.index] |= (1 << self.bitNo)
def is_duplicate(arr):
arr = bit_arr(320000)
for i in range(len(arr)):
num = arr[i]
if arr.get_val(num):
print(num, end = " ")
else:
arr.set_val(num)
arr = [2, 6, 2, 11, 13, 11]
is_duplicate(arr)输入值
[2, 6, 2, 11, 13, 11]
输出结果
2 11