الخوارزميات وهياكل البيانات بلغة Go: دليل للمبتدئين

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

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

ابدأ الدورة

مقدمة في الخوارزميات وهياكل البيانات بلغة Go



Go (Golang) هي لغة برمجة مترجمة حديثة، تم تطويرها في Google. تجمع بين أداء لغة C++ وبساطة لغة Python، مما يجعلها خيارًا مثاليًا لتعلم الخوارزميات وهياكل البيانات. في هذه المقالة، سنستعرض المفاهيم الأساسية التي ستساعدك على البدء في كتابة كود فعال بلغة Go.



فهم هياكل البيانات والخوارزميات هو مهارة أساسية لأي مطور. فهي تتيح تنظيم البيانات بكفاءة وحل المشكلات بالطريقة المثلى. توفر Go أنواعًا مدمجة قوية مثل الشرائح (slices) والخريطة (map)، لكن معرفة الهياكل الأساسية ستساعدك في إنشاء حلول أكثر تعقيدًا.



هياكل البيانات الأساسية في Go



المصفوفات والشرائح (Arrays and Slices)



في Go، المصفوفات لها طول ثابت، بينما الشرائح ديناميكية. الشرائح هي أداة أكثر مرونة وتستخدم في الغالب.



package main

import "fmt"

func main() { // مصفوفة بطول ثابت var arr [5]int = [5]int{1, 2, 3, 4, 5} fmt.Println("المصفوفة:", arr)

// شريحة - مصفوفة ديناميكية slice := []int{10, 20, 30, 40, 50} fmt.Println("الشريحة:", slice)

// إضافة عنصر إلى الشريحة slice = append(slice, 60) fmt.Println("الشريحة بعد الإضافة:", slice)

// شريحة من جزء من المصفوفة subSlice := arr[1:4] fmt.Println("الشريحة الفرعية:", subSlice)}


الشرائح في Go هي مرجع إلى مصفوفة أساسية. تحتوي على مؤشر للعنصر الأول، والطول، والسعة. وهذا يجعلها فعالة جدًا للعمل مع تسلسلات البيانات.



المكدس (Stack) في Go



المكدس هو هيكل بيانات يعمل وفق مبدأ LIFO (Last In, First Out). في Go، يمكن تنفيذ المكدس بسهولة باستخدام شريحة.



package main

import ( "fmt" "errors")

type Stack []int

func (s *Stack) Push(v int) { *s = append(*s, v)}

func (s *Stack) Pop() (int, error) { if len(*s) == 0 { return 0, errors.New("المكدس فارغ") } index := len(*s) - 1 element := (*s)[index] *s = (*s)[:index] return element, nil}

func main() { var stack Stack stack.Push(1) stack.Push(2) stack.Push(3) for len(stack) > 0 { val, err := stack.Pop() if err == nil { fmt.Println("تم الاستخراج:", val) } }}


تُستخدم المكدسات في خوارزميات اجتياز الأشجار، والتحقق من الأقواس، والتراجع عن الإجراءات (undo)، وتحليل التعبيرات.



الطابور (Queue) في Go



يعمل الطابور وفق مبدأ FIFO (First In, First Out). في Go، يمكن تنفيذه باستخدام شريحة أو قائمة مزدوجة الارتباط.



package main

import "fmt"

type Queue []int

func (q *Queue) Enqueue(v int) { *q = append(*q, v)}

func (q *Queue) Dequeue() (int, bool) { if len(*q) == 0 { return 0, false } element := (*q)[0] *q = (*q)[1:] return element, true}

func main() { queue := Queue{} queue.Enqueue(10) queue.Enqueue(20) queue.Enqueue(30) for len(queue) > 0 { val, ok := queue.Dequeue() if ok { fmt.Println("تم الاستخراج:", val) } }}


تُستخدم الطوابير في أنظمة إدارة المهام، وتخزين البيانات مؤقتًا، وخوارزميات البحث بالعرض (BFS).



خوارزميات الفرز والبحث الأساسية



الفرز الفقاعي (Bubble Sort)



خوارزمية فرز بسيطة تمر بشكل متكرر عبر المصفوفة، وتقارن العناصر المتجاورة وتتبادلها إذا كانت في ترتيب غير صحيح.



package main

import "fmt"

func bubbleSort(arr []int) { n := len(arr) for i := 0; i < n-1; i++ { for j := 0; j < n-i-1; j++ { if arr[j] > arr[j+1] { arr[j], arr[j+1] = arr[j+1], arr[j] } } }}

func main() { data

المدونات

توصيات الكتب