مقدمة في الخوارزميات وهياكل البيانات بلغة Kotlin
Kotlin هي لغة برمجة حديثة تجمع بين الإيجاز والقوة. دراسة الخوارزميات وهياكل البيانات بلغة Kotlin تفتح الطريق لكتابة كود فعال وقابل للتوسع. سواء كنت تطور تطبيقات Android أو خدمات خلفية أو برامج سطح المكتب، فإن فهم الهياكل الأساسية والخوارزميات هو مهارة ضرورية لأي مطور محترف.
في هذه المقالة، سنشرح هياكل البيانات والخوارزميات الرئيسية بلغة Kotlin مع أمثلة عملية للكود. ستتعلم كيفية تنفيذ الفرز والبحث والعمل مع القوائم والمكدسات والطوابير والأشجار والرسوم البيانية.
1. هياكل البيانات الأساسية في Kotlin
1.1. المصفوفات والقوائم
في Kotlin، يتم تمثيل المصفوفات بنوع Array، والقوائم الديناميكية بنوع List و MutableList. القوائم هي هيكل البيانات الأكثر استخدامًا.
fun main() { // قائمة غير قابلة للتغيير val list: List<Int> = listOf(1, 2, 3, 4, 5) // قائمة قابلة للتغيير val mutableList: MutableList<Int> = mutableListOf(10, 20, 30) mutableList.add(40) mutableList.removeAt(0) println(mutableList) // [20, 30, 40]}1.2. المكدس (Stack)
يعمل المكدس وفق مبدأ LIFO (Last In, First Out). في Kotlin، يمكن تنفيذ المكدس باستخدام ArrayDeque.
fun stackExample() { val stack = ArrayDeque<String>() stack.addLast("الأول") stack.addLast("الثاني") stack.addLast("الثالث") println(stack.removeLast()) // الثالث println(stack.removeLast()) // الثاني println(stack.removeLast()) // الأول}1.3. الطابور (Queue)
يعمل الطابور وفق مبدأ FIFO (First In, First Out). يستخدم التنفيذ أيضًا ArrayDeque.
fun queueExample() { val queue = ArrayDeque<Int>() queue.addLast(1) queue.addLast(2) queue.addLast(3) println(queue.removeFirst()) // 1 println(queue.removeFirst()) // 2 println(queue.removeFirst()) // 3}1.4. القائمة المرتبطة (LinkedList)
القائمة المرتبطة هي سلسلة من العقد، تحتوي كل عقدة على بيانات ومرجع للعقدة التالية. سنقوم بتنفيذ قائمة مرتبطة بسيطة أحادية الاتجاه.
class Node<T>(var value: T, var next: Node<T>? = null)
class LinkedList<T> { private var head: Node<T>? = null fun add(value: T) { val newNode = Node(value) if (head == null) { head = newNode } else { var current = head while (current?.next != null) { current = current.next } current?.next = newNode } } fun printAll() { var current = head while (current != null) { print("${current.value} ") current = current.next } println() }}
fun main() { val list = LinkedList<Int>() list.add(10) list.add(20) list.add(30) list.printAll() // 10 20 30}2. خوارزميات الفرز في Kotlin
2.1. فرز الفقاعات (Bubble Sort)
خوارزمية بسيطة ولكنها غير فعالة. التعقيد O(n²).
fun bubbleSort(arr: MutableList<Int>) { val n = arr.size for (i in 0 until n - 1) { for (j in 0 until n - i - 1) { if (arr[j] > arr[j + 1]) { val temp = arr[j] arr[j] = arr[j + 1] arr[j + 1] = temp } } }}
fun main() { val numbers = mutableListOf(64, 34, 25, 12, 22, 11, 90) bubbleSort(numbers) println(numbers) // [11, 12, 22, 25, 34, 64, 90]}