الخوارزميات وهياكل البيانات في Swift: دليل شامل لمطور iOS

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

الخوارزميات وهياكل البيانات في Swift: من الأساسيات إلى التقنيات المتقدمة



فهم الخوارزميات وهياكل البيانات هو الأساس الذي يميز المطور المبتدئ عن المهندس ذي الخبرة. بالنسبة لمطور iOS/macOS الذي يعمل بلغة Swift، تؤثر هذه المعرفة بشكل مباشر على أداء التطبيق، وزمن استجابة الواجهة، وكفاءة استخدام الذاكرة. في هذه المقالة، سنستعرض هياكل البيانات والخوارزميات الرئيسية التي يجب على كل مطور Swift معرفتها، مع أمثلة عملية للكود.



1. هياكل البيانات الأساسية في Swift: المصفوفات، المجموعات، والقواميس



توفر Swift مجموعات مدمجة قوية، لكن فهم بنيتها الداخلية يساعد في كتابة كود أكثر كفاءة.



المصفوفات (Array)

المصفوفة هي مجموعة مرتبة من العناصر يمكن الوصول إليها عن طريق الفهرس. في Swift، يتم تنفيذ Array كمصفوفة ديناميكية بتعقيد زمني متوسط O(1) للإضافة في النهاية.



// إنشاء وعمليات أساسيةvar numbers = [1, 2, 3, 4, 5]numbers.append(6) // O(1) في المتوسطnumbers.insert(0, at: 0) // O(n) — إزاحة العناصرlet first = numbers[0] // O(1)numbers.removeLast() // O(1)numbers.remove(at: 2) // O(n) — إزاحة


المجموعات (Set)

Set هي مجموعة غير مرتبة من العناصر الفريدة. تم تنفيذها بناءً على جدول التجزئة (hash table)، مما يعطي O(1) للإدراج والحذف والبحث.



var uniqueNumbers: Set<Int> = [1, 2, 3, 3, 4]print(uniqueNumbers) // [1, 2, 3, 4] — تمت إزالة التكراراتuniqueNumbers.insert(5) // O(1)let contains = uniqueNumbers.contains(3) // true, O(1)


القواميس (Dictionary)

مصفوفة ترابطية لتخزين أزواج "مفتاح-قيمة". تعتمد أيضًا على جداول التجزئة.



var scores: [String: Int] = ["Alice": 95, "Bob": 87]scores["Charlie"] = 92 // O(1)if let aliceScore = scores["Alice"] {    print("Alice: \\(aliceScore)")}scores.removeValue(forKey: "Bob") // O(1)


2. هياكل بيانات مخصصة: الأكوام، الطوابير، والقوائم المرتبطة



على الرغم من عدم وجود تطبيقات مدمجة للكوم والطابور في Swift، إلا أنه يمكن تنفيذها بسهولة يدويًا.



الكومة (Stack) — LIFO

تعمل الكومة على مبدأ "آخر من يدخل هو أول من يخرج". تُستخدم لتراجع الإجراءات، واجتياز الأشجار بالعمق أولاً.



struct Stack<Element> {    private var storage: [Element] = []        mutating func push(_ element: Element) { storage.append(element) }    mutating func pop() -> Element? { storage.popLast() }    func peek() -> Element? { storage.last }    var isEmpty: Bool { storage.isEmpty }}

var stack = Stack<Int>()stack.push(1); stack.push(2); stack.push(3)print(stack.pop()!) // 3print(stack.peek()!) // 2


الطابور (Queue) — FIFO

يعمل الطابور على مبدأ "أول من يدخل هو أول من يخرج". يُستخدم لمعالجة المهام حسب ترتيب وصولها.



struct Queue<Element> {    private var input: [Element] = []    private var output: [Element] = []        mutating func enqueue(_ element: Element) { input.append(element) }        mutating func dequeue() -> Element? {        if output.isEmpty {            output = input.reversed()            input.removeAll()        }        return output.popLast()    }        var isEmpty: Bool { input.isEmpty && output.isEmpty }}

var queue = Queue<String>()queue.enqueue("First"); queue.enqueue("Second")print(queue.dequeue()!) // "First"


القائمة المرتبطة (Linked List)

تتكون القائمة المرتبطة من عُقد، كل منها يشير إلى العقدة التالية. تسمح بإدراج/حذف العناصر في منتصف القائمة بكفاءة.



class ListNode<T> {    var value: T    var next: ListNode?    init(_ value: T) { self.value = value }}

class LinkedList<T> { var head: ListNode<T>? func append(_ valu

المدونات

توصيات الكتب