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

โปรแกรมออกแบบคิวที่ย้ายองค์ประกอบที่ใช้ล่าสุดไปยังจุดสิ้นสุดของคิวใน Python


สมมติว่า เราถูกขอให้ออกแบบคิวที่ย้ายองค์ประกอบที่ใช้ล่าสุดไปยังจุดสิ้นสุด คิวจะเริ่มต้นด้วยเลขจำนวนเต็ม 1 ถึง n ตอนนี้ เราต้องสร้างฟังก์ชันเพื่อให้เมื่อใดก็ตามที่ถูกเรียก มันจะย้ายค่าจากตำแหน่งที่กำหนดเป็นอินพุตไปยังจุดสิ้นสุดของคิว เราจะเรียกใช้ฟังก์ชันหลายครั้ง และฟังก์ชันจะคืนค่าปัจจุบันที่ส่วนท้ายของคิวขณะดำเนินการเคลื่อนย้าย

ดังนั้น หากคิวเริ่มต้นด้วยค่า n =5 หรือมีค่าตั้งแต่ 1 ถึง 5 และตำแหน่งที่ทำการเคลื่อนไหวคือ 5, 2, 3 และ 1 ตามลำดับ จากนั้นผลลัพธ์จะเป็น 5, 2, 4, 1

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • i :=ตำแหน่งในดัชนีอาร์เรย์ - 1 โดยที่ค่า k สามารถแทรกทางด้านขวาเพื่อรักษาลำดับที่จัดเรียงไว้ได้
  • x :=ลบ (k - index[i])th องค์ประกอบจาก data[i]
  • สำหรับ ii ในช่วง i+1 ถึงขนาดของดัชนี ทำ
    • ดัชนี[ii] :=ดัชนี[ii] - 1
  • ถ้าขนาดขององค์ประกอบสุดท้ายของ data>=nn แล้ว
    • แทรกรายการใหม่ที่ส่วนท้ายของข้อมูลรายการ
    • แทรก n ที่ส่วนท้ายของดัชนีรายการ
  • แทรก x ที่ส่วนท้ายของข้อมูล
  • ถ้า data[i] เป็น rmpty แล้ว
    • ลบองค์ประกอบ ith ออกจากข้อมูล
    • ลบองค์ประกอบ ith ออกจากดัชนี
  • ผลตอบแทน x

ตัวอย่าง

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

from bisect import bisect_right
from math import sqrt
class TestQueue:
   def __init__(self, n):
      self.n = n
      self.nn = int(sqrt(n))
      self.data = []
      self.index = []
      for i in range(1, n+1):
         ii = (i-1)//self.nn
         if ii == len(self.data):
            self.data.append([])
            self.index.append(i)
         self.data[-1].append(i)

   def solve(self, k):
      i = bisect_right(self.index, k)-1
      x = self.data[i].pop(k - self.index[i])
      for ii in range(i+1, len(self.index)):
         self.index[ii] -= 1
      if len(self.data[-1]) >= self.nn:
         self.data.append([])
         self.index.append(self.n)
      self.data[-1].append(x)
      if not self.data[i]:
         self.data.pop(i)
         self.index.pop(i)
      return x

queue = TestQueue(5)
print(queue.solve(5))
print(queue.solve(2))
print(queue.solve(3))
print(queue.solve(1))

อินพุต

queue = TestQueue(5)
print(queue.solve(5))
print(queue.solve(2))
print(queue.solve(3))
print(queue.solve(1))

ผลลัพธ์

5
2
4
1