اذهب إلى المحتوى
  • 0

كيف اطبق علي هياكل البيانات linked list في بايثون

Ail Ahmed

السؤال

السلام عليكم

انا طبق علي علي هياكل البيانات  linked list بلغه سي في كورس CS50 وكان الموضوع صعب شوي هل كمان صعب في لغة الباثيون

فا انا كانت عاوز اعارف اي الخطوات المفروض انا امشي عليها

بس لو سمحتو من غير كتابت كود انا عاوز اعارف اي الخطوات المفروض انا امشي عليها

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

لغة C صعبة بالطبع ولا أنصحك بها كبداية ولا حتى C++، لا مشكلة في تجربة التعلم من خلالهم، لكن في حال وجدت صعوبة بعدما حاولت بحيث تصيبك بالإحباط، فانتقل إلى لغة بايثون حيث يوجد C50 من خلال لغة بايثون ابحث عن CS50 PYTHON على اليوتيوب.

والفكرة أنّ بايثون وجافاسكريبت مثلاً لغات سهلة وعالية المستوى (أي بها تجريد كثير للأمور التي تحدث في الخلفية أي تخفيها عنك) وبايثون أسهل، الأمر الذي يساعدك على تعلم المفاهيم البرمجية دونّ إضافة عبء صعوبة تعلم اللغة البرمجية نفسها.

ودائمًا ستجد أن يتم النُصح بالبدء بلغة قوية مثل C++ لكن النصيحة بدون معرفة الشخص نفسه وخبراته أمر غير صحيح، فالبعض يناسبهم ذلك والبعض لا يناسبهم وقد يضرهم ذلك، وبعد تعلم اللغة البرمجية الأولى من خلال لغة سهلة واستيعاب المفاهيم البرمجية ستجد أنّ تعلم c++ أصبح أسهل.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 1 دقيقة مضت قال Mustafa Suleiman:

لغة C صعبة بالطبع ولا أنصحك بها كبداية ولا حتى C++، لا مشكلة في تجربة التعلم من خلالهم، لكن في حال وجدت صعوبة بعدما حاولت بحيث تصيبك بالإحباط، فانتقل إلى لغة بايثون حيث يوجد C50 من خلال لغة بايثون ابحث عن CS50 PYTHON على اليوتيوب.

والفكرة أنّ بايثون وجافاسكريبت مثلاً لغات سهلة وعالية المستوى (أي بها تجريد كثير للأمور التي تحدث في الخلفية أي تخفيها عنك) وبايثون أسهل، الأمر الذي يساعدك على تعلم المفاهيم البرمجية دونّ إضافة عبء صعوبة تعلم اللغة البرمجية نفسها.

ودائمًا ستجد أن يتم النُصح بالبدء بلغة قوية مثل C++ لكن النصيحة بدون معرفة الشخص نفسه وخبراته أمر غير صحيح، فالبعض يناسبهم ذلك والبعض لا يناسبهم وقد يضرهم ذلك، وبعد تعلم اللغة البرمجية الأولى من خلال لغة سهلة واستيعاب المفاهيم البرمجية ستجد أنّ تعلم c++ أصبح أسهل.

تمام جدا

بس انا كانت عاوز اي اي الخطوات المفروض امشي عليها عشان اعمل Linked List في باثيون

الخطوات فقط من غير كاتب الكود

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 2 ساعة قال Ail Ahmed:

بس انا كانت عاوز اي اي الخطوات المفروض امشي عليها عشان اعمل Linked List في باثيون

لغة بايثون مختلفة عن لغة C في هذه الجزئية، لأن C فيها مفاهيم الهياكل (structs) والمؤشّرات (pointers)، وهذه هي اللبنات الأساسية لإنشاء القوائم المترابطة (Linked lists).

أمّا في بايثون، فيمكننا إنشاء شيء شبيه بالقوائم المترابطة عن طريق استخدام القواميس (dictionaries) كبديل عن الهياكل، ونقوم بعمليات الإسناد المباشر عوضا عن استخدام المؤشرات لأن المؤشرات غير موجودة في بايثون، لكن عملية الإسناد تحفظ إشارة نحو العنصر، وهذا هو المطلوب.

بتاريخ 2 ساعة قال Ail Ahmed:

الخطوات فقط من غير كاتب الكود

 امممم، من الصعب الشرح بدون كتابة أي كود، لكن سأحاول التقليل من الكود كما طلبت. في القائمة المترابطة، كل عنصر هو dict، هذا العنصر يحوي شيئين بداخله، الأوّل هو البيانات التي يجب على العنصر الاحتفاظ بها،  والثاني هو العنصر التالي له.

يعني إذا أردنا ترجمة الكود التالي من لغة C الذي يقوم بإنشاء عنصر:

#include <stdlib.h>

typedef struct E Element;
struct E {
  int data;
  Element * next;
};

int main() {
  Element *e = (Element *)malloc(sizeof(Element));
  e->data = 5;
  e->next = NULL;
}

فسيكون هكذا في بايثون:

e = {
  'data': 5,
  'next': None
}

الآن تعرف ما يجب فعله لربط هذا العنصر بغيره. فقط إسناد العنصر التالي إلى e['next'].

في هذا المثال استخدمت dict لأن هذه هي أبسط طريقة، لكن يمكنك أيضا استخدام الأصناف (classes) إذا كنت تحسن البرمجة الكائنية (OOP) في بايثون:

class Element:
  
  def __init__(self, data):
    self.data = data
    self.next = None


e = Element(5)

ولربط العنصر التالي يكفي اسناده إلى e.next .

لا تنس دائما الاحتفاظ بأوّل عنصر في القائمة المترابطة لأنه من خلاله يمكنك الدخول إلى بقية العناصر، عن طريق حلقة تكرارية مثل while.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 20 دقائق مضت قال حمزة عباد:

لغة بايثون مختلفة عن لغة C في هذه الجزئية، لأن C فيها مفاهيم الهياكل (structs) والمؤشّرات (pointers)، وهذه هي اللبنات الأساسية لإنشاء القوائم المترابطة (Linked lists).

أمّا في بايثون، فيمكننا إنشاء شيء شبيه بالقوائم المترابطة عن طريق استخدام القواميس (dictionaries) كبديل عن الهياكل، ونقوم بعمليات الإسناد المباشر عوضا عن استخدام المؤشرات لأن المؤشرات غير موجودة في بايثون، لكن عملية الإسناد تحفظ إشارة نحو العنصر، وهذا هو المطلوب.

ايوه هو ده الا انا كانت عاوز افهمو

بتاريخ 25 دقائق مضت قال حمزة عباد:
class Element:
  
  def __init__(self, data):
    self.data = data
    self.next = None

انا عملت كده

شكرااا جدااا لحضرتك

بتاريخ 31 دقائق مضت قال حمزة عباد:

من الصعب الشرح بدون كتابة أي كود،

خالص ممكن حضرتك تكمل الكود؟

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 10 ساعة قال Ail Ahmed:

خالص ممكن حضرتك تكمل الكود؟

حسنا باستخدام الكود السابق قد قمنا بإنشاء عنصر من القائمة. الآن إذا أردنا أن نتبع نفس مبادئ لغة C فسنحتاج إلى إنشاء عنصر يمثّل عنصر رأس القائمة. عادة ما يتم كتابة شيء كهذا في لغة C  :

#include <stdlib.h>

typedef struct E Element;
struct E {
  int data;
  Element * next;
};

typedef struct L List;
struct L {
  Element * first;
  // يمكن إضافة حقول أخرى هنا لكننا نكتفي حاليا بأبسط مثال
};

int main() {
  List * list = (List *)malloc(sizeof(List));
  Element * firstElement = (Element *)malloc(sizeof(Element));
  firstElement->data = 5;
  firstElement->next = NULL;
  list->first = firstElement;
}

إذا أردنا تحويل هذا إلى Python باستخدام OOP فيمكن كتابة شيء كهذا:

class Element:
  
  def __init__(self, data):
    self.data = data
    self.next = None


class List:
  
  def __init__(self):
    self.first = None
    
    
first_element = Element(5)
linked_list = List()
linked_list.first = first_element

هذا مثال لإنشاء رأس القائمة وربط أوّل عنصر بها. الآن لإنشاء المزيد من العناصر وربطها يكفي أن نقوم بإسناد كل عنصر إلى next في العنصر السابق. هذا مثال للقيام بذلك باستخدام حلقة for:

current_element = linked_list.first
for i in range(10, 20):
  next_element = Element(i)
  current_element.next = next_element
  next_element = current_element

والآن لعرض كل العناصر يمكن استخدام حلقة while هكذا:

current_element = linked_list.first
while current_element != None:
  print(current_element.data)
  current_element = current_element.next

يمكن أن تتدرب على القيام بمزيد من العمليات على القوائم المترابطة بهذه الطريقة (مثلا، البحث عن عنصر، حذف عنصر، إدخال عنصر في وسط القائمة...) وإذا واجهتك أيّة مشاكل فيمكنك طرح سؤال حولها.

يرجى الانتباه إلى أن هذه الطريقة في إنشاء القوائم المترابطة في لغة Python تستخدم لتدريب الطلاب وتعليمهم مفاهيم الخوارزميات، لكن في البرامج الكبيرة الحقيقية فإننا لا نستخدم هذه الأكواد لأنها تجعل البرنامج يعمل بشكل أبطأ من الممكن. من الأحسن استخدام list التي توفّرها لغة Python فهي أبسط في الاستخدام وأكثر كفاءة. كما أنّه توجد الكثير من المكتبات التي تمنح هياكل بيانات أكثر سرعة من list في بعض الأمور (مثل Numpy و Numba وغيرها من المكتبات المتعلّقة بهندسة البيانات والذكاء الاصطناعي).

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 6 ساعة قال حمزة عباد:

من الأحسن استخدام list التي توفّرها لغة Python فهي أبسط في الاستخدام وأكثر كفاءة. كما أنّه توجد الكثير من المكتبات التي تمنح هياكل بيانات أكثر سرعة من list في بعض الأمور (مثل Numpy و Numba وغيرها من المكتبات المتعلّقة بهندسة البيانات والذكاء الاصطناعي).

شكرااا جدا علي المعلوما دي

بتاريخ 6 ساعة قال حمزة عباد:

حسنا باستخدام الكود السابق قد قمنا بإنشاء عنصر من القائمة. الآن إذا أردنا أن نتبع نفس مبادئ لغة C فسنحتاج إلى إنشاء عنصر يمثّل عنصر رأس القائمة. عادة ما يتم كتابة شيء كهذا في لغة C  :

#include <stdlib.h>

typedef struct E Element;
struct E {
  int data;
  Element * next;
};

typedef struct L List;
struct L {
  Element * first;
  // يمكن إضافة حقول أخرى هنا لكننا نكتفي حاليا بأبسط مثال
};

int main() {
  List * list = (List *)malloc(sizeof(List));
  Element * firstElement = (Element *)malloc(sizeof(Element));
  firstElement->data = 5;
  firstElement->next = NULL;
  list->first = firstElement;
}

إذا أردنا تحويل هذا إلى Python باستخدام OOP فيمكن كتابة شيء كهذا:

class Element:
  
  def __init__(self, data):
    self.data = data
    self.next = None


class List:
  
  def __init__(self):
    self.first = None
    
    
first_element = Element(5)
linked_list = List()
linked_list.first = first_element

هذا مثال لإنشاء رأس القائمة وربط أوّل عنصر بها. الآن لإنشاء المزيد من العناصر وربطها يكفي أن نقوم بإسناد كل عنصر إلى next في العنصر السابق. هذا مثال للقيام بذلك باستخدام حلقة for:

current_element = linked_list.first
for i in range(10, 20):
  next_element = Element(i)
  current_element.next = next_element
  next_element = current_element

والآن لعرض كل العناصر يمكن استخدام حلقة while هكذا:

current_element = linked_list.first
while current_element != None:
  print(current_element.data)
  current_element = current_element.next

يمكن أن تتدرب على القيام بمزيد من العمليات على القوائم المترابطة بهذه الطريقة (مثلا، البحث عن عنصر، حذف عنصر، إدخال عنصر في وسط القائمة...) وإذا واجهتك أيّة مشاكل فيمكنك طرح سؤال حولها.

يرجى الانتباه إلى أن هذه الطريقة في إنشاء القوائم المترابطة في لغة Python تستخدم لتدريب الطلاب وتعليمهم مفاهيم الخوارزميات، لكن في البرامج الكبيرة الحقيقية فإننا لا نستخدم هذه الأكواد لأنها تجعل البرنامج يعمل بشكل أبطأ من الممكن. من الأحسن استخدام list التي توفّرها لغة Python فهي أبسط في الاستخدام وأكثر كفاءة. كما أنّه توجد الكثير من المكتبات التي تمنح هياكل بيانات أكثر سرعة من list في بعض الأمور (مثل Numpy و Numba وغيرها من المكتبات المتعلّقة بهندسة البيانات والذكاء الاصطناعي).

شكرااا جدا لحضرتك والله

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...