Back home

هياكل البيانات 1 - التعمق في هياكل البيانات

هياكل البيانات — الغوص في هياكل البيانات (الجزء الأول)

هياكل البيانات - الغوص في هياكل البيانات (الجزء الأول) هياكل البيانات - الغوص في هياكل البيانات (الجزء الأول)

مصدر المقال: https://medium.com/omarelgabrys-blog/diving-into-data-structures-6bc71b2e8f92

[جدول المحتويات]

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

ما هي بنية البيانات ما هي بنية البيانات

لا يبدأ الأمر دون أن نسأل: ما هي بنية البيانات؟ لا يبدأ الأمر بالسؤال: ما هي بنية البيانات بحق الجحيم؟

إنه ترتيب مقصود لمجموعة من البيانات التي قمنا ببنائها. هو ترتيب مقصود لجمع البيانات التي نقوم بإنشائها.

الترتيب المتعمد الترتيب المتعمد

الترتيب المتعمد يعني الترتيب الذي يتم إجراؤه عن قصد لفرض نوع من التنظيم المنهجي على البيانات وإنفاذه. يشير الترتيب المتعمد إلى ترتيب هادف يهدف إلى تنظيم منهجي للبيانات. يشير الترتيب المتعمد إلى الترتيب المتعمد للبيانات في بعض التنظيم المنهجي. يشير الترتيب المتعمد إلى ترتيب متعمد يفرض تنظيمًا منهجيًا معينًا للبيانات.

نظرًا لأنه مفيد، فهو يجعل حياتنا أسهل، ومن السهل إدارتها عندما تحتفظ بالمعلومات ذات الصلة معًا. ولأنه مفيد، فإنه يجعل حياتنا أسهل ويسهل إدارته عندما تقوم بتجميع المعلومات ذات الصلة معًا.

هياكل البيانات في حياتنا هياكل البيانات في حياتنا

نحن بحاجة إلى هياكل البيانات في برامجنا لأننا نفكر بهذه الطريقة كبشر. في برامجنا، نحتاج إلى هياكل البيانات لأن هذه هي الطريقة التي نفكر بها نحن البشر.

الوصفة هي بنية بيانات فعلية، مثل قائمة التسوق، ودليل الهاتف، والقاموس، وما إلى ذلك. جميعها لها بنية، ولها تنسيق. الوصفة عبارة عن بنية بيانات فعلية، تمامًا مثل قائمة التسوق، ودليل الهاتف، والقاموس، وما إلى ذلك. جميعها لها بنية، ولكل منها تنسيق.

بنية البيانات والبرمجة الشيئية بنية البيانات والبرمجة الشيئية

الآن، إذا كنت مبرمجًا كائنيًا، فربما تفكر، حسنًا، أليس هذا ما نفعله بالفئات والكائنات؟. إذا كنت مبرمجًا موجهًا للكائنات، فربما تفكر، أليس هذا ما نفعله بالفئات والكائنات؟

أعني أننا نحدد هذه الأشياء في العالم الحقيقي في البرنامج لأننا نفكر بهذه الطريقة كبشر، أو على الأقل من المفترض أن نفعل ذلك. أعني أننا نحدد هذه الأشياء في العالم الحقيقي في برنامج ما لأننا نفكر مثل البشر، أو على الأقل من المفترض أن نفكر بهذه الطريقة.

ونعم بالتأكيد. الكائنات هي نوع من بنية البيانات، وليست الوحيدة. نعم بالطبع. الكائن عبارة عن بنية بيانات، وليس الوحيد.

خمسة سلوكيات أساسية خمسة سلوكيات أساسية

كيفية الوصول، والإدراج، والحذف، والبحث، والفرز. هذه هي العمليات التي من المرجح أن تقوم بها. كيفية الوصول والإدراج والحذف والبحث والفرز. هذه هي الإجراءات التي من المرجح أن تقوم بها.

ليست كل هياكل البيانات لديها السلوكيات الأساسية الخمسة. ليست كل هياكل البيانات لديها هذه السلوكيات الخمسة الأساسية.

على سبيل المثال، لا تدعم العديد من هياكل البيانات أي نوع من سلوك البحث، فهي مجرد مجموعة كبيرة، وحاوية كبيرة من الأشياء، وإذا كنت بحاجة إلى العثور على شيء ما، فما عليك سوى الاطلاع عليه بنفسك. والكثير منهم لا يقدمون أي نوع من سلوك الفرز. ويتم فرز البعض الآخر بشكل طبيعي. على سبيل المثال، لا تدعم العديد من هياكل البيانات أي نوع من سلوك البحث، فهي مجرد مجموعة كبيرة، وحاوية كبيرة لشيء ما، وإذا كنت بحاجة إلى العثور على شيء ما، فما عليك سوى تكرار ذلك بنفسك. والكثير منهم لا يقدمون أي سلوك فرز. ترتيب طبيعي آخر.

كل بنية بيانات لها طريقتها الخاصة المختلفة، أو خوارزمية مختلفة للفرز، والإدراج، والبحث،…إلخ، لماذا؟ لأنه، نظرًا لطبيعة بنية البيانات، هناك خوارزميات تُستخدم مع بنية بيانات محددة، حيث لا يمكن استخدام بعضها الآخر. كل بنية بيانات لها طريقتها المختلفة، أو خوارزميات مختلفة للفرز والإدراج والبحث وما إلى ذلك. لماذا؟ لأنه بسبب طبيعة هياكل البيانات، هناك بعض الخوارزميات التي تعمل مع بنية بيانات معينة ولا يمكن استخدام بعض الخوارزميات الأخرى.

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

اقرأ دائمًا وثائق اللغة وتحقق من أداء الخوارزميات المستخدمة مع بنية البيانات الأساسية. يمكن استخدام خوارزميات مختلفة بناءً على البيانات المتوفرة لديك (حجمها ونوعها…). اقرأ دائمًا وثائق اللغة وتحقق من أداء الخوارزميات المستخدمة مع هياكل البيانات الأساسية. يمكن استخدام خوارزميات مختلفة بناءً على البيانات (حجم البيانات، نوعها،…).

المصفوفات أحادية البعد مصفوفة أحادية البعد

المصفوفة هي بنية البيانات الأساسية والأكثر استخدامًا في جميع لغات البرمجة. يتم بشكل عام دعم المصفوفات أحادية البعد بشكل مباشر في اللغة الأساسية نفسها. المصفوفات هي بنية البيانات الأساسية والأكثر استخدامًا في جميع لغات البرمجة. عادةً ما يتم دمج دعم المصفوفات أحادية البعد مباشرةً في اللغة الأساسية نفسها.

المصفوفة عبارة عن مجموعة مرتبة من العناصر، حيث يحتوي كل عنصر داخل المصفوفة على فهرس. المصفوفة عبارة عن مجموعة مرتبة من العناصر، ولكل عنصر في المصفوفة فهرس.

فهرس الفهارس

الفهارس مرتبة، وهي فهرس صفري في معظم اللغات، ولكن هذا ليس هو الحال مع اللغات القليلة الأخرى. الفهارس متسلسلة، وفي معظم اللغات تكون فهارس ذات أساس صفري، ولكن في عدد قليل من اللغات الأخرى ليس هذا هو الحال.

حجم الحجمأبسط المصفوفات هي ذات حجم ثابت، وتسمى أيضًا غير قابلة للتغيير، أي مصفوفات غير قابلة للتغيير. يمكن إنشاؤها في البداية بأي حجم. ولكن بمجرد إنشاء المصفوفة، لا يمكنك إضافة أو إزالة عناصر منها.

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

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

نوع البيانات نوع البيانات

عادةً ما تقتصر المصفوفات البسيطة على نوع معين من البيانات. إنها مجموعة من الأعداد الصحيحة، أو مجموعة من القيم المنطقية. لكن بعض اللغات تسمح لك بإنشاء مصفوفات من الكائنات العامة فقط، مما يعني أنه يمكنك وضع أنواع مختلفة من البيانات. تقتصر المصفوفات البسيطة عادة على أنواع محددة من البيانات. إنها مجموعة من الأعداد الصحيحة، أو مجموعة من القيم المنطقية. لكن بعض اللغات تسمح بإنشاء مصفوفات من الكائنات العامة، مما يعني إمكانية وضع أنواع مختلفة من البيانات.

array = [123, true, "string", [1,2,3], object]

المصفوفات متعددة الأبعاد المصفوفة متعددة الأبعاد

إذا أخذنا المصفوفة ذات البعد الواحد خطوة أخرى إلى الأمام، فيمكننا أن نحصل على مصفوفات ذات بعدين. وبأخذ المصفوفة أحادية البعد أبعد من ذلك، يمكننا الحصول على مصفوفة ثنائية الأبعاد.

إنها في الأساس مصفوفة من المصفوفات، حيث يحتوي كل عنصر في هذه المصفوفة نفسها على مصفوفة أخرى. وهي في الأساس مصفوفة من المصفوفات، حيث يحتوي كل عنصر في المصفوفة نفسها على مصفوفة أخرى.

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

يمكننا أن نأخذ المصفوفة ثنائية الأبعاد إلى المصفوفات ثلاثية الأبعاد وأكثر من ذلك. يمكننا أيضًا تطوير المصفوفات ثنائية الأبعاد إلى مصفوفات ثلاثية الأبعاد، بل وأكثر من ذلك.

المصفوفات الخشنة المصفوفة الخشنة

عندما يكون لدينا مصفوفة متعددة الأبعاد، حيث يحتاج كل صف وكل عنصر إلى عدد مختلف من العناصر. وهنا يأتي دور المصفوفات الخشنة. عندما يكون لدينا مصفوفة متعددة الأبعاد، يجب أن يحتوي كل صف وكل عنصر على عدد مختلف من العناصر. هذا هو المكان الذي تلعب فيه المصفوفات الخشنة.

إنها مصفوفة متعددة الأبعاد حيث يمكن أن يكون لكل عنصر أحجام مختلفة. عبارة عن مصفوفة متعددة الأبعاد، ويمكن أن يكون لكل إدخال أحجام مختلفة.

الصفوف لها عدد مختلف من الحجارة صفوف بأعداد مختلفة من الحجارة

متى تستخدم المصفوفات الخشنة متى تستخدم المصفوفات الخشنة

إذا كان لديك مصفوفة متعددة الأبعاد تسجل عدد المبيعات كل يوم. المؤشر الأول للشهر والثاني لليوم. إذا كان لديك مصفوفة متعددة الأبعاد تسجل المبيعات اليومية. الفهرس الأول خاص بالشهر الحالي، والفهرس الثاني خاص باليوم الحالي.

sales = [[124,153,135, …], [135,545,342,678,], …]

يمكنك ملاحظة أن شهر يناير لديه 31 يومًا، بينما يكون يوم 29 فبراير، وهكذا. لذلك، إما ترك العناصر غير ذات الصلة فارغة، أو تعيينها على 0 أو -99 أو أي قيمة أخرى ليس أمرًا مرغوبًا فيه دائمًا. لكن لا ينبغي أن يكون لديك عناصر تمثل المستحيلات. مثل شهر فبراير، حيث لا يوجد أيام 30 و31. يمكنك ملاحظة أن شهر يناير به 31 يومًا، بينما شهر فبراير به 29 يومًا، وهكذا. لذلك، ليس من المستحسن دائمًا إبقاء العناصر غير ذات الصلة فارغة، أو تعيينها على 0 أو -99 أو أي قيم أخرى. ومع ذلك، لا ينبغي أن يكون لديك العناصر التي تمثل المستحيل. على سبيل المثال، في شهر فبراير، لا يوجد 30 و31 يومًا.

لذلك، باستخدام المصفوفات المتعرجة، يمكننا الحصول على متوسط ​​المبيعات في شهر واحد عن طريق جمع جميع المبيعات في ذلك الشهر، وإضافتها جميعًا، وتقسيمها على عدد الأيام في ذلك الشهر، دون الحاجة إلى إضافة منطق لمعرفة الأيام التي يجب أن نتجاهلها. لذلك، باستخدام مصفوفة خشنة، يمكننا الحصول على متوسط ​​المبيعات لمدة شهر عن طريق جمع جميع مبيعات الشهر، وإضافتها، ثم قسمتها على عدد أيام الشهر، دون إضافة منطق لحساب عدد الأيام التي يجب تجاهلها.

المصفوفات التي يمكن تغيير حجمها المصفوفات التي يمكن تغيير حجمها

توفر معظم اللغات نوعًا من المصفوفة القابلة لتغيير الحجم، أو المصفوفة الديناميكية، أو القابلة للتغيير. في Java، يكون المصفوفة القياسية ذات حجم ثابت ونوع بيانات ثابت، ولكن يمكنك أيضًا إنشاء مصفوفة يمكن تغيير حجمها باستخدام ArrayList. توفر معظم اللغات نوعًا من المصفوفة القابلة للتعديل أو الديناميكية أو القابلة للتغيير. في Java، تكون المصفوفات القياسية ذات حجم ثابت ونوع بيانات ثابت، ومع ذلك، يمكنك أيضًا إنشاء صفائف يمكن تغيير حجمها باستخدام ArrayList.

إضافة وإزالة إضافة وإزالة

الموقع الذي نضيف فيه عنصرًا جديدًا أو نزيل عنصرًا موجودًا له أهمية كبيرة، لأن إضافة عنصر أو إزالته في النهاية يكون أسرع من أي مكان آخر. إن الموضع الذي تقوم فيه بإضافة عنصر جديد أو إزالة عنصر موجود مهم، حيث أن إضافة العناصر أو إزالتها في النهاية تكون أسرع من أي مكان آخر.

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

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

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

يكون الفرز دائمًا مكثفًا من الناحية الحسابية، وقد تحتاج إلى القيام بذلك ولكننا نريد تقليله إلى الحد الأدنى. لذلك، فإن فهم مقدار البيانات المتوفرة لدينا وعدد المرات التي نحتاج فيها إلى الفرز قد يقودنا إلى اختيار بنية بيانات مختلفة.

فرز الأشخاص حسب الطول —pleacher.com الترتيب حسب الارتفاع

وظيفة الفرز المضمنة وظيفة الفرز المضمنة

عندما نقوم بفرز المصفوفات، هناك أشياء تحتاجها لفهم وظيفة الفرز المضمنة. عندما نقوم بفرز مصفوفة، عليك أن تعرف المزيد عن وظيفة الفرز المضمنة.

ثانيًا، هل ستحاول وظيفة الفرز المضمنة فرز مصفوفة موجودة في مكانها أم ستنشئ نسخة أخرى؟. ستحاول معظم اللغات ترتيب مصفوفة موجودة في مكانها، بينما ستنشئ بعضها نسخة جديدة من المصفوفة الأصلية لتحتوي على المصفوفة التي تم فرزها. ثانيًا، هل تحاول وظيفة الفرز المضمنة فرز المصفوفة الموجودة أم إنشاء نسخة أخرى؟ ستحاول معظم اللغات فرز المصفوفة الموجودة، بينما ستنشئ بعضها نسخة جديدة من المصفوفة الأصلية لتحتوي على المصفوفة التي تم فرزها.

فرز الكائنات المخصصة فرز الكائنات المخصصة

في اللغات الموجهة للكائنات، غالبًا ما يكون لديك مصفوفات من الكائنات المخصصة الخاصة بك، وليس فقط مصفوفات من القيم الرقمية البسيطة أو حتى القيم النصية. في اللغات الموجهة للكائنات، عادة ما يكون لديك مصفوفة خاصة بك من الكائنات المخصصة، وليس مجرد مصفوفة بسيطة من الأرقام أو حتى مصفوفة من السلاسل.

عندما تطلب بعد ذلك من تلك المصفوفة فرز تلك الكائنات باستخدام وظيفة الفرز المضمنة في اللغة. إنها ببساطة لن تعرف كيفية القيام بذلك. لأنك تحتاج إلى تقديم المزيد من المعلومات حول الخاصية التي سيتم فرزها وفقًا لذلك. ثم يُطلب من المصفوفة فرز هذه الكائنات باستخدام وظيفة الفرز المضمنة في اللغة. إنه ببساطة لا يعرف كيفية القيام بذلك. لأنك تحتاج إلى تقديم مزيد من المعلومات حول خصائص الفرز المقابلة.

لذلك، على سبيل المثال، قم بفرز المستخدمين حسب هويتهم أو أسمائهم أو تاريخ ميلادهم. يحدد هذا خاصية الكائن للفرز وفقًا لذلك. على سبيل المثال، قم بفرز المستخدمين حسب المعرف أو الاسم أو تاريخ الميلاد. يحدد هذا خصائص الكائن ليتم فرزه وفقًا لذلك.

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

##مصفوفات البحث مصفوفة البحث

إذا أردنا معرفة ما إذا كانت قيمة معينة موجودة في مكان ما في مصفوفة أم لا، فيمكننا تكرار عناصر المصفوفة، والتحقق من القيمة في هذا الموضع الحالي، ومعرفة ما إذا كانت مساوية للهدف أم لا. إذا أردنا معرفة ما إذا كانت هناك قيمة معينة في المصفوفة، فيمكننا المرور عبر عناصر المصفوفة والتحقق من القيمة في الموضع الحالي لمعرفة ما إذا كانت مساوية للهدف.

استمر في البحث حتى تحت السرير استمر في البحث حتى تحت السرير

أفضل سيناريو هو أن العنصر الأول هو القيمة التي نبحث عنها. أسوأ الحالات هي أن تكون القيمة في النهاية أو لا تظهر في أي مكان في المصفوفة. ويشار إلى هذه الطريقة بالبحث الخطي أو البحث المتسلسل. هذه طريقة غير أنيقة للقوة الغاشمة. في أفضل السيناريوهات، العنصر الأول هو القيمة التي نبحث عنها. السيناريو الأسوأ هو أن تظهر القيمة في نهاية المصفوفة أو لا تظهر في أي مكان في المصفوفة. تسمى هذه الطريقة بالبحث الخطي أو البحث المتسلسل. هذه طريقة القوة الغاشمة غير الأنيقة.

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

البيانات التي تحتاج إلى ترتيب تحتاج إلى فرز البيانات

إذا لم يكن هناك ترتيب، ولا يوجد تسلسل يمكن التنبؤ به للقيم الموجودة في المصفوفة، فقد لا يكون هناك خيارات أخرى سوى التحقق من جميع عناصر المصفوفة. إذا كانت القيم الموجودة في المصفوفة ليس لها ترتيب، ولا يوجد تسلسل يمكن التنبؤ به، فقد لا يكون هناك خيار آخر سوى التحقق من جميع عناصر المصفوفة.

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

تحدي وراثة هياكل البيانات تحدي وراثة هياكل البيانات

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

لذا، إذا كنت ستبحث في مصفوفة مرة واحدة، فمن الأفضل أن يكون لديك تعقيد O(N) للبحث الخطي، بدلاً من O(NLogN) للفرز + O(LogN) للبحث. ومع ذلك، إذا كنت ستبحث كثيرًا، فيمكنك أولاً فرز المصفوفة مرة واحدة في البداية، والآن، يمكنك البحث باستخدام O(LogN) في كل مرة بدلاً من البحث الخطي O(N). لذا، إذا كنت تريد البحث مرة واحدة في مصفوفة، فسيكون O(N) أكثر تعقيدًا للبحث الخطي من فرز O(NLogN) + O(LogN). ومع ذلك، إذا كنت ستجري الكثير من عمليات البحث، فيمكنك أولاً فرز المصفوفة مرة واحدة في البداية، والآن يمكنك البحث باستخدام O(LogN) في كل مرة بدلاً من O(N) باستخدام البحث الخطي.** لا يمكن أن يكون لديك بنية بيانات جيدة بنفس القدر في جميع المواقف. تتطلب بنية البيانات المصنفة بشكل طبيعي وقتًا أقل في البحث عن عنصر، ووقتًا أطول في الإدراج لأنها تحافظ على ترتيب المصفوفة. بينما تتطلب المصفوفة الأساسية وقتًا أطول في البحث، ووقتًا أقل في إدراج العناصر في نهاية المصفوفة.** لا يمكن أن يكون لديك بنية بيانات جيدة بنفس القدر في جميع المواقف. تتطلب بنية البيانات المرتبة بشكل طبيعي وقتًا أقل للبحث عن العناصر ووقتًا أطول للإدراج لأنها تحافظ على ترتيب المصفوفة. بينما تتطلب المصفوفات الأساسية وقتًا أطول في البحث، فإن إدراج العناصر في نهاية المصفوفة يستغرق وقتًا أقل

##قائمة القوائم

القوائم هي هياكل بيانات بسيطة جدًا. هيكلها يتتبع تسلسل العناصر. القوائم هي هياكل بيانات بسيطة للغاية. إنها منظمة لتتبع ترتيب العناصر.

It’s a collection of items (called nodes) ordered in a linear sequence.
它是按线性顺序排列的项(称为节点)的集合。

لا يلزم تخصيص هذه العقد بجوار بعضها البعض في الذاكرة مثل المصفوفة. لا يلزم تخصيص العقد بشكل متجاور في الذاكرة مثل المصفوفات.

هناك مفهوم برمجة نظري عام للقائمة، وهناك تنفيذ محدد لبنية بيانات القائمة، والذي ربما أخذ فكرة القائمة الأساسية هذه وأضاف مجموعة كاملة من الوظائف. يتم تنفيذ القوائم إما كقوائم مرتبطة (مفردة، مزدوجة، دائرية، …) أو كمصفوفة ديناميكية. هناك مفهوم برمجة نظري عام للقوائم، وهناك تطبيق محدد لبنية بيانات القائمة التي ربما تأخذ مفهوم القائمة الأساسي هذا وتضيف مجموعة من الوظائف. يمكن تنفيذ القوائم كقوائم مرتبطة (قوائم مرتبطة منفردة، قوائم مرتبطة مزدوجة، قوائم مرتبطة دائرية، قوائم مرتبطة دائرية) أو كمصفوفات ديناميكية.

مصفوفة مقابل قائمة مصفوفة مقابل قائمة

القائمة هي نوع مختلف من بنية البيانات من المصفوفة. القوائم هي بنية بيانات مختلفة عن المصفوفات.

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

لا يدعم هيكل القائمة الفهرس الرقمي مثل المصفوفة. لا يدعم هيكل القائمة الفهرسة الرقمية مثل المصفوفة.

##القوائم المرتبطة القائمة المرتبطة

It’s a collection of nodes, where each node has a value and a link to the next node in the list.
它是节点的集合,每个节点都有一个值和到列表中下一个节点的链接。

يشير مؤشر العقدة الأخيرة إلى NULL، أو فاصل، أو عقدة وهمية. يشير مؤشر العقدة الأخيرة إلى NULL، أو الإنهاء، أو العقدة الافتراضية.

القائمة المرتبطة - ويكيبيديا قائمة الروابط - ويكيبيديا

نظرًا للطريقة التي تم بها إنشاء العناصر، فإن إضافة العناصر وإزالتها أسهل بكثير من استخدام المصفوفة. نظرًا للطريقة التي تم إنشاؤها بها، فإن إضافة العناصر وإزالتها أسهل بكثير من المصفوفة.

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

##قائمة مرتبطة بشكل مضاعف قائمة مرتبطة بشكل مضاعف

ما قدمناه هو قائمة مرتبطة، ولكن لكي نكون أكثر تحديدًا، فهذه تسمى “قائمة مرتبطة منفردة”. يمكننا أيضًا الحصول على “قائمة مرتبطة بشكل مزدوج”. لقد قدمنا ​​قائمة مرتبطة، ولكن لكي نكون أكثر تحديدًا، فهذه ما يسمى “قائمة مرتبطة منفردة”. يمكننا أيضًا الحصول على “قائمة مرتبطة مزدوجة”.

بدلاً من أن تحتوي كل عقدة على مرجع إلى العقدة التالية فقط، فإننا نضيف قطعة أخرى من البيانات تحتوي أيضًا على مرجع إلى العقدة السابقة أيضًا. لذلك، فهو يسمح لنا بالتقدم للأمام والخلف، واجتياز القائمة في أي اتجاه. بدلاً من أن تحتوي كل عقدة على مرجع فقط إلى العقدة التالية، تتم إضافة جزء آخر من البيانات يحتوي أيضًا على مرجع إلى العقدة السابقة. لذلك، فهو يسمح لنا بالتقدم للأمام والخلف، واجتياز القائمة في أي اتجاه.

القائمة المرتبطة بشكل مزدوج - ويكيبيديا قائمة مرتبطة مضاعفة - ويكيبيديا

يتم عادةً تنفيذ القوائم المرتبطة في معظم اللغات كقوائم مرتبطة بشكل مزدوج. في معظم اللغات، يتم عادةً تنفيذ القوائم المرتبطة كقوائم مرتبطة بشكل مزدوج.

القائمة المرتبطة بشكل فردي مقابل القائمة المرتبطة بشكل مزدوج القائمة المرتبطة بشكل فردي مقابل القائمة المرتبطة بشكل مزدوج

من الواضح أن عملية الإضافة تكون أقل عملاً في القائمة المرتبطة بشكل فردي، لأن القائمة المرتبطة بشكل مضاعف تتطلب تغيير روابط أكثر من القائمة المرتبطة بشكل فردي. من الواضح أن إضافة عملية ** إلى قائمة مرتبطة بشكل فردي هي عمل أقل نظرًا لأن القائمة المرتبطة بشكل مزدوج تتطلب المزيد من تغييرات الارتباط مقارنة بالقائمة المرتبطة بشكل فردي.

بالنسبة للقائمة المرتبطة بشكل فردي، نفترض أننا نقوم بإدراجها في الرأس أو بعد عقدة معينة. بالنسبة للقوائم المرتبطة بشكل فردي، نفترض الإدراج بعد العقدة الرئيسية أو بعض العقد المحددة.

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

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

##قائمة مرتبطة دائرية قائمة مرتبطة دائريةفي القائمة المرتبطة بشكل فردي، إذا كان المؤشر التالي للعقدة الأخيرة يشير إلى العقدة الأولى. ثم، إنها “القائمة المرتبطة الدائرية”. وإذا كان المؤشر السابق للعقدة الأولى يشير إلى العقدة الأخيرة أيضًا. الآن يمكن اعتبار هذا “قائمة دائرية مرتبطة بشكل مزدوج”. في القائمة المرتبطة بشكل فردي، إذا كان المؤشر التالي للعقدة الأخيرة يشير إلى العقدة الأولى. ثم هناك “القائمة المرتبطة الدائرية”. إذا كان المؤشر السابق للعقدة الأولى يشير إلى العقدة الأخيرة. الآن، يمكن اعتبار ذلك “قائمة دائرية مزدوجة الارتباط”.

القائمة المرتبطة الدائرية - ويكيبيديا قائمة مرتبطة دائرية - ويكيبيديا

إنها ليست شائعة، ولكنها يمكن أن تكون مفيدة لبعض المشاكل. لذا، إذا وصلنا إلى نهاية القائمة وقلنا التالي، فسنبدأ مرة أخرى من البداية. هذا ليس شائعًا، لكنه قد يكون مفيدًا لبعض المشكلات. لذا، إذا وصلنا إلى نهاية القائمة، مثل القائمة التالية، فإننا نبدأ من حيث بدأنا.

##كومة الأكوام

تمامًا مثل المصفوفات والقوائم، تعد الأكوام وقوائم الانتظار أيضًا مجموعة من العناصر. إنها مجرد طرق مختلفة يمكننا من خلالها الاحتفاظ بعناصر متعددة. إنها بنية البيانات التي تدخل أخيرًا، تصدر أولاً، دون الاهتمام بالفهارس الرقمية. تمامًا مثل المصفوفات والقوائم، تعد الأكوام وقوائم الانتظار عبارة عن مجموعات من العناصر. إنها مجرد طرق مختلفة يمكننا من خلالها استيعاب مشاريع متعددة. إنها بنية بيانات تدخل أخيرًا وتُخرج أولاً ولا تهتم بالفهارس الرقمية.

It’s a collection of items where we add and remove items to and from the top of the stack.
它是一个项集合,我们在堆栈顶部添加和删除项。

كومة من الأطباق القذرة كومة من الأطباق القذرة

تنفيذ المكدس تنفيذ المكدس

يمكن تنفيذ المكدس بسهولة إما باستخدام مصفوفة أو قائمة مرتبطة يمكن تنفيذ الأكوام بسهولة باستخدام المصفوفات أو القوائم المرتبطة

استخدام المكدسات استخدام المكدس

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

العمليات الأساسية للمكدسات العمليات الأساسية للمكدس

وهي: Push()، pop()، & peek(). Push هو دفع عنصر جديد إلى أعلى المكدس، وسيقوم pop بإرجاع (وإزالة) العنصر الموجود في الأعلى، بينما سيحصل peek على العنصر الموجود في الأعلى دون إزالته. وهم: دفع ()، البوب ​​() ونظرة خاطفة (). يتم استخدام الدفع لدفع عنصر جديد أعلى المكدس، وسيقوم البوب ​​بإرجاع (وإزالة) العنصر العلوي، وسيحصل النظرة الخاطفة على العنصر العلوي دون إزالته.

المكدسات مقابل المصفوفات مقابل القوائم المرتبطة المكدسات مقابل المصفوفات مقابل القوائم المرتبطة

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

هذه بنية بيانات محدودة عمدا ومقيدة عمدا. كل ما نفعله هو الدفع والفرقع وربما إلقاء نظرة خاطفة. وإذا كنت تحاول القيام بأي شيء آخر باستخدام هذه المكدس، فأنت تستخدم بنية بيانات خاطئة. هذه بنية بيانات مقيدة عمدا. كل ما نفعله هو الدفع أو البوب ​​أو إلقاء نظرة خاطفة. إذا كنت تريد استخدام هذا المكدس لأشياء أخرى، فأنت تستخدم بنية بيانات خاطئة.

##طوابير الانتظار

الفرق الرئيسي بين المكدس وقائمة الانتظار. تكون الأكوام أول ما يدخل أولاً يخرج أولاً (LIFO)، بينما تكون قوائم الانتظار أول ما يدخل أولاً يخرج أولاً (FIFO). وكما هو الحال مع الأكوام، لا ينبغي لنا حتى أن نفكر في الفهارس الرقمية. الفرق الرئيسي بين المكدس وقائمة الانتظار. الأكوام هي ما يدخل أولاً يخرج أولاً (LIFO)، في حين أن قوائم الانتظار هي أول ما يدخل أولاً يخرج (FIFO). مثل المكدس، لا ينبغي لنا حتى أن نفكر في الفهرسة الرقمية.

It’s a collection of items where we add items to the end and remove items from the front of the queue.
它是项的集合,我们在末尾添加项,并从队列前面删除项。

طابور من الناس الناس في الطابور

تنفيذ قائمة الانتظار تنفيذ قائمة الانتظار

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

استخدام قوائم الانتظار استخدم قوائم الانتظار

تُستخدم قوائم الانتظار بشكل شائع جدًا في مواقف التزامن لتتبع المهام التي تنتظر تنفيذها والتأكد من أننا نقوم بتنفيذها بهذا الترتيب. تُستخدم قوائم الانتظار بشكل شائع جدًا في مواقف التزامن لتتبع المهام التي تنتظر تنفيذها والتأكد من معالجتها بالترتيب.

العمليات الأساسية لقوائم الانتظار العمليات الأساسية لقائمة الانتظار

تمامًا مثل المكدس: add()، وremove()، وpeek(). تمامًا مثل المكدس: إضافة () وإزالة () ونظرة خاطفة ().

قوائم الانتظار ذات الأولوية قائمة الانتظار ذات الأولوية

تقدم بعض اللغات نسخة من قائمة الانتظار، تسمى قائمة الانتظار ذات الأولوية. يتيح لك ذلك ترتيب العناصر في قائمة الانتظار بناءً على أولويتها. توفر بعض اللغات نسخة من قائمة الانتظار تسمى قائمة الانتظار ذات الأولوية. يتيح لك ذلك ترتيب العناصر الموجودة في قائمة الانتظار وفقًا للأولوية.

It’s a queue, where items with higher priority step ahead of items with lower priority in the queue.
它是一个队列,在队列中优先级较高的项先于优先级较低的项。

كيف تعمل قوائم الانتظار ذات الأولوية كيف تعمل قوائم الانتظار ذات الأولوية

عندما تقوم بإضافة عناصر لها نفس الأولوية، فإنها ستوضع في قائمة الانتظار كالمعتاد بترتيب الوارد أولاً يخرج أولاً. إذا كان هناك شيء له أولوية أعلى، فسوف يتقدم عليه في قائمة الانتظار. عند إضافة عناصر لها نفس الأولوية، يتم وضعها في قائمة الانتظار بالترتيب العادي. إذا ظهر شيء ذو أولوية أعلى، فسوف يتقدم عليه في قائمة الانتظار.

تحديد الأولوية تحديد الأولوية

يمكنك التحديد بناءً على ما يتمتع به العنصر من أولوية أعلى أو أقل أو متساوية. يتم ذلك عن طريق تطبيق مقارنة أو وظيفة مقارنة (كما هو الحال عند فرز المصفوفات)، حيث يمكنك توفير المنطق الخاص بك لمقارنة الأولوية بين العناصر. يمكنك التحديد بناءً على الأولوية العالية للعنصر، أو الأولوية المنخفضة، أو الأولوية المتساوية. يمكن تحقيق ذلك من خلال تطبيق مقارنة أو وظيفة مقارنة (تمامًا مثل فرز مصفوفة) حيث يمكنك توفير المنطق الخاص بك عند مقارنة الأولويات بين العناصر.

##Deque قائمة انتظار مزدوجة العضويةيتم استخدام deque، الذي يُنطق “DEK”، عندما نريد الاستفادة من قوة قائمة الانتظار والمكدس، حيث يمكنك الإضافة أو الإزالة من البداية أو النهاية. يتم نطق Deque بـ “DEK” ونستخدم deque عندما نريد الاستفادة من إمكانيات قوائم الانتظار والمكدسات، حيث يمكننا الإضافة أو الحذف من البداية أو النهاية.

It’s a queue and a stack at the same time.
它同时是一个队列和一个堆栈。

##المصفوفات الترابطية المصفوفة الترابطية

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

It is a collection of key-value pairs.
它是键-值对的集合。
var user = {
   firstName: "Bob",
   lastName: "Jones",
   age: 26,
   email: "bob.jones@example.com"
};

تنفيذ المصفوفات الترابطية لها أسماء مختلفة. في لغة Objective-C وPython، يُطلق عليها اسم القواميس. تطبيقات المصفوفات الترابطية لها أسماء مختلفة. في Objective-C وPython، يطلق عليهم القواميس.

ترتيب العناصر ترتيب العناصر

على عكس المصفوفة الأساسية، في المصفوفة الترابطية، لا يلزم أن تكون المفاتيح بأي ترتيب محدد. لأن الترتيب ليس مصدر قلق في المصفوفات الترابطية. على عكس المصفوفات الأساسية، لا يلزم أن تكون المفاتيح في المصفوفة الترابطية بأي ترتيب محدد. لأن الترتيب لا علاقة له بالمصفوفات الترابطية.

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

التكرارات الرئيسية التكرارات الرئيسية

بنفس الطريقة التي لا يظهر بها رقم الفهرس نفسه مرتين في مصفوفة أساسية، لا يمكن أن تكون هناك مفاتيح مكررة، ويجب أن تكون المفاتيح فريدة في مصفوفة اقترانية. وبالمثل، لا يمكن أن يظهر نفس رقم الفهرس مرتين في مصفوفة أساسية، ولا يمكن أن يكون هناك مفاتيح مكررة، ويجب أن تكون المفاتيح فريدة في مصفوفة اقترانية.

أنواع بيانات المفاتيح والقيم أنواع بيانات المفاتيح والقيم

يمكنك عادةً استخدام أي نوع بيانات كمفتاح أو قيمة. من الشائع استخدام سلسلة كمفتاح. يمكنك عمومًا استخدام أي نوع بيانات كمفتاح أو قيمة. عادة ما يتم استخدام السلاسل كمفاتيح.

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

##تجزئة التجزئة

التجزئة هو مفهوم قيم في البرمجة. يتم استخدامه، ليس فقط في هياكل البيانات، ولكن في الأمن والتشفير والرسومات والصوت. التجزئة هو مفهوم قيم في البرمجة. يتم استخدامه ليس فقط لهياكل البيانات ولكن أيضًا للأمان والتشفير والرسومات والصوت.

It’s a way to take our data and run it through a function, which will return a small, simplified reference generated from that original data.
这是一种获取数据并通过函数运行数据的方法,函数将返回从原始数据生成的一个小的、简化的引用。

يتم استخدام التجزئة بشكل شائع مع كلمات المرور يتم استخدام التجزئة بشكل شائع مع كلمات المرور

قد يكون المرجع مجرد عدد صحيح، أو حروف وأرقام،…الخ. قد يكون المرجع مجرد عدد صحيح، أو حروف وأرقام، وما إلى ذلك.

لماذا نستخدم التجزئة؟ لماذا استخدام التجزئة؟

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

التجزئة ليست تشفيرًا التجزئة ليست تشفيرًا

وظائف التجزئة غير قابلة للعكس؛ إنهما طريقة واحدة. لذلك، لا يمكنك تحويل نتيجة قيمة التجزئة إلى البيانات الأصلية. لذلك، ستفقد المعلومات عند التجزئة، فلا بأس، فهذا مقصود. وظائف التجزئة لا رجعة فيها. هم في اتجاه واحد. ولذلك، لا يمكنك تحويل نتيجة التجزئة مرة أخرى إلى البيانات الأصلية. ولذلك، يتم فقدان المعلومات أثناء عملية التجزئة، وهذا أمر مقصود.

التجزئة مقابل التشفير — ssl2buy.com التجزئة مقابل التشفير — ssl2buy.com

تنفيذ وظيفة التجزئة تنفيذ وظيفة التجزئة

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

قواعد التجزئة قواعد التجزئة

  1. إذا أخذنا نفس الكائن بالضبط، مع نفس البيانات، وقمنا بإدخاله في وظيفة التجزئة مرة أخرى، فإنني أتوقع نفس نتيجة التجزئة.

  2. إذا كان لديك كائنين مختلفين تعتبرهما متساويين، فيجب أن يُرجعا نفس قيمة التجزئة.

  3. في حين أن كائنين متساويين يجب أن ينتجا نفس قيمة التجزئة، فإن قيمتي التجزئة المتساويتين لا تضمن أنهما قادمتان من كائنات متساوية، لماذا؟ لأن كائنين مختلفين قد، في بعض الظروف، يقدمان نفس النتيجة من دالة التجزئة (انظر تصادم التجزئة). يجب أن ينتج عن كائنين متساويين نفس قيمة التجزئة، لكن قيمتي التجزئة المتساويتين ليست مضمونة أن تأتي من كائنين متساويين، لماذا؟ لأنه في بعض الحالات قد يمرر كائنان مختلفان نفس النتيجة من دالة التجزئة (انظر تصادمات التجزئة).

تصادم التجزئة تصادم التجزئة

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

##جدول التجزئة جدول التجزئة

كانت فكرة التجزئة أساسية لفهم بنية بيانات جدول التجزئة. فكرة التجزئة هي الأساس لفهم بنية بيانات جدول التجزئة.

It’s a typical data structure to implement an associative arrays; mapping keys to values.
实现关联数组是一种典型的数据结构;将键映射到值。

تعيين الأرقام (المفاتيح) للمربعات تعيين الأرقام (المفاتيح) للمربعات

جداول التجزئة مقابل المصفوفات مقابل القائمة المسطرة جداول التجزئة مقابل المصفوفات مقابل القوائم

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

كيف تعمل جداول التجزئة؟ كيف تعمل جداول التجزئة؟

دليل هاتف صغير كجدول تجزئة - ويكيبيديا دليل هاتف صغير كجدول تجزئة - ويكيبيديا

عندما يتم إنشاء جدول التجزئة، فهو في الواقع عبارة عن بنية بيانات تعتمد على المصفوفة، ويمكن إنشاؤه عادةً بسعة أولية. يتكون جدول التجزئة من مجموعة من الفتحات أو المجموعات التي تحتوي على القيم. عندما يتم إنشاء جدول التجزئة، فهو في الواقع عبارة عن بنية بيانات تعتمد على المصفوفة ويمكن إنشاؤها عادةً بسعة أولية. يتكون جدول التجزئة من مجموعة من الفتحات أو المجموعات التي تحتوي على قيم.

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

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

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

// adding a key-value pair
hash_table.add(key, value)
// what happen behind the scene
index = hash(key)
index = index % array_size
array[index] = value

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

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

إدارة الصراع في إدارة التصادم

يمكننا أن نتوقع حدوث تصادم تجزئة؛ عندما نحصل على نفس قيمة التجزئة لمفاتيح مختلفة. ولكن كيف يمكن إدارتها؟ يمكننا أن نتوقع حدوث تصادمات التجزئة؛ عندما نحصل على نفس قيمة التجزئة لمفاتيح مختلفة. ولكن كيف يمكن إدارتها؟

عندما نضيف زوجًا جديدًا من القيمة الرئيسية، ويحدث التصادم، فسوف نضع تلك القيمة في نفس الموقع، حتى لو كانت هناك قيمة أخرى موجودة في ذلك الموقع. عندما نضيف زوجًا جديدًا من القيمة الرئيسية، ويحدث تصادم، فإنه سيضع تلك القيمة في نفس الموضع، حتى لو كانت هناك قيمة أخرى موجودة في ذلك الموضع.

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

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

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

تم حل تصادم التجزئة عن طريق تسلسل منفصل - ويكيبيديا تم حل تصادم التجزئة عن طريق تسلسل منفصل - ويكيبيديا

وهذا ما يسمى “تقنية التسلسل المنفصل” في جداول التجزئة. الآن، هناك تقنيات أخرى لإدارة التصادمات داخل جداول التجزئة، بما في ذلك العنونة المفتوحة، وتجزئة الوقواق، والقفزة، وتجزئة روبن هود. هذه هي “تقنية الربط المستقلة” في جداول التجزئة. اليوم، هناك تقنيات أخرى لإدارة التصادمات داخل جداول التجزئة، بما في ذلك العنونة المفتوحة، وتجزئة الوقواق، والحجلة، وتجزئة روبن هود.

كتابة وظائف التجزئة كتابة وظائف التجزئة

عندما تريد تخزين أزواج القيمة الرئيسية باستخدام بنية بيانات جدول التجزئة، فمن المحتمل أن معظم الكائنات لديها وظيفة تجزئة بالفعل. السلوك الافتراضي عادةً هو إرجاع عدد صحيح؛ محسوبة من عنوان الذاكرة لهذا الكائن. عندما تريد استخدام بنية بيانات جدول التجزئة لتخزين أزواج المفتاح والقيمة، فمن المحتمل أن تحتوي معظم الكائنات على وظيفة تجزئة بالفعل. السلوك الافتراضي عادةً هو إرجاع عدد صحيح؛ محسوبة من عنوان ذاكرة الكائن.إذا قمت بتجاوز سلوك المساواة في صفك، فيجب عليك تجاوز سلوك التجزئة. نظرًا لأن رموز التجزئة مرتبطة جدًا بالمساواة، وإذا كان لديك كائنان تعتبرهما متساويين، فيجب أن يُرجعا نفس قيمة التجزئة. إذا قمت بتجاوز سلوك المساواة في الفصل الدراسي، فيجب عليك تجاوز سلوك التجزئة. نظرًا لأن رموز التجزئة ترتبط ارتباطًا وثيقًا بالمساواة، وإذا كان هناك كائنان تعتبرهما متساويين، فيجب أن يُرجعا نفس قيمة التجزئة.

مرة أخرى، إذا قمت بتغيير ما يعنيه أن تكون الكائنات متساوية، فيجب عليك أيضًا تغيير ما يعنيه تجزئة هذه الكائنات. وبالمثل، إذا قمت بتغيير معنى المساواة بين الكائنات، فيجب عليك أيضًا تغيير معنى تجزئة تلك الكائنات.

لقد تجاوزت كائنات السلسلة بالفعل سلوك المساواة والتجزئة الخاص بها. لذا، إذا كان لديك كائنين منفصلين من السلسلة، فسيظلان متساويين، ويعيدان نفس التجزئة، إذا كان لهما نفس القيمة، حتى لو كانا في الواقع كائنات سلسلة منفصلة مخصصة في أجزاء مختلفة من الذاكرة. لقد تجاوزت كائنات السلسلة سلوك المساواة والتجزئة الخاص بها. لذا، إذا كان لديك كائنين منفصلين من السلسلة، فسيظلان متساويين ويعيدان نفس التجزئة إذا كان لهما نفس القيمة، على الرغم من أنهما في الواقع كائنات سلسلة منفصلة مخصصة في أجزاء مختلفة من الذاكرة.

##مجموعة مجموعات

عندما يكون كل ما تحتاجه هو حاوية كبيرة، يمكنك وضع مجموعة من العناصر فيها، حيث لا تهتم بالتسلسل. عندما تحتاج فقط إلى حاوية كبيرة، يمكنك وضع مجموعة من الأشياء فيها ولا يتعين عليك التفكير في الترتيب.

لا يوجد تسلسل محدد كما هو الحال مع القائمة المرتبطة، أو المكدس، أو قائمة الانتظار. لا توجد أزواج ذات قيمة رئيسية كما هو الحال مع جدول التجزئة. لا يوجد تسلسل محدد، مثل القائمة المرتبطة أو المكدس أو قائمة الانتظار. لا توجد أزواج ذات قيمة مفتاحية، تمامًا مثل جدول التجزئة.

It’s an unordered collection of items, with no repeated values.
它是一个无序的项目集合,没有重复的值。

بواسطة غير مرتب، أعني أنه لا يوجد فهرس مثل المصفوفة. غير مرتب يعني أنه لا يوجد فهرس كما هو الحال في المصفوفة.

كيس بقالة من المواد الغذائية كيس من المواد الغذائية

تعيين مجموعة التنفيذ التنفيذ

تستخدم المجموعات في الواقع نفس فكرة بنية بيانات جداول التجزئة في معظم الأوقات. ولكن، بدلاً من أزواج المفتاح والقيمة (تجزئة المفتاح وتخزين قيمته)، عند استخدام مجموعة، يعتبر المفتاح أيضًا قيمة (أو يتم تعيين القيمة لقيمة وهمية أو افتراضية). تستخدم المجموعات في الواقع نفس فكرة بنية بيانات جدول التجزئة في معظم الحالات. ومع ذلك، على عكس أزواج القيمة الرئيسية (حيث يتم تجزئة المفتاح وتخزين قيمته)، عند العمل مع المجموعات، تعتبر المفاتيح أيضًا قيمًا (أو يتم تعيين القيم لقيم وهمية أو افتراضية).

لذا، للحصول على أي قيمة محددة، أو أي كائن محدد في المجموعة، يجب أن يكون لديك الكائن نفسه. والسبب الوحيد للقيام بذلك هو التحقق من وجودها. يُشار إلى هذا غالبًا باسم “التحقق من العضوية”. لذا، للحصول على أي قيمة محددة في المجموعة، أو أي كائن محدد، فأنت بحاجة إلى الكائن نفسه. السبب الوحيد للقيام بذلك هو اختبار ما إذا كان موجودا. يُطلق على هذا غالبًا اسم “التحقق من العضوية”.

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

مميزات الأطقم مميزات الأطقم

على عكس المصفوفة، أو القيم الموجودة في المصفوفة الترابطية، أو القائمة المرتبطة، لا تسمح المجموعات بالتكرارات. لا يمكنك إضافة نفس الكائن، نفس القيمة مرتين إلى نفس المجموعة. على عكس القيم الموجودة في المصفوفات أو المصفوفات الترابطية أو القوائم المرتبطة، لا تسمح المجموعات بالتكرارات. لا يمكن إضافة نفس الكائن ونفس القيمة إلى نفس المجموعة مرتين.

تم تصميم المجموعات للبحث السريع جدًا، حتى نتمكن بسرعة كبيرة من معرفة ما إذا كان لدينا بالفعل قيمة موجودة في المجموعة. تم تصميم المجموعات لإجراء عمليات بحث سريعة، بحيث يمكنك معرفة ما إذا كانت هناك قيمة موجودة بالفعل في المجموعة بسرعة كبيرة.

يمكنك أيضًا تكرار جميع العناصر الموجودة في المجموعة، ولكن قد لا يكون لديك أي ترتيب مضمون. يمكنك أيضًا التكرار على جميع العناصر في المجموعة، وقد لا يكون لديك أي ترتيب مضمون.

##شجرة الأشجار فكرة بنية البيانات الشجرية هي أن لدينا مجموعة من العقد، والعقد لها اتصالات، ولديها روابط بين بعضها البعض. مفهوم بنية البيانات الشجرية هو أن لدينا مجموعة من العقد، وهذه العقد لها اتصالات، وهناك روابط بينها.

يبدو هذا مشابهًا للقوائم المرتبطة. ولكن في القائمة المرتبطة، ننتقل دائمًا من عقدة إلى عقدة تالية محددة. أثناء وجودك في الشجرة، قد ترتبط كل عقدة بعقدة واحدة أو اثنتين أو أكثر. يبدو هذا مشابهًا للقائمة المرتبطة. ولكن في القائمة المرتبطة، ننتقل دائمًا من عقدة إلى عقدة تالية محددة. في الشجرة، يمكن ربط كل عقدة بعقدة واحدة أو اثنتين أو أكثر.

It’s a collection of nodes, where each node might link to one, or two, or more nodes.
它是节点的集合,每个节点可能链接到一个、两个或多个节点。

شجرة - richardkho.com

مصطلحات الشجرة مصطلحات الشجرة

هناك بعض المصطلحات التي تأتي مع الشجرة. يمكنك العثور على المزيد عنها هنا. فهي ضرورية لفهم الأشجار والعمل معها. هناك بعض المصطلحات التي تأتي مع هذه الشجرة. يمكنك العثور على مزيد من المعلومات عنها هنا. فهي ضرورية لفهم ودراسة الأشجار.

الأشجار الثنائية الشجرة الثنائية

الشجرة الثنائية هي مجرد شجرة تحتوي على عقدتين فرعيتين كحد أقصى لأي عقدة أصل. غالبًا ما تُستخدم الأشجار الثنائية لتنفيذ بنية رائعة قابلة للبحث تسمى “شجرة البحث الثنائية” أو “BST”. الشجرة الثنائية هي شجرة تحتوي على عقدتين فرعيتين على الأكثر لأي عقدة أصل. غالبًا ما تُستخدم الأشجار الثنائية لتنفيذ بنية رائعة قابلة للبحث تسمى “شجرة البحث الثنائية” أو “BST”.

##أشجار البحث الثنائية (BST) شجرة البحث الثنائية (BST)

It’s a specific type of binary tree, where the left child node is less than its parent, and a right child node is greater than its parent.
它是一种特定类型的二叉树,其中左子节点小于其父节点,而右子节点大于其父节点。

شجرة بحث ثنائية (BST) - ويكيبيديا شجرة بحث ثنائية (BST) - ويكيبيديا

كيف تعمل أشجار البحث الثنائية؟ كيف تعمل أشجار البحث الثنائية؟

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

لذا، فهي بنية بيانات تظل مرتبة بشكل طبيعي، ويُطلق عليها أحيانًا اسم “الشجرة المصنفة” أو “الشجرة المرتبة”. ولذلك، فهي بنية بيانات تحافظ على الترتيب بشكل طبيعي، وتسمى أحيانًا “الشجرة المرتبة” أو “الشجرة المرتبة”.

تخزين العقد كأزواج ذات قيمة رئيسية تخزين العقد كأزواج ذات قيمة رئيسية

غالبًا ما تُستخدم أشجار البحث الثنائية لتخزين أزواج القيمة الرئيسية، مما يعني أن العقد تتكون من مفتاح وقيمة مرتبطة به. وهو المفتاح الذي سيتم استخدامه لفرز العقد وفقًا لذلك في شجرة البحث الثنائية. تُستخدم أشجار البحث الثنائية عادةً لتخزين أزواج المفتاح والقيمة، أي أن العقد تتكون من مفتاح وقيمة مرتبطة به. هذا هو المفتاح لترتيب العقد في شجرة البحث الثنائية.

التكرارات

لا يمكن أن يكون لديك مفاتيح مكررة، تمامًا كما لا يوجد لديك مفاتيح مكررة في جدول التجزئة أو حتى في المصفوفة. لا يمكن أن تكون هناك مفاتيح مكررة، تمامًا كما لا يمكن أن تكون هناك مفاتيح مكررة في جدول التجزئة أو حتى المصفوفة.

إضافة العقد والوصول إليها إضافة العقد والوصول إليها

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

استرداد العقد بالترتيب استرداد العقد بالترتيب

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

شجرة غير متوازنة شجرة غير متوازنة

يحدث ذلك عندما تحتوي الشجرة على مستويات أكثر من العقد على الجانب الأيمن منها على اليسار (أو العكس). عندما يكون هناك عدد أكبر من العقد على الجانب الأيمن من الشجرة مقارنة باليسار (والعكس صحيح).

على الرغم من أنه من غير المعتاد أن يحدث هذا النوع من الأشياء، إلا أننا لا نستطيع دائمًا ضمان أن الطريقة التي تتم بها إضافة البيانات ستسمح لنا ببناء شجرة ذات بنية متماثلة تمامًا على طول الطريق. على الرغم من أن هذا نادرًا ما يحدث، إلا أنه لا يمكننا دائمًا ضمان أننا نضيف البيانات بطريقة تسمح لنا ببناء شجرة ذات بنية متماثلة تمامًا.

في هذه الحالة نقول أن شجرتنا غير متوازنة؛ هناك مستويات أكثر على جانب واحد من الجانب الآخر. وسيتعين علينا إجراء المزيد من عمليات التحقق للعثور على أي قيم على الجانب الأيمن أو إدراجها أو حذفها مما نفعل على الجانب الأيسر (أو العكس). وفي هذه الحالة نقول أن الشجرة غير متوازنة؛ جانب واحد لديه مستويات طاقة أكثر من الآخر. نحتاج إلى إجراء المزيد من عمليات التحقق للعثور على أي قيمة على اليمين أو إدراجها أو حذفها مقارنة باليسار (أو العكس).

تنفيذ شجرة البحث الثنائية تنفيذ شجرة البحث الثنائية

ما كنا نتحدث عنه هو الفكرة المجردة لبنية بيانات شجرة البحث الثنائية. ولكن، هناك العديد من التطبيقات لفكرة شجرة البحث الثنائية هذه والتي تعتبر أشجار بحث ثنائية ذاتية التوازن. ما كنا نناقشه هو الفكرة المجردة لبنية بيانات شجرة البحث الثنائية. ومع ذلك، هناك العديد من التطبيقات لفكرة شجرة البحث الثنائية هذه والتي تعتبر أشجار بحث ثنائية ذاتية التوازن.

الفكرة المهمة في موازنة شجرة البحث الثنائية هي أن عدد المستويات يساوي بعضها البعض تقريبًا. ليس لدينا ثلاثة مستويات على اليسار وعشرين على اليمين. الفكرة المهمة في موازنة شجرة البحث الثنائية هي أن عدد المستويات متساوٍ تقريبًا. لا يوجد ثلاثة طوابق على اليسار ولا عشرين طابقا على اليمين.

من أمثلة الأشجار ذاتية التوازن: أشجار الأحمر والأسود، أو AVL أو Adelson-Velskii and Landis، أو Splay، أو أشجار كبش الفداء، والمزيد. من أمثلة الأشجار ذاتية التوازن: الأشجار ذات اللون الأحمر والأسود، أو AVL أو Adelson-Velskii and Landis، أو أشجار Splay، أو أشجار كبش الفداء، وما إلى ذلك.

شجرة البحث الثنائية مقابل جدول التجزئة شجرة البحث الثنائية مقابل جدول التجزئة

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

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

It’s a specific type of binary tree, where we add nodes from top to bottom, left to right, and child nodes must be less (or greater) than or equal their parents.
这是一种特定类型的二叉树,我们从上到下、从左到右添加节点,子节点必须小于(或大于)或等于它们的父节点。

ماكس هيب - ويكيبيديا أكبر كومة - ويكيبيديا

لذلك، نقوم بملء أي مستوى بالكامل قبل الانتقال إلى المستوى التالي. لذلك لا داعي للقلق بشأن عدم توازن الشجرة مثل شجرة البحث الثنائية. لذلك سوف نقوم بملء أي مستوى بالكامل قبل الانتقال إلى المستوى التالي. لذلك لا داعي للقلق بشأن عدم توازن الشجرة مثل شجرة البحث الثنائية.

الحد الأدنى مقابل الحد الأقصى للكومة

تنص الكومة الدنيا على أن أي عقدة فرعية يجب أن تكون أكبر من (أو تساوي) العقدة الأصلية، بينما تنص الكومة القصوى على أن أي عقدة فرعية يجب أن تكون أقل من (أو تساوي) العقدة الأصلية. ومع ذلك، لا يهمنا إذا كانت العقدة أقل من شقيقتها أو أكبر منها. تنص Min-heap على أن أي عقدة فرعية يجب أن تكون أكبر من (أو تساوي) العقدة الأصلية، بينما تنص max-heap على أن أي عقدة فرعية يجب أن تكون أقل من (أو تساوي) العقدة الأصلية. ومع ذلك، لا يهمنا إذا كانت العقدة أصغر أو أكبر من أشقائها.

كيف تعمل الأكوام؟ كيف تعمل الكومة؟

لذا، في حالة Min Heap: لذلك، بالنسبة لكومة دقيقة:1. نواصل إضافة العناصر من الأعلى إلى الأسفل، ومن اليسار إلى اليمين 2. ثم قارن مع العقدة الأصلية؛ هل هو أقل من والده؟ ثم قارن مع العقدة الأصلية؛ هل هو أقل من والده؟ 3. إذا كان الأمر كذلك، فقم بتبديل العقدة مع العقدة الأم، 4. استمر في تنفيذ الخطوات من 2 إلى 3 حتى تصبح العقدة أكبر من العقدة الأصلية (أو تصبح العقدة الجذرية). كما هو مبين. استمر في تنفيذ الخطوات من 2 إلى 3 حتى تصبح العقدة أكبر من العقدة الأصلية (أو تصبح العقدة الجذرية).

هذا التبادل البسيط للعقد هو الطريقة التي تحافظ بها الكومة على تنظيمها. إن مبادلة العقدة الصغيرة هذه هي الطريقة التي تحافظ بها الكومة على تنظيمها.

الكومة ليست مفروزة بالكامل لم يتم فرز الكومة بالكامل

على عكس شجرة البحث الثنائية، التي تظل مرتبة، حيث يمكننا بسهولة اجتياز الشجرة واسترداد كل شيء بالترتيب. على عكس أشجار البحث الثنائية، التي تحافظ على الترتيب، يمكننا بسهولة اجتياز الشجرة واسترداد كل شيء بالترتيب.

لأنه إذا لاحظت أنه عند أي مستوى معين بعد الجذر، لا يجب أن تكون القيم بأي ترتيب محدد، طالما أنها كلها أكبر (أو أقل) من أصلها. لأنه إذا لاحظت، على أي مستوى معين بعد الجذر، ليس من الضروري أن تظهر القيم بأي ترتيب معين، طالما أنها كلها أكبر (أو أقل) من أصلها.

إحدى فوائد ذلك هي أن الكومة لا تحتاج إلى القيام بإعادة تنظيم نفسها بقدر ما قد يكون ضروريًا مع شجرة بحث ثنائية. إحدى فوائد ذلك هي أن الكومة لا تحتاج إلى إعادة تنظيم نفسها بقدر ما تفعل مع شجرة البحث الثنائية.

الشيء الوحيد الذي يمكننا التأكد منه هو أن العقدة الأصلية ستكون دائمًا أقل أو أكبر من العقد التابعة لها، وبالتالي فإن القيمة الدنيا أو القصوى ستكون دائمًا في الأعلى. شيء واحد يمكننا التأكد منه هو أن العقدة الأصلية تكون دائمًا أصغر أو أكبر من العقد التابعة لها، وبالتالي فإن القيمة الدنيا أو القصوى تكون دائمًا في الأعلى.

وبالتالي، فإن الأكوام مفيدة جدًا لفكرة قائمة الانتظار ذات الأولوية. ولذلك، الكومة مفيدة للغاية لمفهوم قوائم الانتظار ذات الأولوية.

##الرسوم البيانية الرسوم البيانية

القيود المفروضة على الشجرة لم تعد موجودة هنا. يمكن للعقدة الارتباط بعدة عقد أخرى، دون تسلسل محدد، ولا عقدة جذر. القيود المفروضة على الأشجار لم تعد موجودة. يمكن ربط العقدة بعدة عقد أخرى بدون ترتيب معين وبدون عقدة جذر.

إنها مجموعة من العقد، حيث يمكن للعقدة الارتباط بعدة عقد أخرى، بدون تسلسل محدد، ولا عقدة جذر. إنها مجموعة من العقد حيث يمكن ربط عقدة واحدة بعدة عقد أخرى، بدون تسلسل معين، وبدون عقدة جذر.

رسم بياني لشبكة اجتماعية مخطط الشبكة الاجتماعية

نظرية الرسم البياني في الرياضيات نظرية الرسم البياني في الرياضيات

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

استخدام الرسوم البيانية استخدام الرسم البياني

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

الرسوم البيانية المباشرة وغير المباشرة الرسوم البيانية المباشرة وغير المباشرة

يمكننا أيضًا أن نقول ما إذا كان يجب أن يكون لهذه الحواف اتجاه لها أم لا. يمكننا أيضًا أن نقول ما إذا كان يجب أن يكون لهذه الحواف اتجاه أم لا.

في بعض المواقف، يكون من المنطقي أن أي حافة، أو أي اتصال بين رأسين، يكون في اتجاه واحد فقط؛ إذن، العقدة A متصلة بالعقدة B، والعكس غير صحيح؛ العقدة B غير متصلة بالعقدة A. في بعض الحالات، أي حافة، أي اتصال بين رأسين، يكون في اتجاه واحد؛ لذلك، العقدة A متصلة بالعقدة B، ولكن ليس العكس؛ العقدة B غير متصلة بالعقدة A.

في مواقف أخرى، قد ترغب في أن تكون قادرًا على متابعة تلك الحافة، ذلك الرابط، في أي من الاتجاهين؛ لذلك، العقدة A متصلة بالعقدة B، وكذلك العقدة B متصلة بالعقدة A. وفي حالات أخرى، قد ترغب في اتباع هذه الحافة، هذا الرابط، في أي اتجاه؛ العقدة A تتصل بالعقدة B، والعقدة B تتصل بالعقدة A.

الرسوم البيانية المرجحة الرسم البياني المرجح

يمكنك أيضًا إعطاء وزن لكل حافة؛ ربط رقم مع كل من الحواف. يمكنك أيضًا إعطاء وزن لكل حافة؛ ربط رقم مع كل حافة.

يمكنك القيام بذلك لتمثيل المسافات بين المدن، على سبيل المثال، إذا كنت تحاول حساب أقصر طريق بين مواقع متعددة. أو يمكنك استخدام الوزن للإشارة إلى الحواف التي لها الأولوية على الحواف الأخرى. يمكنك تمثيل المسافة بين المدن، على سبيل المثال، إذا كنت تريد حساب أقصر طريق بين مواقع متعددة. وبدلاً من ذلك، يمكنك استخدام الأوزان للإشارة إلى الحواف المفضلة على الحواف الأخرى.

##أنواع البيانات المجردة (ADTs) أنواع البيانات المجردة (adt)

قبل الغوص في أنواع البيانات المجردة، ما هي، والفرق بينها وبين المفاهيم الأخرى. دعونا نحدد ما هو المقصود بنوع البيانات. قبل أن نخوض في أنواع البيانات المجردة، دعونا نفهم ما هي وكيف تختلف عن المفاهيم الأخرى. دعونا نحدد ما تعنيه أنواع البيانات.

نوع البيانات نوع البيانات

يحدد نوع بيانات المتغير القيم التي قد يحتوي عليها، بالإضافة إلى العمليات التي يمكن إجراؤها عليه.

تتكون أنواع البيانات من: أنواع البيانات البدائية، والمعقدة، والمركبة، والمجردة. تتضمن أنواع البيانات: أنواع البيانات الأساسية، وأنواع البيانات المعقدة أو أنواع البيانات المركبة، وأنواع البيانات المجردة.

نوع البيانات المجردة (ADT) نوع البيانات المجردة (ADT)إنه نوع بيانات، تمامًا مثل أنواع البيانات البدائية للأعداد الصحيحة والمنطقية. لا تتكون ADT من العمليات فحسب، بل تتكون أيضًا من قيم البيانات الأساسية والقيود المفروضة على العمليات.

إنه نوع بيانات، تمامًا مثل أنواع البيانات البدائية الصحيحة والمنطقية. لا تحتوي ADT على العمليات فحسب، بل تحتوي أيضًا على قيم البيانات الأساسية والقيود المفروضة على العمليات.

تتمثل قيود المكدس في أن كل عنصر منبثق يُرجع دائمًا العنصر الذي تم دفعه مؤخرًا والذي لم يتم فرقعه بعد. يتمثل قيد المكدس في أن كل عنصر منبثق يُرجع دائمًا العنصر الذي تم دفعه مؤخرًا والذي لم يتم فرقعه بعد.

يتم تجريد التنفيذ الفعلي لـ ADT، ولا يتعين علينا الاهتمام به. لذا، فإن كيفية تنفيذ المكدس فعليًا ليست بهذه الأهمية. يمكن تنفيذ المكدس غالبًا خلف الكواليس باستخدام مصفوفة ديناميكية، ولكن يمكن تنفيذه باستخدام قائمة مرتبطة بدلاً من ذلك. لا يهم حقا. إن التنفيذ الفعلي لـ ADT أمر تجريدي ولا نحتاج إلى الاهتمام به. لذلك، لا يهم كيفية تنفيذ المكدس. يمكن عادةً تنفيذ الأكوام باستخدام المصفوفات الديناميكية الموجودة أسفل الغطاء، ولكن يمكن تنفيذها أيضًا باستخدام القوائم المرتبطة. لا يهم حقا.

القوائم والمكدسات وقوائم الانتظار والمزيد كلها أنواع بيانات مجردة. القوائم والمكدسات وطوابير الانتظار وما إلى ذلك كلها أنواع بيانات مجردة.

نوع البيانات المجردة وبنية البيانات نوع البيانات المجردة وبنية البيانات

ADT ليس بديلاً لبنية البيانات، بل هما مفاهيم مختلفة. ADT ليست بديلاً لهياكل البيانات، فهي مفاهيم مختلفة.

عندما نقول بنية بيانات المكدس، فإننا نشير إلى كيفية تنفيذ المكدسات وترتيبها في الذاكرة. ولكن عندما نقول المكدس ADT، فإننا نشير إلى نوع بيانات المكدس الذي يحتوي على مجموعة من العمليات المحددة وقيود العمليات والقيم المحتملة. عندما نتحدث عن بنية بيانات المكدس، فإننا نشير إلى كيفية تنفيذ المكدس وترتيبه في الذاكرة. ومع ذلك، عندما نقول مكدس ADT، فإننا نعني نوع بيانات مكدس يحتوي على مجموعة محددة من العمليات وقيود التشغيل والقيم المحتملة.

نحن لا نهتم بالتنفيذ الأساسي، كما هو الحال عند استخدام الأعداد الصحيحة، فنحن نبتعد عن كيفية تمثيل الأعداد الصحيحة في الذاكرة، نحن مهتمون فقط بالعمليات (إضافة، طرح، …)، والقيم المحتملة (…، −2، −1، 0، 1، 2، …). نحن لا نهتم بالتنفيذ الأساسي، فعند العمل مع الأعداد الصحيحة، فإننا نبتعد عن تمثيل الأعداد الصحيحة في الذاكرة، فنحن مهتمون فقط بالعمليات (الجمع والطرح، …) والقيم المحتملة (…−2−1,0,1,2,…).

يمكن لهياكل البيانات تنفيذ نوع واحد أو أكثر من أنواع البيانات المجردة (ADT)، والتي تحدد العمليات التي يمكن تنفيذها على بنية البيانات. يمكن لبنية البيانات تنفيذ واحد أو أكثر من أنواع البيانات المجردة المحددة (ADTs)، والتي تحدد العمليات التي يمكن تنفيذها على بنية البيانات.

نوع البيانات المجردة ليس فئة مجردة نوع البيانات المجردة ليس فئة مجردة

كلاهما ليس لهما علاقة ببعضهما البعض. تحدد الفئة المجردة العمليات فقط، وأحيانًا مع التعليقات التي تصف القيود، تاركة التنفيذ الفعلي للفئات الموروثة. ولا علاقة لأي منهما بالآخر. تحدد الفئات المجردة العمليات فقط، وأحيانًا مع تعليقات توضيحية تصف القيود، تاركة التنفيذ الفعلي لوراثة الفئات.

على الرغم من أن أدوات ADT غالبًا ما يتم تنفيذها كواجهات (فئات مجردة) كما هو الحال في Java. على سبيل المثال، تحدد واجهة القائمة في Java عمليات List ADT، بينما تحدد الفئات الموروثة التنفيذ الفعلي (بنية البيانات). بينما يتم تنفيذ الإعلانات عادةً كواجهات (فئات مجردة)، كما هو الحال في Java. على سبيل المثال، تحدد واجهة القائمة في Java عمليات List ADT، بينما تحدد الفئات الموروثة التنفيذ الفعلي (بنية البيانات).

لكن هذا ليس هو الحال دائمًا. على سبيل المثال، تحتوي Java على فئة مكدس، وهي فئة محددة عادية، ولكن المكدس هو أيضًا نوع بيانات مجردة، مما يعني أنه يمثل فكرة وجود بنية بيانات تدخل أخيرًا تخرج أولاً. لذا، فإن المكدس عبارة عن فئة ملموسة حقيقية وهو أيضًا نوع بيانات مجردة. ولكن هذا ليس هو الحال دائما. على سبيل المثال، تحتوي Java على فئة مكدس، وهي فئة محددة عادية، ولكن المكدس هو أيضًا نوع بيانات مجردة، أي أنه يمثل بنية بيانات ما يدخل أولاً يخرج أولاً. Stack عبارة عن فئة محددة ونوع بيانات مجردة.

أنواع البيانات المجردة هي مفهوم نظري نوع البيانات المجردة هو مفهوم نظري

يعد نوع البيانات المجردة (ADT) مفهومًا نظريًا لا علاقة له ببرمجة الكلمات الرئيسية. نوع البيانات المجردة (ADT) هو مفهوم نظري لا علاقة له بالكلمات الرئيسية للبرمجة.

لذلك، إذا كان لدينا مكدس، فلدينا بنية بيانات ما يدخل أخيرًا يخرج أولاً، والتي يمكننا دفعها وإلقاء نظرة خاطفة عليها. هذا ما نتوقع أن تكون المكدس قادرة على القيام به. سواء تم تنفيذ المكدس كفئة محددة أو أي شيء آخر، فإنه لا يزال لديه فكرة بنية البيانات التي تدخل أخيرًا تخرج أولاً. لذلك، إذا كان لدينا مكدس، فلدينا بنية بيانات LIFO يمكننا دفعها وإلقاء نظرة خاطفة عليها. وهذا ما نتوقع أن يفعله المكدس. بغض النظر عما إذا تم تنفيذ المكدس كفئة محددة، أو أي شيء آخر، فإنه لا يزال لديه مفهوم بنية البيانات التي تدخل أولاً تخرج أولاً.

##الخاتمة الخاتمة

تحديد بنية البيانات تحديد بنية البيانات

هناك بعض الأسئلة الأساسية التي يجب عليك طرحها قبل اتخاذ قرار بشأن بنية البيانات قبل اتخاذ قرار بشأن بنية البيانات، عليك أن تطرح بعض الأسئلة الأساسية

  • ما حجم البيانات لديك؟ ما مقدار البيانات التي لديك؟ *كم مرة يتغير؟ كم مرة يتغير؟
  • هل تحتاج إلى فرزها، هل تحتاج إلى البحث عنها؟ هل هو أسرع في الوصول أو الإدراج أو الحذف؟ هل هو أسرع في الوصول أو الإدراج أو الحذف؟

إذا كان هناك مكان لا تتوفر فيه سوى كميات ضئيلة من البيانات، فلن يكون له أهمية كبيرة. ما لم تتغير كميات البيانات هذه بشكل متكرر، أو إذا كان لديك كميات كبيرة من البيانات. إذا كان هناك كمية صغيرة فقط من البيانات في أي مكان، فلا يهم. ما لم تتغير أحجام البيانات هذه بشكل متكرر، أو إذا كان لديك الكثير من البيانات.### هياكل البيانات غير القابلة للتغيير هياكل البيانات غير القابلة للتغيير الآن، هناك مبدأ عام مفاده أن هياكل البيانات غير القابلة للتغيير أو ذات الحجم الثابت تميل إلى أن تكون أسرع وأصغر في الذاكرة من تلك القابلة للتغيير. الآن، المبدأ العام هو أن هياكل البيانات غير القابلة للتغيير أو ذات الحجم الثابت تميل إلى أن تكون أسرع وأصغر في الذاكرة من الهياكل القابلة للتغيير.

لماذا يجب علينا تقييد ميزات المصفوفات؟ والسبب هو أنه كلما زادت القيود لديك (مثل الحجم الثابت، ونوع البيانات المحدد، …)، أصبحت بنية البيانات الخاصة بك أسرع وأصغر. لماذا الحد من خصائص المصفوفات؟ والسبب هو أنه كلما زادت القيود (مثل الحجم الثابت ونوع البيانات المحدد …)، كلما كانت بنية البيانات أسرع وأصغر.

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

تحسين أداء التعليمات البرمجية الخاصة بك تحسين أداء التعليمات البرمجية

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

الاختلافات في اللغات الاختلافات في اللغات

وتختلف الخوارزميات المستخدمة مع كل بنية بيانات من لغة إلى أخرى، ويختلف التنفيذ الفعلي لبنية البيانات من لغة إلى أخرى. لذا، من المفيد أن تنظر عن كثب إلى وثائقك اللغوية. تختلف الخوارزميات التي تستخدمها كل بنية بيانات من لغة إلى أخرى، ويختلف التنفيذ الفعلي لبنية البيانات من لغة إلى أخرى. لذلك، من الضروري مراجعة وثائقك اللغوية بعناية.