Swift में एल्गोरिदम और डेटा संरचनाएँ: सिद्धांत से वास्तविक iOS प्रोजेक्ट्स तक
\nSwift केवल Apple इकोसिस्टम के लिए एक आधुनिक और सुरक्षित प्रोग्रामिंग भाषा नहीं है। यह एक शक्तिशाली उपकरण है जो आपको iOS, macOS, watchOS और tvOS के लिए कुशल और उच्च-प्रदर्शन कोड लिखने की अनुमति देता है। हालाँकि, वास्तव में तेज़ और स्केलेबल एप्लिकेशन बनाने के लिए, केवल सिंटैक्स का ज्ञान पर्याप्त नहीं है। मूलभूत एल्गोरिदम और डेटा संरचनाओं की समझ ही वह चीज़ है जो एक जूनियर डेवलपर को सीनियर इंजीनियर से अलग करती है।
\nइस लेख में, हम व्यावहारिक उदाहरणों के साथ Swift भाषा में प्रमुख डेटा संरचनाओं और एल्गोरिदम का विश्लेषण करेंगे। आप देखेंगे कि स्टैक, क्यू, बाइनरी सर्च और सॉर्टिंग को कैसे लागू किया जाए, और यह भी समझेंगे कि वास्तविक iOS एप्लिकेशन डेवलपमेंट में इस ज्ञान का उपयोग कहाँ किया जाता है। चलिए शुरू करते हैं!
\n\n1. स्टैक (Stack) और क्यू (Queue): मूलभूत संरचनाएँ
\nस्टैक और क्यू दो बुनियादी डेटा संरचनाएँ हैं जिनका उपयोग अक्सर iOS डेवलपमेंट में किया जाता है। उदाहरण के लिए, स्टैक का उपयोग UINavigationController में नेविगेशन के लिए किया जाता है, और क्यू का उपयोग OperationQueue या DispatchQueue में कार्यों को प्रबंधित करने के लिए किया जाता है।
स्टैक का कार्यान्वयन (LIFO — Last In, First Out)
\nस्टैक "अंतिम आया, पहला गया" सिद्धांत पर काम करता है। तत्व जोड़ना (push) और हटाना (pop) एक ही सिरे से होता है — स्टैक के शीर्ष से।
\nstruct Stack<Element> {\n private var storage: [Element] = []\n \n mutating func push(_ element: Element) {\n storage.append(element)\n }\n \n @discardableResult\n mutating func pop() -> Element? {\n return storage.popLast()\n }\n \n func peek() -> Element? {\n return storage.last\n }\n \n var isEmpty: Bool {\n return storage.isEmpty\n }\n}\n\n// उपयोग का उदाहरण\nvar navigationStack = Stack<String>()\nnavigationStack.push("मुख्य स्क्रीन")\nnavigationStack.push("उत्पाद विवरण")\nnavigationStack.push("कार्ट")\nprint(navigationStack.pop() ?? "") // आउटपुट: "कार्ट"\nprint(navigationStack.peek() ?? "") // आउटपुट: "उत्पाद विवरण"\nकहाँ उपयोग होता है: संचालन पूर्ववत करना (Undo/Redo), पार्सर्स में कोष्ठकों की शुद्धता की जाँच, ट्री का गहराई-प्रथम ट्रैवर्सल (DFS)।
\n\nक्यू का कार्यान्वयन (FIFO — First In, First Out)
\nक्यू "पहला आया, पहला गया" सिद्धांत पर काम करता है। तत्वों को अंत में जोड़ा जाता है (enqueue) और शुरुआत से हटाया जाता है (dequeue)।
\nstruct Queue<Element> {\n private var storage: [Element] = []\n \n mutating func enqueue(_ element: Element) {\n storage.append(element)\n }\n \n @discardableResult\n mutating func dequeue() -> Element? {\n guard !storage.isEmpty else { return nil }\n return storage.removeFirst()\n }\n \n func peek() -> Element? {\n return storage.first\n }\n \n var isEmpty: Bool {\n return storage.isEmpty\n }\n}\n\n// उपयोग का उदाहरण\nvar taskQueue = Queue<String>()\ntaskQueue.enqueue("इमेज लोड करना")\ntaskQueue.enqueue("डेटा सिंक्रोनाइज़ेशन")\ntaskQueue.enqueue("एनालिटिक्स भेजना")\nprint(taskQueue.dequeue() ?? "") // आउटपुट: "इमेज लोड करना"\nकहाँ उपयोग होता है: नेटवर्क अनुरोधों को संसाधित करना, ट्री का चौड़ाई-प्रथम ट्रैवर्सल (BFS), बैकग्राउंड थ्रेड्स में कार्य कतारें।
\n\n2. बाइनरी सर्च: गति बनाम सरलता
\nबाइनरी सर्च एक क्लासिक एल्गोरिदम है जो एक सॉर्ट किए गए ऐरे में लॉगरिदमिक समय O(log n) में एक तत्व ढूंढता है। iOS में, इसका उपयोग अक्सर बड़े सॉर्ट किए गए डेटा सेटों के साथ काम करते समय किया जाता है, जैसे कॉन्टैक्ट या डेटाबेस रिकॉर्ड खोजना।
\nfunc binarySearch<T: Comparable>(in array: [T], target: T) -> Int? {\n var lowerBound = 0\n var upperBound = array.count - 1\n \n while lowerBound <= upperBound {\n let midIndex = (lowerBound + upperBound) / 2\n let midValue = array[mid