स्विफ्ट में एल्गोरिदम और डेटा संरचनाओं का परिचय
\nस्विफ्ट एक शक्तिशाली और सहज प्रोग्रामिंग भाषा है, जिसे Apple ने iOS, macOS, watchOS और tvOS के लिए ऐप डेवलपमेंट हेतु बनाया है। हालांकि, कुशल और तेज़ कोड लिखने के लिए केवल सिंटैक्स जानना पर्याप्त नहीं है। एल्गोरिदम और डेटा संरचनाओं को समझना वह नींव है जो एक नौसिखिए को पेशेवर डेवलपर में बदल देती है।
\nइस लेख में, हम स्विफ्ट में बुनियादी डेटा संरचनाओं (ऐरे, डिक्शनरी, सेट) और प्रमुख एल्गोरिदम (सॉर्टिंग, सर्च) पर चर्चा करेंगे। सभी कोड उदाहरण Xcode Playground में चलाने के लिए तैयार हैं।
\n\nस्विफ्ट में मुख्य डेटा संरचनाएँ
\nस्विफ्ट अंतर्निहित डेटा संरचनाएँ प्रदान करता है जो मेमोरी और प्रदर्शन के लिए अनुकूलित हैं। आइए तीन सबसे महत्वपूर्ण संरचनाओं पर नज़र डालें।
\n\nऐरे (Array)
\nऐरे एक ही प्रकार के तत्वों का क्रमबद्ध संग्रह है। स्विफ्ट में, ऐरे सख्ती से टाइप किए जाते हैं और इनका एक निश्चित क्रम होता है।
\n// ऐरे बनाना\nvar numbers: [Int] = [1, 2, 3, 4, 5]\n\n// तत्व जोड़ना\nnumbers.append(6)\n\n// इंडेक्स द्वारा पहुँच\nlet first = numbers[0] // 1\n\n// इटरेशन\nfor number in numbers {\n print(number)\n}\n\n// जगह पर सॉर्ट करना\nnumbers.sort() // [1, 2, 3, 4, 5, 6]\nऐरे तब आदर्श होते हैं जब तत्वों का क्रम महत्वपूर्ण हो और इंडेक्स द्वारा त्वरित पहुँच (O(1)) की आवश्यकता हो। हालांकि, ऐरे की शुरुआत में इन्सर्ट या डिलीट करने में O(n) समय लगता है।
\n\nडिक्शनरी (Dictionary)
\nडिक्शनरी "की-वैल्यू" जोड़े संग्रहीत करती है। कीज़ अद्वितीय और हैशेबल (जैसे, String, Int) होनी चाहिए।
\n// डिक्शनरी बनाना\nvar scores: [String: Int] = ["Alice": 95, "Bob": 87]\n\n// जोड़ना या अपडेट करना\nscores["Charlie"] = 92\n\n// वैल्यू प्राप्त करना (वैकल्पिक)\nif let aliceScore = scores["Alice"] {\n print("Alice's score: \\(aliceScore)")\n}\n\n// हटाना\nscores.removeValue(forKey: "Bob")\nडिक्शनरी औसतन O(1) में की द्वारा वैल्यू तक पहुँच प्रदान करती है। इनका उपयोग तब करें जब डेटा स्वाभाविक रूप से अद्वितीय कीज़ द्वारा समूहित हो।
\n\nसेट (Set)
\nसेट अद्वितीय तत्वों का एक अक्रमबद्ध संग्रह है। यह सदस्यता जाँच और डुप्लिकेट हटाने के लिए उपयोगी है।
\n// सेट बनाना\nvar fruits: Set<String> = ["Apple", "Banana", "Orange"]\n\n// जोड़ना\nfruits.insert("Mango")\n\n// उपस्थिति की जाँच\nif fruits.contains("Apple") {\n print("Apple is in the set")\n}\n\n// ऐरे से डुप्लिकेट हटाना\nlet arrayWithDuplicates = [1, 1, 2, 3, 3, 4]\nlet uniqueSet = Set(arrayWithDuplicates) // {1, 2, 3, 4}\n\nस्विफ्ट में बुनियादी एल्गोरिदम
\nअब सामान्य समस्याओं को हल करने के लिए डेटा संरचनाओं को लागू करते हैं। आइए सॉर्टिंग और सर्च पर विचार करें।
\n\nसॉर्टिंग एल्गोरिदम
\nस्विफ्ट में एक अंतर्निहित sort() फ़ंक्शन है, लेकिन समझने के लिए हम क्लासिक क्विक सॉर्ट (Quick Sort) एल्गोरिदम लिखेंगे।
func quickSort(_ array: [Int]) -> [Int] {\n guard array.count > 1 else { return array }\n \n let pivot = array[array.count / 2]\n let less = array.filter { $0 < pivot }\n let equal = array.filter { $0 == pivot }\n let greater = array.filter { $0 > pivot }\n \n return quickSort(less) + equal + quickSort(greater)\n}\n\nlet unsorted = [3, 6, 1, 8, 2, 9, 4]\nlet sorted = quickSort(unsorted)\nprint(sorted) // [1, 2, 3, 4, 6, 8, 9]\nक्विक सॉर्ट औसत जटिलता O(n log n) वाले सबसे कुशल एल्गोरिदम में से एक है। छोटे ऐरे के लिए अंतर्निहित sorted() का उपयोग किया जा सकता है।
सर्च एल्गोरिदम
\nलीनियर सर्च सरल लेकिन धीमा (O(n)) है। सॉर्ट किए गए डेटा के लिए बाइनरी सर्च (O(log n)) का उपयोग करें।
\n// बाइनरी सर्च\nfunc binarySearch(_ array: [Int], target: Int) -> Int? {\n var low = 0\n var high = array.count - 1\n \n while low <= high {\n let mid = (low + high)