使用位数组在 Python 中查找数组的重复元素
假设我们有一个包含 n 个不同数字的数组;n 最大可以是 32,000。数组可能包含重复项,我们不知道 n 的值。现在如果我们只有 4 千字节的内存,如何显示数组中的所有重复项?
因此,如果输入类似于 [2, 6, 2, 11, 13, 11],则输出将是 [2,11],因为 2 和 11 在给定数组中出现多次。
为了解决这个问题,我们将遵循以下步骤 -
创建一个字节数组类型的数据结构 bit_arr,它具有以下方法
定义构造函数,它将接收 n
arr := 一个大小为 (n / 2^5) + 1 的数组,填充为 0
定义一个函数 get_val()。它将接收 pos
index := pos / 2^5
bitNo := pos AND 31
当 (arr[index] AND (2^bitNo)) 不等于 0 时返回 true
定义一个函数 set_val()。它将接收 pos
index := pos / 2^5
bitNo := pos AND 31
arr[index] := arr[index] OR (2^bitNo)
从主方法中执行以下操作 -
arr := bit_arr(320000)
对于 i 从 0 到 arr 的大小,执行
num := arr[i]
如果 arr.get_val(num) 不为零,则
显示 num
否则,
设置 arr 的 set_val(num)
示例
让我们看看以下实现以更好地理解 -
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
广告