मान लीजिए, हमें एक कतार डिजाइन करने के लिए कहा जाता है जो सबसे हाल ही में उपयोग किए गए तत्व को इसके अंत तक ले जाती है। कतार को पूर्णांक संख्या 1 से n के साथ आरंभ किया जाएगा। अब हमें एक फ़ंक्शन बनाना है ताकि जब भी इसे कॉल किया जाए, तो यह मान को उसके इनपुट के रूप में दिए गए स्थान से कतार के अंत तक ले जाए। हम फ़ंक्शन को कई बार कॉल करेंगे, और फ़ंक्शन अपने मूविंग कार्य को करते हुए वर्तमान में कतार के अंत में मान लौटाएगा।
इसलिए, यदि कतार को मान n =5 के साथ प्रारंभ किया गया है, या इसमें 1 से 5 तक के मान हैं; और जिन स्थितियों में चाल की जाती है वे क्रमशः 5, 2, 3, और 1 हैं, तो आउटपुट 5, 2, 4, 1 होगा।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
- i :=सरणी अनुक्रमणिका -1 में स्थिति, जहां क्रमबद्ध क्रम बनाए रखने के दाईं ओर मान k डाला जा सकता है
- x:=डेटा से हटाएं (k - अनुक्रमणिका[i])वां तत्व[i]
- ii के लिए i+1 से लेकर अनुक्रमणिका के आकार तक के लिए, करें
- सूचकांक[ii] :=अनुक्रमणिका[ii] - 1
- यदि डेटा के अंतिम तत्व का आकार>=nn, तो
- सूची डेटा के अंत में एक नई सूची डालें
- सूची अनुक्रमणिका के अंत में n डालें
- डेटा के अंत में x डालें
- यदि डेटा [i] खाली है, तो
- डेटा से 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