Giả sử chúng ta có một mảng gồm n số khác nhau; n có thể là 32.000 ở mức tối đa. Mảng có thể có các mục trùng lặp và chúng ta không biết giá trị của n là gì. Bây giờ nếu chúng ta chỉ có 4-Kilobyte bộ nhớ, làm thế nào để hiển thị tất cả các bản sao trong mảng?
Vì vậy, nếu đầu vào là [2, 6, 2, 11, 13, 11], thì đầu ra sẽ là [2,11] vì 2 và 11 xuất hiện nhiều hơn một lần trong mảng đã cho.
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
Tạo một cấu trúc dữ liệu kiểu mảng byte bit_arr, cấu trúc này có các phương thức sau
-
Xác định hàm tạo Điều này sẽ mất n
-
arr:=một mảng có kích thước (n / 2 ^ 5) + 1, điền bằng 0
-
Định nghĩa một hàm get_val (). Điều này sẽ có vị trí
-
chỉ mục:=pos / 2 ^ 5
-
bitNo:=pos VÀ 31
-
trả về true khi (arr [index] AND (2 ^ bitNo)) không giống 0
-
Định nghĩa một hàm set_val (). Điều này sẽ có vị trí
-
chỉ mục:=pos / 2 ^ 5
-
bitNo:=pos VÀ 31
-
arr [index]:=arr [index] OR (2 ^ bitNo)
-
Từ phương thức chính, thực hiện như sau -
-
arr:=bit_arr (320000)
-
đối với tôi trong phạm vi từ 0 đến kích thước của arr, thực hiện
-
num:=arr [i]
-
nếu arr.get_val (num) khác 0 thì
-
số hiển thị
-
-
nếu không,
-
set_val (num) trong tổng số arr
-
Ví dụ
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
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)
Đầu vào
[2, 6, 2, 11, 13, 11]
Đầu ra
2 11