Computer >> Máy Tính >  >> Lập trình >> Python

Tìm bản sao của mảng bằng cách sử dụng mảng bit trong Python


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