logo

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

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

ستستكشف المقالة كل ما يتعلق بهياكل البيانات في Java، وستساعد المبتدئين على الفهم بسهولة وفعالية.

  • ما هي الجافا؟
  • ما هي هياكل البيانات في جافا؟
  • أنواع هياكل البيانات في جافا
  • مزايا هياكل البيانات في جافا
  • تصنيف هياكل البيانات
  • هياكل البيانات في الأسئلة الشائعة حول Java

ما هي الجافا؟

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

ما هي هياكل البيانات في جافا؟

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

أنواع هياكل البيانات في جافا

قائمة بنيات البيانات في Java مدرجة أدناه

  1. المصفوفات
  2. ArrayList
  3. قائمة مرتبطة
  4. كومة
  5. طابور
  6. خريطة التجزئة
  7. HashSet
  8. TreeSet
  9. خريطة الشجرة
  10. رسم بياني
  11. شجرة

يشرح الرسم البياني أدناه بوضوح أنواع هياكل البيانات في Java بشكل واضح جدًا.

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

مزيد من التصنيف لأنواع هياكل البيانات:

هناك نوعان من هياكل البيانات:-

  1. هياكل البيانات البدائية
  2. هياكل البيانات غير البدائية

1) هياكل البيانات البدائية: تُعرف أيضًا باسم أنواع البيانات البدائية، وهي أنواع بيانات أساسية مدمجة في Java. يشملوا:

    البايت:يخزن الأعداد الصحيحة من -128 إلى 127.قصير:يخزن الأعداد الصحيحة من -32,768 إلى 32,767.كثافة العمليات:يخزن الأعداد الصحيحة من -2,147,483,648 إلى 2,147,483,647.يطفو:يخزن أرقام الفاصلة العائمة بدقة واحدة.شار:يخزن الشخصيات الفردية.منطقية:يخزن القيم الحقيقية أو الخاطئة.طويل:يخزن أعدادا صحيحة كبيرة.مزدوج:يخزن أرقام العوامل العائمة بدقة مضاعفة.

2) هياكل البيانات غير البدائية: تعد هياكل السجلات غير البدائية أكثر تعقيدًا وتتكون من أنواع معلومات بدائية. ويمكن أيضًا تصنيفها إلى نوعين:

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

مزايا هياكل البيانات في جافا

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

1) المصفوفات:

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

مزايا:

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

سلبيات:

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

المهام:

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

تطبيق:

اسم الملف: ArrayExample.java

 import java.util.*; public class ArrayExample { public static void main(String[] args) { int[] numbers={10,20,30,40,50}; // Initialize an array of integers System.out.println(&apos;Element at index 0:&apos;+numbers[0]); System.out.println(&apos;Element at index 2:&apos;+numbers[2]); System.out.println(&apos;Element at index 4:&apos;+numbers[4]); int sum=0; for (int i=0;i<numbers.length;i++) { sum+="numbers[i];" } system.out.println('sum of array elements:'+sum); numbers[2]="35;" update an element in the system.out.println('updated at index 2:'+numbers[2]); system.out.println('elements array:'); for (int number:numbers) system.out.println(number); < pre> <p> <strong>Output:</strong> </p> <pre> Element at index 0:10 Element at index 2:30 Element at index 4:50 Sum of array elements:150 Updated element at index 2:35 Elements in the array: 10 20 35 40 50 </pre> <h3>2) ArrayList:</h3> <p>ArrayList in Java is a dynamic data structure that allows for the storage and manipulation of elements. It is part of the Java Collections Framework and is implemented using an array internally.</p> <p> <strong>Advantages:</strong> </p> <ol class="points"> <tr><td>Dynamic Size:</td> Unlike arrays, ArrayLists can dynamically grow or shrink in size as elements are added or removed. It eliminates the need for manual resizing and allows for handling varying amounts of data conveniently. </tr><tr><td>Easy Element Manipulation:</td> ArrayLists offer methods to add, remove, and modify elements at any position within the list. Its flexibility simplifies common operations such as insertion, deletion, and updating, making element manipulation more efficient. </tr><tr><td>Random Access:</td> ArrayLists support random Access to elements using their index, enabling quick retrieval and modification of elements at specific positions within the list. It facilitates efficient element access and enhances overall performance. </tr><tr><td>Compatibility with Java Collection Framework:</td> ArrayLists implement the List interface, making them compatible with other Collection classes in the Java Collections Framework. Its compatibility allows for seamless integration with various algorithms and operations provided by the framework. </tr></ol> <p> <strong>Disadvantages:</strong> </p> <ol class="points"> <tr><td>Higher Memory Overhead:</td> ArrayLists require additional memory to maintain their internal structure, resulting in higher memory overhead compared to arrays. It can be a concern when dealing with large collections of elements. </tr><tr><td>Slower Insertion and Deletion:</td> Inserting or deleting elements in the middle of an ArrayList requires shifting elements, which can be time-consuming for large lists. In scenarios where frequent insertion or deletion operations are expected, other data structures like LinkedList may offer better performance. </tr><tr><td>Limited Performance for Search:</td> Searching for an element in an unsorted ArrayList requires iterating over the elements until a match is found. It is a linear search approach that results in slower search performance compared to data structures optimized for searching, such as HashSet or TreeMap. </tr><tr><td>No Primitive Type Support:</td> ArrayLists can only store objects and do not directly support primitive data types like int or char. To store primitive types, wrapper classes like Integer or Character need to be used, leading to potential autoboxing and unboxing overhead. </tr></ol> <p> <strong>Functions:</strong> </p> <ol class="points"> <tr><td>Creating an ArrayList:</td> Declare and initialize an ArrayList using the ArrayList class and specify the element type within the angle brackets. </tr><tr><td>Adding Elements:</td> Use the add method to append elements at the end of the ArrayList. </tr><tr><td>Accessing Elements:</td> Use the get technique to retrieve the price of detail at a selected index. </tr><tr><td>Modifying Elements:</td> Update the cost of detail at a specific index for the usage of the set approach. </tr><tr><td>Finding Size:</td> Use the dimensions method to get the cutting-edge quantity of factors in the ArrayList. </tr><tr><td>Removing Elements:</td> Use the remove approach to delete a detail at a specific index or via providing the object reference. </tr><tr><td>Iterating through the ArrayList:</td> Use loops to iterate over each element in the ArrayList and perform operations on them. </tr></ol> <p> <strong>Implementation:</strong> </p> <p> <strong>FileName:</strong> ArrayListExample.java</p> <pre> import java.util.*; public class ArrayListExample { public static void main(String[] args) { // Create an ArrayList to store integers ArrayList numbers=new ArrayList(List.of(10,20,30,40,50)); //Access and print elements from the ArrayList System.out.println(&apos;Element at index 0:&apos;+numbers.get(0)); System.out.println(&apos;Element at index 2:&apos;+numbers.get(2)); System.out.println(&apos;Element at index 4:&apos;+numbers.get(4)); // Calculate and print the sum of all elements in the ArrayList int sum=numbers.stream().mapToInt(Integer::intValue).sum(); System.out.println(&apos;Sum of ArrayList elements:&apos;+sum); // Update an element in the ArrayList numbers.set(2,35); System.out.println(&apos;Updated element at index 2:&apos;+numbers.get(2)); // Iterate through the ArrayList using a for-each loop and print the elements System.out.println(&apos;Elements in the ArrayList:&apos;); for (int number:numbers) { System.out.println(number); } } } </pre> <p> <strong>Output:</strong> </p> <pre> Element at index 0:10 Element at index 2:30 Element at index 4:50 Sum of ArrayList elements:150 Updated element at index 2:35 Elements in the ArrayList: 10 20 35 40 50 </pre> <h3>3) Linked List:</h3> <p>A linked list is a linear data structure in which elements are stored in separate objects called nodes. A reference link to the following node in the sequence is included in each node&apos;s data element. The list&apos;s final node links to null, indicating that the list has ended.</p> <p>Unlike arrays, linked lists do not require contiguous memory allocation. Each node in a linked list can be allocated independently, allowing for dynamic memory allocation and efficient insertion and deletion operations.</p> <p> <strong>Advantages:</strong> </p> <ol class="points"> <tr><td>Dynamic Size:</td> LinkedList can grow or shrink dynamically, making it suitable for varying or unknown data sizes. </tr><tr><td>Efficient Insertion and Deletion:</td> Inserting or deleting elements within a LinkedList is efficient, as it does not require shifting elements. </tr><tr><td>No Contiguous Memory Requirement:</td> LinkedList does not need contiguous memory allocation, making it flexible and suitable for unpredictable memory situations. </tr><tr><td>Easy Modification:</td> LinkedList allows easy modification of elements by changing reference pointers, enabling efficient manipulation. </tr></ol> <p> <strong>Disadvantages:</strong> </p> <ol class="points"> <tr><td>Slower Random Access:</td> LinkedList has slower random Access as it requires traversing the list to access elements by index. </tr><tr><td>Increased Memory Overhead:</td> LinkedList requires additional memory for references and nodes, increasing memory overhead compared to arrays. </tr><tr><td>Inefficient Search:</td> LinkedList has slower search operations, requiring sequential iteration to find specific elements. </tr></ol> <p> <strong>Functions:</strong> </p> <ol class="points"> <tr><td>Creating a LinkedList:</td> Declare and initialize a LinkedList using the LinkedList class. </tr><tr><td>Adding Elements:</td> Use the add method to append elements at the end of the LinkedList. </tr><tr><td>Accessing Elements:</td> Use the get method to retrieve the value of an element at a specific index. </tr><tr><td>Modifying Elements:</td> Update the value of an element at a particular index using the set method. </tr><tr><td>Removing Elements:</td> Use the remove method to delete an element at a specific index or by providing the object reference. </tr></ol> <p> <strong>Implementation:</strong> </p> <p> <strong>FileName:</strong> LinkedList1.java</p> <pre> import java.util.*; public class LinkedList1 { public static void main(String[] args) { // Create a LinkedList to store integers LinkedList linkedList1 = new LinkedList(); // Add elements to the LinkedList linkedList1.add(10); linkedList1.add(20); linkedList1.add(30); linkedList1.add(40); linkedList1.add(50); // Print the LinkedList System.out.println(&apos;LinkedList:&apos;+linkedList1); // Remove an element from the LinkedList linkedList1.removeFirst(); System.out.println(&apos;LinkedList after removing first element:&apos;+linkedList1); // Check if an element exists in the LinkedList boolean containsElement=linkedList1.contains(30); System.out.println(&apos;LinkedList contains element 30?&apos;+containsElement); // Get the first and last elements of the LinkedList int firstElement=linkedList1.getFirst(); int lastElement=linkedList1.getLast(); System.out.println(&apos;First element:&apos;+firstElement); System.out.println(&apos;Last element:&apos;+lastElement); // Clear the LinkedList linkedList1.clear(); System.out.println(&apos;LinkedList after clearing:&apos;+linkedList1); } } </pre> <p> <strong>Output:</strong> </p> <pre> LinkedList:[10, 20, 30, 40, 50] LinkedList after removing first element:[20, 30, 40, 50] LinkedList contains element 30?true First element:20 Last element:50 LinkedList after clearing:[] </pre> <h3>4) Stack:</h3> <p>The Last-In-First-Out (LIFO) principle dictates that the element that was most recently inserted is also the element that is removed first. A stack is a linear data structure that follows this rule. It employs the commands &apos;push&apos; and &apos;pop&apos; to add elements to the stack and, accordingly, remove the top element from the stack. The &apos;peek&apos; technique additionally enables Access to the top element without removing it.</p> <p> <strong>Features of a stack:</strong> </p> <ol class="points"> <tr><td>LIFO behavior:</td> The last element pushed onto the stack is the first one to be popped out, making it suitable for applications where the order of insertion and removal is important. </tr><tr><td>Limited Access:</td> Stacks typically provide restricted Access to elements. You can only access the topmost element, and to reach other elements, you need to pop the elements above them. </tr><tr><td>Dynamic size:</td> Stacks can be implemented using arrays or linked lists, allowing for a dynamic size. They can grow or shrink as needed during runtime. </tr></ol> <p> <strong>Advantages:</strong> </p> <ol class="points"> <tr><td>Simplicity:</td> Stacks are easy to understand and implement. </tr><tr><td>Efficiency:</td> Insertion and deletion operations have a time complexity of O(1). </tr><tr><td>Function call management:</td> Stacks efficiently manage function calls and variable storage. </tr><tr><td>Undo/Redo functionality:</td> Stacks enable undo and redo operations in applications. </tr></ol> <p> <strong>Disadvantages:</strong> </p> <ol class="points"> <tr><td>Limited Access:</td> Access to elements is restricted to the top of the stack. </tr><tr><td>Size restrictions:</td> Stacks may have size limitations depending on the implementation. </tr><tr><td>Not suitable for all scenarios:</td> Stacks are specific to LIFO behavior and may not be appropriate in other cases. </tr></ol> <p> <strong>Implementation:</strong> </p> <p> <strong>FileName:</strong> StackExample.java</p> <pre> import java.util.Stack; public class StackExample { public static void main(String[] args) { // Create a stack Stack stack=new Stack(); // Push elements onto the stack stack.push(10); stack.push(20); stack.push(30); // Print the top element of the stack System.out.println(&apos;Top element:&apos;+stack.peek()); // Pop elements from the stack int poppedElement=stack.pop(); System.out.println(&apos;Popped element:&apos;+poppedElement); // Check if the stack is empty System.out.println(&apos;Is stack empty?&apos;+stack.isEmpty()); // Get the size of the stack System.out.println(&apos;Stack size:&apos;+stack.size()); // Iterate over the stack System.out.println(&apos;Stack elements:&apos;); for (Integer element:stack) { System.out.println(element); } } } </pre> <p> <strong>Output:</strong> </p> <pre> Top element:30 Popped element:30 Is stack empty?false Stack size:2 Stack elements: 10 20 </pre> <h3>5) Queue:</h3> <p>A queue is a linear data structure in Java that follows the First-In-First-Out (FIFO) principle. It represents a collection of elements where elements are inserted at the rear and removed from the front.</p> <p> <strong>Features:</strong> </p> <ol class="points"> <tr><td>Enqueue:</td> Adding an element to the rear of the queue. </tr><tr><td>Dequeue:</td> Removing an element from the front of the queue. </tr><tr><td>Peek:</td> Retrieve the element at the front of the queue without removing it. </tr><tr><td>Size:</td> Determining the number of elements in the queue. </tr><tr><td>Empty Check:</td> Checking if the queue is empty. </tr></ol> <p> <strong>Advantages:</strong> </p> <ol class="points"> <tr><td>FIFO Behavior:</td> Elements are processed in the order of their insertion, ensuring the preservation of the original sequence. </tr><tr><td>Efficient Insertion and Removal:</td> Adding and removing elements from a queue is fast and has a constant time complexity of O(1). </tr><tr><td>Synchronization:</td> Java provides synchronized queue implementations, making them safe for concurrent programming. </tr><tr><td>Standardized Interface:</td> The Queue interface in Java offers a common set of methods, allowing easy interchangeability between different queue implementations. </tr></ol> <p> <strong>Disadvantages:</strong> </p> <ol class="points"> <tr><td>No Random Access:</td> Queues do not support direct Access to elements in the middle. Accessing specific positions requires dequeuing preceding elements. </tr><tr><td>Limited Size:</td> Some queue implementations have a fixed size or capacity, leading to overflow or exceptions when exceeding the maximum size. </tr><tr><td>Inefficient Search:</td> Searching for an element in a queue requires dequeuing until a match is found, resulting in a linear search with potentially high time complexity. </tr></ol> <p> <strong>Implementation:</strong> </p> <p> <strong>FileName:</strong> QueueExample.java</p> <pre> import java.util.Stack; import java.util.LinkedList; import java.util.Queue; public class QueueExample { public static void main(String[] args) { // Create a Queue to store integers Queue queue=new LinkedList(); // Enqueue elements to the Queue queue.offer(10); queue.offer(20); queue.offer(30); queue.offer(40); queue.offer(50); //Access and print the front element of the Queue System.out.println(&apos;Front element:&apos;+queue.peek()); // Dequeue elements from the Queue and print them while (!queue.isEmpty()) { int element=queue.poll(); System.out.println(&apos;Dequeued element:&apos;+element); } } } </pre> <p> <strong>Output:</strong> </p> <pre> Front element:10 Dequeued element:10 Dequeued element:20 Dequeued element:30 Dequeued element:40 Dequeued element:50 </pre> <h3>6) HashMap:</h3> <p>A HashMap is a data structure in Java that provides a way to store and retrieve key-value pairs. It is part of the Java Collections Framework and is implemented based on the hash table data structure.</p> <p> <strong>Functions:</strong> </p> <ul> <tr><td>put(key, value):</td> Inserts the specified key-value pair into the HashMap. </tr><tr><td>get(key):</td> Retrieves the value associated with the specified key. </tr><tr><td>containsKey(key):</td> Checks if the HashMap contains the specified key. </tr><tr><td>containsValue(value):</td> Checks if the HashMap contains the specified value. </tr><tr><td>remove(key):</td> Removes the key-value pair associated with the specified key from the HashMap. </tr><tr><td>size():</td> Returns the number of key-value pairs in the HashMap. </tr><tr><td>isEmpty():</td> Checks if the HashMap is empty. </tr><tr><td>keySet():</td> Returns a Set containing all the keys in the HashMap. </tr><tr><td>values():</td> Returns a Collection containing all the values in the HashMap. </tr><tr><td>clear():</td> Removes all the key-value pairs from the HashMap. </tr></ul> <p> <strong>Advantages:</strong> </p> <ol class="points"> <tr><td>Efficient Retrieval:</td> HashMap provides fast retrieval of values based on keys with constant-time complexity O(1). </tr><tr><td>Flexible Key-Value Pairing:</td> HashMap allows any non-null object as a key, enabling custom-defined keys for storing and retrieving data. </tr><tr><td>Dynamic Size:</td> HashMap can dynamically grow or shrink in size to handle varying amounts of data. </tr><tr><td>Compatibility with Java Collections Framework:</td> HashMap implements the Map interface, allowing seamless integration with other Collection classes. </tr></ol> <p> <strong>Disadvantages:</strong> </p> <ol class="points"> <tr><td>Lack of Ordering:</td> HashMap does not preserve the order of elements. Use LinkedHashMap or TreeMap for specific ordering requirements. </tr><tr><td>Increased Memory Overhead:</td> HashMap requires additional memory for hash codes and internal structure compared to simpler data structures. </tr><tr><td>Slower Iteration:</td> Iterating over a HashMap can be slower compared to arrays or lists due to traversing the underlying hash table. </tr></ol> <p> <strong>Implementation:</strong> </p> <p> <strong>FileName:</strong> HashMapExample.java</p> <pre> import java.util.HashMap; public class HashMapExample { public static void main(String[] args) { // Create a HashMap to store String keys and Integer values HashMap hashMap=new HashMap(); // Add key-value pairs to the HashMap hashMap.put(&apos;John&apos;,25); hashMap.put(&apos;Alice&apos;,30); hashMap.put(&apos;Bob&apos;,35); //Access and print values based on keys System.out.println(&apos;Age of John:&apos;+hashMap.get(&apos;John&apos;)); System.out.println(&apos;Age of Alice:&apos;+hashMap.get(&apos;Alice&apos;)); // Check if a key exists in the HashMap System.out.println(&apos;Is Bob present?&apos;+hashMap.containsKey(&apos;Bob&apos;)); // Update the value associated with a key hashMap.put(&apos;Alice&apos;,32); // Remove a key-value pair from the HashMap hashMap.remove(&apos;John&apos;); // Print all key-value pairs in the HashMap System.out.println(&apos;Key-Value pairs in the HashMap:&apos;); for (String key : hashMap.keySet()) { System.out.println(key+&apos;:&apos;+hashMap.get(key)); } // Check the size of the HashMap System.out.println(&apos;Size of the HashMap:&apos;+hashMap.size()); } } </pre> <p> <strong>Output:</strong> </p> <pre> Age of John:25 Age of Alice:30 Is Bob present?true Key-Value pairs in the HashMap: Bob:35 Alice:32 Size of the HashMap:2 </pre> <h3>7) HashSet:</h3> <p>HashSet is a data structure in Java that implements the Set interface and stores elements in a hash table.</p> <p> <strong>Features:</strong> </p> <ol class="points"> <tr><td>Stores unique elements:</td> HashSet does not allow duplicate elements. Each element in the HashSet is unique. </tr><tr><td>Uses hash-based lookup:</td> HashSet uses the hash value of each element to determine its storage location, providing efficient element retrieval. </tr><tr><td>Unordered collection:</td> The elements in a HashSet are not stored in a specific order. The order of elements may change over time. </tr></ol> <p> <strong>Advantages:</strong> </p> <ol class="points"> <tr><td>Fast element lookup:</td> HashSet provides fast lookup operations, making it efficient to check if an element exists in the set. </tr><tr><td>No duplicate elements:</td> HashSet automatically handles duplicate elements and ensures that each element is unique. </tr><tr><td>Integration with Java Collections Framework:</td> HashSet implements the Set interface, making it compatible with other collection classes in the Java Collections Framework. </tr></ol> <p> <strong>Disadvantages:</strong> </p> <ol class="points"> <tr><td>No guaranteed order:</td> HashSet does not maintain the order of elements. If the order of elements is important, HashSet is not suitable. </tr><tr><td>No indexing:</td> HashSet does not provide direct indexing or positional Access to elements. To access elements, you need to iterate over the set. </tr><tr><td>Higher memory overhead:</td> HashSet requires additional memory to store hash values and maintain the hash table structure, resulting in higher memory usage compared to some other data structures. </tr></ol> <p> <strong>Implementation:</strong> </p> <p> <strong>FileName:</strong> HashSetExample.java</p> <pre> import java.util.HashSet; public class HashSetExample { public static void main(String[] args) { // Create a HashSet HashSet set=new HashSet(); // Add elements to the HashSet set.add(&apos;Apple&apos;); set.add(&apos;Banana&apos;); set.add(&apos;Orange&apos;); set.add(&apos;Grapes&apos;); set.add(&apos;Mango&apos;); // Print the HashSet System.out.println(&apos;HashSet:&apos;+set); // Check if an element exists System.out.println(&apos;Contains &apos;Apple&apos;:&apos;+set.contains(&apos;Apple&apos;)); // Remove an element set.remove(&apos;Banana&apos;); // Print the updated HashSet System.out.println(&apos;Updated HashSet:&apos;+set); // Get the size of the HashSet System.out.println(&apos;Size of HashSet:&apos;+set.size()); // Clear the HashSet set.clear(); // Check if the HashSet is empty System.out.println(&apos;Is HashSet empty?&apos;+set.isEmpty()); } } </pre> <p> <strong>Output:</strong> </p> <pre> HashSet:[Apple, Grapes, Mango, Orange, Banana] Contains &apos;Apple&apos;:true Updated HashSet:[Apple, Grapes, Mango, Orange] Size of HashSet:4 Is HashSet empty?true </pre> <h3>8) TreeSet:</h3> <p>TreeSet is an implementation of the SortedSet interface in Java that uses a self-balancing binary search tree called a red-black tree to store elements in sorted order.</p> <p> <strong>Advantages:</strong> </p> <ol class="points"> <tr><td>Sorted Order:</td> TreeSet automatically maintains the elements in a sorted order based on their natural ordering or a custom comparator. It allows for efficient searching and retrieval of elements in ascending or descending order. </tr><tr><td>No Duplicate Elements:</td> TreeSet does not allow duplicate elements. It ensures that each element in the set is unique, which can be useful in scenarios where duplicate values should be avoided. </tr><tr><td>Efficient Operations:</td> TreeSet provides efficient operations like insertion, deletion, and searching. These operations have a time complexity of O(log n), where n is the number of elements in the set. </tr><tr><td>Navigable Set Operations:</td> TreeSet provides additional navigational methods, such as higher(), lower(), ceiling(), and floor(), which allow you to find elements that are greater than, less than, or equal to a given value. </tr></ol> <p> <strong>Disadvantages:</strong> </p> <ol class="points"> <tr><td>Overhead:</td> TreeSet requires additional memory to store the internal data structure, which can lead to higher memory overhead compared to other set implementations. </tr><tr><td>Slower Insertion and Removal:</td> Insertion and removal operations in TreeSet involve maintaining the sorted order of elements, which may require tree restructuring. It can make these operations slightly slower compared to HashSet or LinkedHashSet. </tr><tr><td>Limited Customization:</td> TreeSet is primarily designed for natural ordering or a single custom comparator. It may need more flexibility for multiple sorting criteria or complex sorting logic. </tr></ol> <p> <strong>Functions:</strong> </p> <ul> <tr><td>add(element):</td> Adds an element to the TreeSet while maintaining the sorted order. </tr><tr><td>remove(element):</td> Removes the specified element from the TreeSet. </tr><tr><td>contains(element):</td> Checks if the TreeSet contains the specified element. </tr><tr><td>size():</td> Returns the number of elements in the TreeSet. </tr><tr><td>first():</td> Returns the first (lowest) element in the TreeSet. </tr><tr><td>last():</td> Returns the last (highest) element in the TreeSet. </tr><tr><td>higher(element):</td> Returns the least element in the TreeSet that is strictly greater than the given element. </tr><tr><td>lower(element):</td> Returns the greatest element in the TreeSet that is strictly less than the given element. </tr></ul> <p> <strong>Implementation:</strong> </p> <p> <strong>FileName:</strong> TreeSetExample.java</p> <pre> import java.util.TreeSet; public class TreeSetExample { public static void main(String[] args) { // Create a TreeSet TreeSet numbers=new TreeSet(); // Add elements to the TreeSet numbers.add(5); numbers.add(2); numbers.add(8); numbers.add(1); numbers.add(4); // Print the TreeSet System.out.println(&apos;Elements in the TreeSet:&apos;+numbers); // Check if an element exists System.out.println(&apos;Does TreeSet contain 4?&apos;+numbers.contains(4)); // Remove an element numbers.remove(2); // Print the TreeSet after removal System.out.println(&apos;Elements in the TreeSet after removal:&apos;+numbers); // Get the size of the TreeSet System.out.println(&apos;Size of the TreeSet:&apos;+numbers.size()); // Get the first and last element System.out.println(&apos;First element:&apos;+numbers.first()); System.out.println(&apos;Last element:&apos;+numbers.last()); // Iterate over the TreeSet System.out.println(&apos;Iterating over the TreeSet:&apos;); for (int number:numbers) { System.out.println(number); } } } </pre> <p> <strong>Output:</strong> </p> <pre> Elements in the TreeSet:[1, 2, 4, 5, 8] Does TreeSet contain 4? true Elements in the TreeSet after removal:[1, 4, 5, 8] Size of the TreeSet:4First element:1 Last element:8 Iterating over the TreeSet: 1 4 5 8 </pre> <h3>9) TreeMap:</h3> <p>TreeMap is a class in Java that implements the Map interface and provides a sorted key-value mapping based on the natural order of the keys or a custom comparator.</p> <p> <strong>Advantages:</strong> </p> <ol class="points"> <tr><td>Sorted Ordering:</td> TreeMap maintains the keys in sorted order, which allows for efficient searching, retrieval, and range-based operations. </tr><tr><td>Key-Value Mapping:</td> TreeMap stores key-value pairs, enabling efficient lookup and retrieval of values based on the associated keys. </tr><tr><td>Red-Black Tree Implementation:</td> TreeMap uses a balanced binary search tree (Red-Black Tree) internally, ensuring efficient performance even for large datasets. </tr><tr><td>Support for Custom Comparators:</td> TreeMap allows the use of custom comparators to define the sorting order of the keys, providing flexibility in sorting criteria. </tr></ol> <p> <strong>Disadvantages:</strong> </p> <ol class="points"> <tr><td>Memory Overhead:</td> TreeMap requires additional memory to store the internal tree structure and associated objects, resulting in higher memory usage compared to simpler data structures like HashMap. </tr><tr><td>Slower Insertion and Deletion:</td> Insertion and deletion operations in TreeMap have a time complexity of O(log n) due to the need for tree restructuring, making them slower compared to HashMap or LinkedHashMap. </tr><tr><td>Limited Performance for Unsorted Data:</td> TreeMap performs efficiently for sorted data, but its performance can degrade when dealing with unsorted data or frequent modifications, as it requires maintaining the sorted order. </tr></ol> <p> <strong>Functions:</strong> </p> <ul> <tr><td>put(key, value):</td> Inserts a key-value pair into the TreeMap. </tr><tr><td>get(key):</td> Retrieves the value associated with the specified key. </tr><tr><td>containsKey(key):</td> Checks if the TreeMap contains a specific key. </tr><tr><td>remove(key):</td> Removes the key-value pair associated with the specified key. </tr><tr><td>size():</td> Returns the number of key-value pairs in the TreeMap. </tr><tr><td>keySet():</td> Returns a set of all keys in the TreeMap. </tr><tr><td>values():</td> Returns a collection of all values in the TreeMap. </tr><tr><td>entrySet():</td> Returns a set of key-value pairs in the TreeMap. </tr></ul> <p> <strong>Implementation:</strong> </p> <p> <strong>FileName:</strong> TreeMapExample.java</p> <pre> import java.util.TreeMap; public class TreeMapExample { public static void main(String[] args) { // Create a TreeMap TreeMap scores=new TreeMap(); // Insert key-value pairs into the TreeMap scores.put(&apos;Alice&apos;,90); scores.put(&apos;Bob&apos;,80); scores.put(&apos;Charlie&apos;,95); scores.put(&apos;David&apos;,87); scores.put(&apos;Eve&apos;,92); //Access and print values from the TreeMap System.out.println(&apos;Score of Alice:&apos;+scores.get(&apos;Alice&apos;)); System.out.println(&apos;Score of Charlie:&apos;+scores.get(&apos;Charlie&apos;)); System.out.println(&apos;Score of David:&apos;+scores.get(&apos;David&apos;)); // Update a value in the TreeMap scores.put(&apos;Bob&apos;,85); // Remove a key-value pair from the TreeMap scores.remove(&apos;Eve&apos;); // Iterate through the TreeMap using a for-each loop System.out.println(&apos;Scores in the TreeMap:&apos;); for (String name:scores.keySet()) { int score=scores.get(name); System.out.println(name+&apos;:&apos;+score); } } } </pre> <p> <strong>Output:</strong> </p> <pre> Score of Alice:90 Score of Charlie:95 Score of David:87 Scores in the TreeMap: Alice:90 Bob:85 Charlie:95 David:87 </pre> <h3>10) Graph:</h3> <p>Graphs are data structure that represents a collection of interconnected nodes or vertices. They are composed of vertices and edges, where vertices represent entities and edges represent the relationships between those entities.</p> <p> <strong>Advantages:</strong> </p> <ol class="points"> <tr><td>Versatility:</td> Graphs can represent a wide range of real-world scenarios, making them suitable for various applications such as social networks, transportation systems, and computer networks. </tr><tr><td>Relationship Representation:</td> Graphs provide a natural way to represent relationships and connections between entities, allowing for efficient analysis and traversal of these relationships. </tr><tr><td>Efficient Search and Traversal:</td> Graph algorithms like breadth-first search (BFS) and depth-first search (DFS) enable efficient traversal and searching of the graph&apos;s vertices and edges. </tr><tr><td>Modeling Complex Relationships:</td> Graphs can model complex relationships, including hierarchical structures, cyclic dependencies, and multiple connections between entities. </tr></ol> <p> <strong>Disadvantages:</strong> </p> <ol class="points"> <tr><td>Space Complexity:</td> Graphs can consume a significant amount of memory, especially large-scale graphs with many vertices and edges. </tr><tr><td>The complexity of Operations:</td> Certain graph operations, such as finding the shortest path or detecting cycles, can have high time complexity, particularly in dense graphs. </tr><tr><td>Difficulty in Maintenance:</td> Modifying or updating a graph can be complex, as changes in the graph&apos;s structure may impact its connectivity and existing algorithms. </tr></ol> <p> <strong>Implementation:</strong> </p> <p> <strong>FileName:</strong> GraphExample.java</p> <pre> import java.util.*; public class GraphExample { private int V; // Number of vertices private List<list> adjacencyList; // Adjacency list representation public GraphExample(int V) { this.V=V; adjacencyList=new ArrayList(V); // Initialize the adjacency list for (int i=0;i<v;i++) { adjacencylist.add(new arraylist()); } function to add an edge between two vertices public void addedge(int source,int destination) adjacencylist.get(source).add(destination); adjacencylist.get(destination).add(source); perform breadth-first search traversal of the graph bfs(int startvertex) boolean[] visited="new" boolean[v]; queue linkedlist(); visited[startvertex]="true;" queue.add(startvertex); while (!queue.isempty()) int currentvertex="queue.poll();" system.out.print(currentvertex+' '); list neighbors="adjacencyList.get(currentVertex);" for (int neighbor:neighbors) if (!visited[neighbor]) visited[neighbor]="true;" queue.add(neighbor); system.out.println(); depth-first dfs(int dfsutil(startvertex,visited); private dfsutil(int vertex,boolean[] visited) visited[vertex]="true;" system.out.print(vertex+' dfsutil(neighbor,visited); static main(string[] args) v="5;" number graphexample graphexample(v); edges graph.addedge(0,1); graph.addedge(0,2); graph.addedge(1,3); graph.addedge(2,3); graph.addedge(2,4); system.out.print('bfs traversal: graph.bfs(0); system.out.print('dfs graph.dfs(0); < pre> <p> <strong>Output:</strong> </p> <pre> BFS traversal: 0 1 2 3 4 DFS traversal: 0 1 3 2 4 </pre> <h3>11) Tree:</h3> <p>A tree is a widely used data structure in computer science that represents a hierarchical structure. It consists of nodes connected by edges, where each node can have zero or more child nodes.</p> <p> <strong>Advantages:</strong> </p> <ol class="points"> <tr><td>Hierarchical Structure:</td> Trees provide a natural way to represent hierarchical relationships, such as file systems, organization charts, or HTML/XML documents. </tr><tr><td>Efficient Search:</td> Binary search trees enable efficient searching with a time complexity of O(log n), making them suitable for storing and retrieving sorted data. </tr><tr><td>Fast Insertion and Deletion:</td> Tree data structures offer efficient insertion and deletion operations, especially when balanced, such as AVL trees or Red-Black trees. </tr><tr><td>Ordered Iteration:</td> In-order traversal of a binary search tree gives elements in a sorted order, which is helpful for tasks like printing elements in sorted order or finding the next/previous element. </tr></ol> <p> <strong>Disadvantages:</strong> </p> <ol class="points"> <tr><td>High Memory Overhead:</td> Trees require additional memory to store node references or pointers, which can result in higher memory usage compared to linear data structures like arrays or lists. </tr><tr><td>Complex Implementation:</td> Implementing and maintaining a tree data structure can be more complex compared to other data structures like arrays or lists, especially for balanced tree variants. </tr><tr><td>Limited Operations:</td> Some tree variants, like binary search trees, do not support efficient operations like finding the kth smallest element or finding the rank of an element. </tr></ol> <p> <strong>Functions:</strong> </p> <ol class="points"> <tr><td>Insertion:</td> Add a new node to the tree. </tr><tr><td>Deletion:</td> Remove a node from the tree. </tr><tr><td>Search:</td> Find a specific node or element in the tree. </tr><tr><td>Traversal:</td> Traverse the tree in different orders, such as in-order, pre-order, or post-order. </tr><tr><td>Height/Depth:</td> Calculate the height or depth of the tree. </tr><tr><td>Balance:</td> Ensure the tree remains balanced to maintain efficient operations. </tr></ol> <p> <strong>Implementation:</strong> </p> <p> <strong>FileName:</strong> TreeExample.java</p> <pre> import java.util.*; class TreeNode { int value; TreeNode left; TreeNode right; public TreeNode(int value) { this.value = value; left = null; right = null; } } public class TreeExample { public static void main(String[] args) { // Create a binary search tree TreeNode root = new TreeNode(50); root.left = new TreeNode(30); root.right = new TreeNode(70); root.left.left = new TreeNode(20); root.left.right = new TreeNode(40); root.right.left = new TreeNode(60); root.right.right = new TreeNode(80); // Perform common operations System.out.println(&apos;In-order Traversal:&apos;); inOrderTraversal(root); System.out.println(&apos;
Search for value 40: &apos;+search(root, 40)); System.out.println(&apos;Search for value 90: &apos;+search(root, 90)); int minValue = findMinValue(root); System.out.println(&apos;Minimum value in the tree: &apos;+minValue); int maxValue = findMaxValue(root); System.out.println(&apos;Maximum value in the tree: &apos;+maxValue); } // In-order traversal: left subtree, root, right subtree public static void inOrderTraversal(TreeNode node) { if (node != null) { inOrderTraversal(node.left); System.out.print(node.value + &apos; &apos;); inOrderTraversal(node.right); } } // Search for a value in the tree public static boolean search(TreeNode node, int value) { if (node == null) return false; if (node.value == value) return true; if (value <node.value) return search(node.left, value); else search(node.right, } find the minimum value in tree public static int findminvalue(treenode node) { if (node.left="=" null) node.value; findminvalue(node.left); maximum findmaxvalue(treenode (node.right="=" findmaxvalue(node.right); < pre> <p> <strong>Output:</strong> </p> <pre> In-order Traversal:20 30 40 50 60 70 80 Search for value 40: true Search for value 90: false Minimum value in the tree: 20 Maximum value in the tree: 80 </pre> <hr></node.value)></pre></v;i++)></list></pre></numbers.length;i++)>

2) قائمة المصفوفات:

ArrayList في Java عبارة عن بنية بيانات ديناميكية تسمح بتخزين العناصر ومعالجتها. إنه جزء من Java Collections Framework ويتم تنفيذه باستخدام مصفوفة داخليًا.

مزايا:

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

سلبيات:

    الحمل الزائد للذاكرة:تتطلب ArrayLists ذاكرة إضافية للحفاظ على بنيتها الداخلية، مما يؤدي إلى زيادة حمل الذاكرة مقارنة بالمصفوفات. يمكن أن يكون مصدر قلق عند التعامل مع مجموعات كبيرة من العناصر.الإدراج والحذف الأبطأ:يتطلب إدراج عناصر أو حذفها في منتصف قائمة ArrayList تبديل العناصر، الأمر الذي قد يستغرق وقتًا طويلاً بالنسبة للقوائم الكبيرة. في السيناريوهات التي يُتوقع فيها عمليات الإدراج أو الحذف المتكررة، قد تقدم هياكل البيانات الأخرى مثل LinkedList أداءً أفضل.أداء محدود للبحث:يتطلب البحث عن عنصر في ArrayList غير المصنفة التكرار على العناصر حتى يتم العثور على تطابق. إنه أسلوب بحث خطي يؤدي إلى أداء بحث أبطأ مقارنة بهياكل البيانات المحسنة للبحث، مثل HashSet أو TreeMap.لا يوجد دعم للنوع البدائي:يمكن لـ ArrayLists تخزين الكائنات فقط ولا تدعم بشكل مباشر أنواع البيانات البدائية مثل int أو char. لتخزين الأنواع البدائية، يجب استخدام فئات مجمّعة مثل Integer أو Character، مما يؤدي إلى احتمالية التحميل التلقائي وإلغاء التحميل الزائد.

المهام:

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

تطبيق:

اسم الملف: ArrayListExample.java

 import java.util.*; public class ArrayListExample { public static void main(String[] args) { // Create an ArrayList to store integers ArrayList numbers=new ArrayList(List.of(10,20,30,40,50)); //Access and print elements from the ArrayList System.out.println(&apos;Element at index 0:&apos;+numbers.get(0)); System.out.println(&apos;Element at index 2:&apos;+numbers.get(2)); System.out.println(&apos;Element at index 4:&apos;+numbers.get(4)); // Calculate and print the sum of all elements in the ArrayList int sum=numbers.stream().mapToInt(Integer::intValue).sum(); System.out.println(&apos;Sum of ArrayList elements:&apos;+sum); // Update an element in the ArrayList numbers.set(2,35); System.out.println(&apos;Updated element at index 2:&apos;+numbers.get(2)); // Iterate through the ArrayList using a for-each loop and print the elements System.out.println(&apos;Elements in the ArrayList:&apos;); for (int number:numbers) { System.out.println(number); } } } 

انتاج:

 Element at index 0:10 Element at index 2:30 Element at index 4:50 Sum of ArrayList elements:150 Updated element at index 2:35 Elements in the ArrayList: 10 20 35 40 50 

3) القائمة المرتبطة:

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

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

مزايا:

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

سلبيات:

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

المهام:

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

تطبيق:

اسم الملف: LinkedList1.java

 import java.util.*; public class LinkedList1 { public static void main(String[] args) { // Create a LinkedList to store integers LinkedList linkedList1 = new LinkedList(); // Add elements to the LinkedList linkedList1.add(10); linkedList1.add(20); linkedList1.add(30); linkedList1.add(40); linkedList1.add(50); // Print the LinkedList System.out.println(&apos;LinkedList:&apos;+linkedList1); // Remove an element from the LinkedList linkedList1.removeFirst(); System.out.println(&apos;LinkedList after removing first element:&apos;+linkedList1); // Check if an element exists in the LinkedList boolean containsElement=linkedList1.contains(30); System.out.println(&apos;LinkedList contains element 30?&apos;+containsElement); // Get the first and last elements of the LinkedList int firstElement=linkedList1.getFirst(); int lastElement=linkedList1.getLast(); System.out.println(&apos;First element:&apos;+firstElement); System.out.println(&apos;Last element:&apos;+lastElement); // Clear the LinkedList linkedList1.clear(); System.out.println(&apos;LinkedList after clearing:&apos;+linkedList1); } } 

انتاج:

 LinkedList:[10, 20, 30, 40, 50] LinkedList after removing first element:[20, 30, 40, 50] LinkedList contains element 30?true First element:20 Last element:50 LinkedList after clearing:[] 

4) المكدس:

ينص مبدأ Last-In-First-Out (LIFO) على أن العنصر الذي تم إدراجه مؤخرًا هو أيضًا العنصر الذي تمت إزالته أولاً. المكدس عبارة عن بنية بيانات خطية تتبع هذه القاعدة. يستخدم الأمرين 'push' و'pop' لإضافة عناصر إلى المكدس، وبالتالي إزالة العنصر العلوي من المكدس. بالإضافة إلى ذلك، تتيح تقنية 'النظرة الخاطفة' إمكانية الوصول إلى العنصر العلوي دون إزالته.

ميزات المكدس:

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

مزايا:

    بساطة:الأكوام سهلة الفهم والتنفيذ.كفاءة:عمليات الإدراج والحذف لها تعقيد زمني قدره O(1).إدارة استدعاء الوظائف:تقوم الأكوام بإدارة استدعاءات الوظائف والتخزين المتغير بكفاءة.وظيفة التراجع/الإعادة:تعمل الأكوام على تمكين عمليات التراجع والإعادة في التطبيقات.

سلبيات:

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

تطبيق:

اسم الملف: StackExample.java

 import java.util.Stack; public class StackExample { public static void main(String[] args) { // Create a stack Stack stack=new Stack(); // Push elements onto the stack stack.push(10); stack.push(20); stack.push(30); // Print the top element of the stack System.out.println(&apos;Top element:&apos;+stack.peek()); // Pop elements from the stack int poppedElement=stack.pop(); System.out.println(&apos;Popped element:&apos;+poppedElement); // Check if the stack is empty System.out.println(&apos;Is stack empty?&apos;+stack.isEmpty()); // Get the size of the stack System.out.println(&apos;Stack size:&apos;+stack.size()); // Iterate over the stack System.out.println(&apos;Stack elements:&apos;); for (Integer element:stack) { System.out.println(element); } } } 

انتاج:

إعادة تسمية الدليل لينكس
 Top element:30 Popped element:30 Is stack empty?false Stack size:2 Stack elements: 10 20 

5) قائمة الانتظار:

قائمة الانتظار عبارة عن بنية بيانات خطية في Java تتبع مبدأ First-In-First-Out (FIFO). إنه يمثل مجموعة من العناصر حيث يتم إدراج العناصر في الخلف وإزالتها من الأمام.

سمات:

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

مزايا:

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

سلبيات:

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

تطبيق:

اسم الملف: QueueExample.java

 import java.util.Stack; import java.util.LinkedList; import java.util.Queue; public class QueueExample { public static void main(String[] args) { // Create a Queue to store integers Queue queue=new LinkedList(); // Enqueue elements to the Queue queue.offer(10); queue.offer(20); queue.offer(30); queue.offer(40); queue.offer(50); //Access and print the front element of the Queue System.out.println(&apos;Front element:&apos;+queue.peek()); // Dequeue elements from the Queue and print them while (!queue.isEmpty()) { int element=queue.poll(); System.out.println(&apos;Dequeued element:&apos;+element); } } } 

انتاج:

 Front element:10 Dequeued element:10 Dequeued element:20 Dequeued element:30 Dequeued element:40 Dequeued element:50 

6) هاشماب:

HashMap عبارة عن بنية بيانات في Java توفر طريقة لتخزين واسترجاع أزواج القيمة الرئيسية. إنه جزء من Java Collections Framework ويتم تنفيذه بناءً على بنية بيانات جدول التجزئة.

المهام:

    وضع (المفتاح، القيمة):يقوم بإدراج زوج القيمة الرئيسية المحدد في HashMap.احصل على مفتاح):يسترد القيمة المرتبطة بالمفتاح المحدد.يحتوي على مفتاح (مفتاح):يتحقق مما إذا كان HashMap يحتوي على المفتاح المحدد.يحتوي على القيمة (القيمة):يتحقق مما إذا كان HashMap يحتوي على القيمة المحددة.إزالة (مفتاح):يزيل زوج المفتاح والقيمة المرتبط بالمفتاح المحدد من HashMap.مقاس():إرجاع عدد أزواج القيمة الرئيسية في HashMap.فارغ():يتحقق مما إذا كانت HashMap فارغة.مجموعة المفاتيح ():إرجاع مجموعة تحتوي على جميع المفاتيح الموجودة في HashMap.قيم():إرجاع مجموعة تحتوي على كافة القيم الموجودة في HashMap.واضح():يزيل جميع أزواج القيمة الرئيسية من HashMap.

مزايا:

    استرجاع فعال:يوفر HashMap استرجاعًا سريعًا للقيم استنادًا إلى المفاتيح ذات التعقيد الثابت في الوقت O(1).الاقتران المرن بالقيمة الرئيسية:يسمح HashMap لأي كائن غير فارغ كمفتاح، مما يتيح مفاتيح محددة خصيصًا لتخزين البيانات واسترجاعها.الحجم الديناميكي:يمكن أن ينمو HashMap أو يتقلص حجمه ديناميكيًا للتعامل مع كميات مختلفة من البيانات.التوافق مع Java Collections Framework:تطبق HashMap واجهة الخريطة، مما يسمح بالتكامل السلس مع فئات المجموعة الأخرى.

سلبيات:

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

تطبيق:

اسم الملف: HashMapExample.java

 import java.util.HashMap; public class HashMapExample { public static void main(String[] args) { // Create a HashMap to store String keys and Integer values HashMap hashMap=new HashMap(); // Add key-value pairs to the HashMap hashMap.put(&apos;John&apos;,25); hashMap.put(&apos;Alice&apos;,30); hashMap.put(&apos;Bob&apos;,35); //Access and print values based on keys System.out.println(&apos;Age of John:&apos;+hashMap.get(&apos;John&apos;)); System.out.println(&apos;Age of Alice:&apos;+hashMap.get(&apos;Alice&apos;)); // Check if a key exists in the HashMap System.out.println(&apos;Is Bob present?&apos;+hashMap.containsKey(&apos;Bob&apos;)); // Update the value associated with a key hashMap.put(&apos;Alice&apos;,32); // Remove a key-value pair from the HashMap hashMap.remove(&apos;John&apos;); // Print all key-value pairs in the HashMap System.out.println(&apos;Key-Value pairs in the HashMap:&apos;); for (String key : hashMap.keySet()) { System.out.println(key+&apos;:&apos;+hashMap.get(key)); } // Check the size of the HashMap System.out.println(&apos;Size of the HashMap:&apos;+hashMap.size()); } } 

انتاج:

 Age of John:25 Age of Alice:30 Is Bob present?true Key-Value pairs in the HashMap: Bob:35 Alice:32 Size of the HashMap:2 

7) هاشتاج:

HashSet عبارة عن بنية بيانات في Java تنفذ واجهة Set وتخزن العناصر في جدول التجزئة.

سمات:

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

مزايا:

    البحث السريع عن العناصر:توفر HashSet عمليات بحث سريعة، مما يجعلها فعالة للتحقق من وجود عنصر في المجموعة.لا توجد عناصر مكررة:يتعامل HashSet تلقائيًا مع العناصر المكررة ويضمن أن كل عنصر فريد من نوعه.التكامل مع Java Collections Framework:تطبق HashSet واجهة Set، مما يجعلها متوافقة مع فئات المجموعة الأخرى في Java Collections Framework.

سلبيات:

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

تطبيق:

اسم الملف: HashSetExample.java

 import java.util.HashSet; public class HashSetExample { public static void main(String[] args) { // Create a HashSet HashSet set=new HashSet(); // Add elements to the HashSet set.add(&apos;Apple&apos;); set.add(&apos;Banana&apos;); set.add(&apos;Orange&apos;); set.add(&apos;Grapes&apos;); set.add(&apos;Mango&apos;); // Print the HashSet System.out.println(&apos;HashSet:&apos;+set); // Check if an element exists System.out.println(&apos;Contains &apos;Apple&apos;:&apos;+set.contains(&apos;Apple&apos;)); // Remove an element set.remove(&apos;Banana&apos;); // Print the updated HashSet System.out.println(&apos;Updated HashSet:&apos;+set); // Get the size of the HashSet System.out.println(&apos;Size of HashSet:&apos;+set.size()); // Clear the HashSet set.clear(); // Check if the HashSet is empty System.out.println(&apos;Is HashSet empty?&apos;+set.isEmpty()); } } 

انتاج:

 HashSet:[Apple, Grapes, Mango, Orange, Banana] Contains &apos;Apple&apos;:true Updated HashSet:[Apple, Grapes, Mango, Orange] Size of HashSet:4 Is HashSet empty?true 

8) مجموعة الأشجار:

TreeSet هو تطبيق لواجهة SortedSet في Java التي تستخدم شجرة بحث ثنائية ذاتية التوازن تسمى شجرة حمراء-سوداء لتخزين العناصر بترتيب مفروز.

مزايا:

    الترتيب المفرز:يحتفظ TreeSet تلقائيًا بالعناصر بترتيب مفروز بناءً على ترتيبها الطبيعي أو المقارنة المخصصة. يسمح بالبحث الفعال واسترجاع العناصر بترتيب تصاعدي أو تنازلي.لا توجد عناصر مكررة:لا يسمح TreeSet بالعناصر المكررة. فهو يضمن أن كل عنصر في المجموعة فريد، وهو ما يمكن أن يكون مفيدًا في السيناريوهات التي يجب فيها تجنب القيم المكررة.عمليات فعالة:يوفر TreeSet عمليات فعالة مثل الإدراج والحذف والبحث. هذه العمليات لها تعقيد زمني قدره O(log n)، حيث n هو عدد العناصر في المجموعة.عمليات المجموعة القابلة للملاحة:يوفر TreeSet طرق تنقل إضافية، مثل Higher() و Lower() و Ceil() و Floor()، والتي تسمح لك بالعثور على عناصر أكبر من أو أقل من أو تساوي قيمة معينة.

سلبيات:

    تكاليف غير مباشرة:يتطلب TreeSet ذاكرة إضافية لتخزين بنية البيانات الداخلية، مما قد يؤدي إلى زيادة حمل الذاكرة مقارنة بتطبيقات المجموعة الأخرى.إدخال وإزالة أبطأ:تتضمن عمليات الإدراج والإزالة في TreeSet الحفاظ على الترتيب المفرز للعناصر، الأمر الذي قد يتطلب إعادة هيكلة الشجرة. يمكن أن يجعل هذه العمليات أبطأ قليلاً مقارنة بـ HashSet أو LinkedHashSet.التخصيص المحدود:تم تصميم TreeSet بشكل أساسي للترتيب الطبيعي أو مقارنة مخصصة واحدة. قد تحتاج إلى مزيد من المرونة لمعايير الفرز المتعددة أو منطق الفرز المعقد.

المهام:

تعليم كاسيدي هاتشينسون
    إضافة (عنصر):إضافة عنصر إلى TreeSet مع الحفاظ على الترتيب الذي تم فرزه.إزالة (العنصر):إزالة العنصر المحدد من TreeSet.يحتوي على (عنصر):يتحقق مما إذا كان TreeSet يحتوي على العنصر المحدد.مقاس():إرجاع عدد العناصر في TreeSet.أولاً():إرجاع العنصر الأول (الأدنى) في TreeSet.آخر():إرجاع العنصر الأخير (الأعلى) في TreeSet.أعلى (عنصر):تُرجع أقل عنصر في TreeSet وهو أكبر تمامًا من العنصر المحدد.أقل (عنصر):تُرجع أكبر عنصر في TreeSet وهو أقل تمامًا من العنصر المحدد.

تطبيق:

اسم الملف: TreeSetExample.java

 import java.util.TreeSet; public class TreeSetExample { public static void main(String[] args) { // Create a TreeSet TreeSet numbers=new TreeSet(); // Add elements to the TreeSet numbers.add(5); numbers.add(2); numbers.add(8); numbers.add(1); numbers.add(4); // Print the TreeSet System.out.println(&apos;Elements in the TreeSet:&apos;+numbers); // Check if an element exists System.out.println(&apos;Does TreeSet contain 4?&apos;+numbers.contains(4)); // Remove an element numbers.remove(2); // Print the TreeSet after removal System.out.println(&apos;Elements in the TreeSet after removal:&apos;+numbers); // Get the size of the TreeSet System.out.println(&apos;Size of the TreeSet:&apos;+numbers.size()); // Get the first and last element System.out.println(&apos;First element:&apos;+numbers.first()); System.out.println(&apos;Last element:&apos;+numbers.last()); // Iterate over the TreeSet System.out.println(&apos;Iterating over the TreeSet:&apos;); for (int number:numbers) { System.out.println(number); } } } 

انتاج:

 Elements in the TreeSet:[1, 2, 4, 5, 8] Does TreeSet contain 4? true Elements in the TreeSet after removal:[1, 4, 5, 8] Size of the TreeSet:4First element:1 Last element:8 Iterating over the TreeSet: 1 4 5 8 

9) خريطة الشجرة:

TreeMap عبارة عن فئة في Java تقوم بتنفيذ واجهة Map وتوفر تعيينًا لقيمة المفتاح المصنف بناءً على الترتيب الطبيعي للمفاتيح أو المقارنة المخصصة.

مزايا:

    الترتيب المرتب:يحتفظ TreeMap بالمفاتيح بترتيب مصنف، مما يسمح بإجراء عمليات بحث واسترجاع وعمليات تعتمد على النطاق بكفاءة.رسم خرائط القيمة الرئيسية:يقوم TreeMap بتخزين أزواج القيمة الرئيسية، مما يتيح البحث واسترجاع القيم بشكل فعال بناءً على المفاتيح المرتبطة.تنفيذ الشجرة ذات اللون الأحمر والأسود:يستخدم TreeMap شجرة بحث ثنائية متوازنة (Red-Black Tree) داخليًا، مما يضمن الأداء الفعال حتى بالنسبة لمجموعات البيانات الكبيرة.دعم المقارنات المخصصة:يسمح TreeMap باستخدام مقارنات مخصصة لتحديد ترتيب فرز المفاتيح، مما يوفر المرونة في معايير الفرز.

سلبيات:

    الحمل الزائد للذاكرة:يتطلب TreeMap ذاكرة إضافية لتخزين بنية الشجرة الداخلية والكائنات المرتبطة بها، مما يؤدي إلى استخدام ذاكرة أعلى مقارنة بهياكل البيانات الأبسط مثل HashMap.الإدراج والحذف الأبطأ:تتمتع عمليات الإدراج والحذف في TreeMap بتعقيد زمني يبلغ O(log n) نظرًا للحاجة إلى إعادة هيكلة الشجرة، مما يجعلها أبطأ مقارنةً بـ HashMap أو LinkedHashMap.أداء محدود للبيانات غير المصنفة:يعمل TreeMap بكفاءة مع البيانات التي تم فرزها، ولكن يمكن أن يتدهور أدائه عند التعامل مع البيانات التي لم يتم فرزها أو التعديلات المتكررة، لأنه يتطلب الحفاظ على الترتيب الذي تم فرزه.

المهام:

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

تطبيق:

اسم الملف: TreeMapExample.java

 import java.util.TreeMap; public class TreeMapExample { public static void main(String[] args) { // Create a TreeMap TreeMap scores=new TreeMap(); // Insert key-value pairs into the TreeMap scores.put(&apos;Alice&apos;,90); scores.put(&apos;Bob&apos;,80); scores.put(&apos;Charlie&apos;,95); scores.put(&apos;David&apos;,87); scores.put(&apos;Eve&apos;,92); //Access and print values from the TreeMap System.out.println(&apos;Score of Alice:&apos;+scores.get(&apos;Alice&apos;)); System.out.println(&apos;Score of Charlie:&apos;+scores.get(&apos;Charlie&apos;)); System.out.println(&apos;Score of David:&apos;+scores.get(&apos;David&apos;)); // Update a value in the TreeMap scores.put(&apos;Bob&apos;,85); // Remove a key-value pair from the TreeMap scores.remove(&apos;Eve&apos;); // Iterate through the TreeMap using a for-each loop System.out.println(&apos;Scores in the TreeMap:&apos;); for (String name:scores.keySet()) { int score=scores.get(name); System.out.println(name+&apos;:&apos;+score); } } } 

انتاج:

 Score of Alice:90 Score of Charlie:95 Score of David:87 Scores in the TreeMap: Alice:90 Bob:85 Charlie:95 David:87 

10) الرسم البياني:

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

مزايا:

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

سلبيات:

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

تطبيق:

اسم الملف: GraphExample.java

 import java.util.*; public class GraphExample { private int V; // Number of vertices private List<list> adjacencyList; // Adjacency list representation public GraphExample(int V) { this.V=V; adjacencyList=new ArrayList(V); // Initialize the adjacency list for (int i=0;i<v;i++) { adjacencylist.add(new arraylist()); } function to add an edge between two vertices public void addedge(int source,int destination) adjacencylist.get(source).add(destination); adjacencylist.get(destination).add(source); perform breadth-first search traversal of the graph bfs(int startvertex) boolean[] visited="new" boolean[v]; queue linkedlist(); visited[startvertex]="true;" queue.add(startvertex); while (!queue.isempty()) int currentvertex="queue.poll();" system.out.print(currentvertex+\' \'); list neighbors="adjacencyList.get(currentVertex);" for (int neighbor:neighbors) if (!visited[neighbor]) visited[neighbor]="true;" queue.add(neighbor); system.out.println(); depth-first dfs(int dfsutil(startvertex,visited); private dfsutil(int vertex,boolean[] visited) visited[vertex]="true;" system.out.print(vertex+\' dfsutil(neighbor,visited); static main(string[] args) v="5;" number graphexample graphexample(v); edges graph.addedge(0,1); graph.addedge(0,2); graph.addedge(1,3); graph.addedge(2,3); graph.addedge(2,4); system.out.print(\'bfs traversal: graph.bfs(0); system.out.print(\'dfs graph.dfs(0); < pre> <p> <strong>Output:</strong> </p> <pre> BFS traversal: 0 1 2 3 4 DFS traversal: 0 1 3 2 4 </pre> <h3>11) Tree:</h3> <p>A tree is a widely used data structure in computer science that represents a hierarchical structure. It consists of nodes connected by edges, where each node can have zero or more child nodes.</p> <p> <strong>Advantages:</strong> </p> <ol class="points"> <tr><td>Hierarchical Structure:</td> Trees provide a natural way to represent hierarchical relationships, such as file systems, organization charts, or HTML/XML documents. </tr><tr><td>Efficient Search:</td> Binary search trees enable efficient searching with a time complexity of O(log n), making them suitable for storing and retrieving sorted data. </tr><tr><td>Fast Insertion and Deletion:</td> Tree data structures offer efficient insertion and deletion operations, especially when balanced, such as AVL trees or Red-Black trees. </tr><tr><td>Ordered Iteration:</td> In-order traversal of a binary search tree gives elements in a sorted order, which is helpful for tasks like printing elements in sorted order or finding the next/previous element. </tr></ol> <p> <strong>Disadvantages:</strong> </p> <ol class="points"> <tr><td>High Memory Overhead:</td> Trees require additional memory to store node references or pointers, which can result in higher memory usage compared to linear data structures like arrays or lists. </tr><tr><td>Complex Implementation:</td> Implementing and maintaining a tree data structure can be more complex compared to other data structures like arrays or lists, especially for balanced tree variants. </tr><tr><td>Limited Operations:</td> Some tree variants, like binary search trees, do not support efficient operations like finding the kth smallest element or finding the rank of an element. </tr></ol> <p> <strong>Functions:</strong> </p> <ol class="points"> <tr><td>Insertion:</td> Add a new node to the tree. </tr><tr><td>Deletion:</td> Remove a node from the tree. </tr><tr><td>Search:</td> Find a specific node or element in the tree. </tr><tr><td>Traversal:</td> Traverse the tree in different orders, such as in-order, pre-order, or post-order. </tr><tr><td>Height/Depth:</td> Calculate the height or depth of the tree. </tr><tr><td>Balance:</td> Ensure the tree remains balanced to maintain efficient operations. </tr></ol> <p> <strong>Implementation:</strong> </p> <p> <strong>FileName:</strong> TreeExample.java</p> <pre> import java.util.*; class TreeNode { int value; TreeNode left; TreeNode right; public TreeNode(int value) { this.value = value; left = null; right = null; } } public class TreeExample { public static void main(String[] args) { // Create a binary search tree TreeNode root = new TreeNode(50); root.left = new TreeNode(30); root.right = new TreeNode(70); root.left.left = new TreeNode(20); root.left.right = new TreeNode(40); root.right.left = new TreeNode(60); root.right.right = new TreeNode(80); // Perform common operations System.out.println(&apos;In-order Traversal:&apos;); inOrderTraversal(root); System.out.println(&apos;
Search for value 40: &apos;+search(root, 40)); System.out.println(&apos;Search for value 90: &apos;+search(root, 90)); int minValue = findMinValue(root); System.out.println(&apos;Minimum value in the tree: &apos;+minValue); int maxValue = findMaxValue(root); System.out.println(&apos;Maximum value in the tree: &apos;+maxValue); } // In-order traversal: left subtree, root, right subtree public static void inOrderTraversal(TreeNode node) { if (node != null) { inOrderTraversal(node.left); System.out.print(node.value + &apos; &apos;); inOrderTraversal(node.right); } } // Search for a value in the tree public static boolean search(TreeNode node, int value) { if (node == null) return false; if (node.value == value) return true; if (value <node.value) return search(node.left, value); else search(node.right, } find the minimum value in tree public static int findminvalue(treenode node) { if (node.left="=" null) node.value; findminvalue(node.left); maximum findmaxvalue(treenode (node.right="=" findmaxvalue(node.right); < pre> <p> <strong>Output:</strong> </p> <pre> In-order Traversal:20 30 40 50 60 70 80 Search for value 40: true Search for value 90: false Minimum value in the tree: 20 Maximum value in the tree: 80 </pre> <hr></node.value)></pre></v;i++)></list>

11) الشجرة:

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

مزايا:

    الهيكل الهرمي:توفر الأشجار طريقة طبيعية لتمثيل العلاقات الهرمية، مثل أنظمة الملفات، أو المخططات الهيكلية، أو مستندات HTML/XML.بحث فعال:تتيح أشجار البحث الثنائية إجراء بحث فعال مع تعقيد زمني يبلغ O(log n)، مما يجعلها مناسبة لتخزين البيانات المصنفة واسترجاعها.الإدراج والحذف السريع:توفر هياكل البيانات الشجرية عمليات إدراج وحذف فعالة، خاصة عندما تكون متوازنة، مثل أشجار AVL أو الأشجار ذات اللون الأحمر والأسود.التكرار المرتب:يوفر الاجتياز بالترتيب لشجرة البحث الثنائية العناصر بترتيب مفروز، وهو أمر مفيد لمهام مثل طباعة العناصر بترتيب مفروز أو العثور على العنصر التالي/السابق.

سلبيات:

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

المهام:

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

تطبيق:

اسم الملف: TreeExample.java

 import java.util.*; class TreeNode { int value; TreeNode left; TreeNode right; public TreeNode(int value) { this.value = value; left = null; right = null; } } public class TreeExample { public static void main(String[] args) { // Create a binary search tree TreeNode root = new TreeNode(50); root.left = new TreeNode(30); root.right = new TreeNode(70); root.left.left = new TreeNode(20); root.left.right = new TreeNode(40); root.right.left = new TreeNode(60); root.right.right = new TreeNode(80); // Perform common operations System.out.println(&apos;In-order Traversal:&apos;); inOrderTraversal(root); System.out.println(&apos;
Search for value 40: &apos;+search(root, 40)); System.out.println(&apos;Search for value 90: &apos;+search(root, 90)); int minValue = findMinValue(root); System.out.println(&apos;Minimum value in the tree: &apos;+minValue); int maxValue = findMaxValue(root); System.out.println(&apos;Maximum value in the tree: &apos;+maxValue); } // In-order traversal: left subtree, root, right subtree public static void inOrderTraversal(TreeNode node) { if (node != null) { inOrderTraversal(node.left); System.out.print(node.value + &apos; &apos;); inOrderTraversal(node.right); } } // Search for a value in the tree public static boolean search(TreeNode node, int value) { if (node == null) return false; if (node.value == value) return true; if (value <node.value) return search(node.left, value); else search(node.right, } find the minimum value in tree public static int findminvalue(treenode node) { if (node.left="=" null) node.value; findminvalue(node.left); maximum findmaxvalue(treenode (node.right="=" findmaxvalue(node.right); < pre> <p> <strong>Output:</strong> </p> <pre> In-order Traversal:20 30 40 50 60 70 80 Search for value 40: true Search for value 90: false Minimum value in the tree: 20 Maximum value in the tree: 80 </pre> <hr></node.value)>