Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

ค้นหารายการที่ซ้ำกันของอาร์เรย์โดยใช้บิตอาร์เรย์ใน 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

  • ดัชนี :=pos / 2^5

  • bitNo :=pos และ 31

  • คืนค่าจริงเมื่อ (arr[index] AND (2^bitNo)) ไม่เหมือนกับ 0

  • กำหนดฟังก์ชัน set_val() นี่จะใช้เวลา pos

  • ดัชนี :=pos / 2^5

  • bitNo :=pos และ 31

  • arr[index] :=arr[index] OR (2^bitNo)

  • จากวิธีหลัก ให้ทำดังนี้ −

  • arr :=bit_arr(320000)

  • สำหรับฉันในช่วง 0 ถึงขนาดของ arr ทำ

    • 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