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

برنامج جافا لإزالة التكرارات من مكدس معين

تم النشر بتاريخ 2024-09-02
تصفح:853

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

بيان المشكلة

اكتب برنامج Java لإزالة العنصر المكرر من المكدس.

مدخل

Stack data = initData(10L);

الإخراج

Unique elements using Naive Approach: [1, 4, 3, 2, 8, 7, 5]
Time spent for Naive Approach: 18200 nanoseconds

Unique elements using Optimized Approach: [1, 4, 3, 2, 8, 7, 5]
Time spent for Optimized Approach: 34800 nanoseconds

لإزالة التكرارات من مكدس معين، لدينا طريقتان -

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

إنشاء واستنساخ مكدسات عشوائية

فيما يلي برنامج Java يقوم أولاً بإنشاء مكدس عشوائي ثم يقوم بإنشاء نسخة مكررة منه لمزيد من الاستخدام −

private static Stack initData(Long size) {
    Stack stack = new Stack  ();
    Random random = new Random();
    int bound = (int) Math.ceil(size * 0.75);
    for (int i = 0; i  manualCloneStack(Stack  stack) {
    Stack  newStack = new Stack  ();
    for (Integer item: stack) {
        newStack.push(item);
    }
    return newStack;
}

initData يساعد في إنشاء مكدس بحجم محدد وعناصر عشوائية تتراوح من 1 إلى 100.

manualCloneStack يساعد في إنشاء البيانات عن طريق نسخ البيانات من مكدس آخر، واستخدامها لمقارنة الأداء بين الفكرتين.

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

فيما يلي خطوة إزالة التكرارات من مكدس معين باستخدام أسلوب Naïve −

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

مثال

يوجد أدناه برنامج Java لإزالة التكرارات من مكدس معين باستخدام أسلوب Naïve −

public static Stack idea1(Stack stack) {
  long start = System.nanoTime();
  Stack resultStack = new Stack  ();

  while (!stack.isEmpty()) {
    int element = stack.pop();
    if (!resultStack.contains(element)) {
      resultStack.add(element);
    }
  }
  System.out.println("Time spent for idea1 is %d nanosecond".formatted(System.nanoTime() - start));
  return resultStack;
}

للنهج الساذج، نستخدم

while (!stack.isEmpty())
للتعامل مع الحلقة الأولى للتنقل عبر جميع العناصر الموجودة في المكدس، والحلقة الثانية هي
resultStack.contains(element)
للتحقق مما إذا كان العنصر موجودًا بالفعل.

إزالة التكرارات من مكدس معين باستخدام النهج الأمثل (HashSet)

فيما يلي خطوة إزالة التكرارات من مكدس معين باستخدام النهج الأمثل -

  • بدء المؤقت
  • قم بإنشاء مجموعة لتتبع العناصر المرئية (لفحوصات تعقيد O(1)).
  • قم بإنشاء مكدس مؤقت لتخزين العناصر الفريدة.
  • التكرار باستخدام أثناء الحلقة يستمر حتى يصبح المكدس فارغًا.
  • قم بإزالة العنصر العلوي من المكدس.
  • للتحقق من التكرارات سنستخدم seen.contains(element) للتحقق مما إذا كان العنصر موجودًا بالفعل في المجموعة.
  • إذا لم يكن العنصر موجودًا في المجموعة، فأضفه إلى كل من المكدس المرئي والمؤقت.
  • سجل وقت الانتهاء واحسب إجمالي الوقت المستغرق.
  • إرجاع النتيجة

مثال

يوجد أدناه برنامج Java لإزالة التكرارات من مكدس معين باستخدام HashSet −

public static Stack idea2(Stack stack) {
    long start = System.nanoTime();
    Set seen = new HashSet();
    Stack tempStack = new Stack();

    while (!stack.isEmpty()) {
        int element = stack.pop();
        if (!seen.contains(element)) {
            seen.add(element);
            tempStack.push(element);
        }
    }
    System.out.println("Time spent for idea2 is %d nanosecond".formatted(System.nanoTime() - start));
    return tempStack;
}

للحصول على النهج الأمثل، نستخدم

Set seen
لتخزين عناصر فريدة في مجموعة، استفد من تعقيد O(1) عند الوصول إلى عنصر عشوائي لتقليل تكلفة الحساب التحقق من وجود العنصر أم لا.

استخدام كلا الطريقتين معًا

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

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

مثال

يوجد أدناه برنامج Java الذي يزيل العناصر المكررة من المكدس باستخدام كلا الطريقتين المذكورتين أعلاه -

استيراد java.util.HashSet; import java.util.Random; import java.util.Set; import java.util.Stack; الطبقة العامة DuplicateStackElements { مكدس ثابت خاص initData(حجم طويل) { Stack stack = new Stack(); عشوائي عشوائي = عشوائي جديد ()؛ intbound = (int) Math.ceil(size * 0.75); لـ (int i = 0; i cloneStack(Stack Stack) { Stack newStack = new Stack(); newStack.addAll(stack); إرجاع مكدس جديد؛ } عامة ثابتة Stack idea1(Stack Stack) { بداية طويلة = System.nanoTime(); Stack resultStack = new Stack(); بينما (!stack.isEmpty()) { عنصر int = stack.pop(); إذا (!resultStack.contains(element)) { resultStack.add(element); } } System.out.printf("الوقت المستغرق في idea1 هو %d نانو ثانية%n"، System.nanoTime() - start); إرجاع نتيجة المكدس؛ } عامة ثابتة Stack idea2(Stack Stack) { بداية طويلة = System.nanoTime(); Set Seen = new HashSet(); Stack tempStack = new Stack(); بينما (!stack.isEmpty()) { عنصر int = stack.pop(); إذا (!seen.contains(element)) { Seen.add(element); tempStack.push(element); } } System.out.printf("الوقت المستغرق في idea2 هو %d نانو ثانية%n"، System.nanoTime() - start); إرجاع tempStack؛ } public static void main(String[] args) { Stack data1 = initData(10L); Stack data2 = cloneStack(data1); System.out.println("العناصر الفريدة التي تستخدم idea1:" idea1(data1)); System.out.println("العناصر الفريدة التي تستخدم idea2:" idea2(data2)); }
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
import java.util.Stack;

public class DuplicateStackElements {
    private static Stack initData(Long size) {
        Stack stack = new Stack();
        Random random = new Random();
        int bound = (int) Math.ceil(size * 0.75);
        for (int i = 0; i  cloneStack(Stack stack) {
        Stack newStack = new Stack();
        newStack.addAll(stack);
        return newStack;
    }
    public static Stack idea1(Stack stack) {
        long start = System.nanoTime();
        Stack resultStack = new Stack();

        while (!stack.isEmpty()) {
            int element = stack.pop();
            if (!resultStack.contains(element)) {
                resultStack.add(element);
            }
        }
        System.out.printf("Time spent for idea1 is %d nanoseconds%n", System.nanoTime() - start);
        return resultStack;
    }
    public static Stack idea2(Stack stack) {
        long start = System.nanoTime();
        Set seen = new HashSet();
        Stack tempStack = new Stack();

        while (!stack.isEmpty()) {
            int element = stack.pop();
            if (!seen.contains(element)) {
                seen.add(element);
                tempStack.push(element);
            }
        }
        System.out.printf("Time spent for idea2 is %d nanoseconds%n", System.nanoTime() - start);
        return tempStack;
    }
    public static void main(String[] args) {
        Stack data1 = initData(10L);
        Stack data2 = cloneStack(data1);
        System.out.println("Unique elements using idea1: "   idea1(data1));
        System.out.println("Unique elements using idea2: "   idea2(data2));
    }
}

الإخراج

Java program to remove duplicates from a given stack


مقارنة

* وحدة القياس هي النانو ثانية.

الفراغ الثابت العام الرئيسي(String[] args) { Stack data1 = initData(); Stack data2 = manualCloneStack(data1); idea1(data1); idea2(data2);
public static void main(String[] args) {
    Stack data1 = initData();
    Stack data2 = manualCloneStack(data1);
    idea1(data1);
    idea2(data2);
}
طريقة100 عنصر1000 عنصر 100000 عنصر الفكرة 1693100 الفكرة الثانية135800  كما لوحظ، فإن وقت تشغيل الفكرة 2 أقصر من وقت تشغيل الفكرة 1 لأن تعقيد الفكرة 1 هو O(n²)، في حين أن تعقيد الفكرة 2 هو O(n). لذلك، عندما يزيد عدد الأكوام، فإن الوقت المستغرق في العمليات الحسابية يزداد أيضًا بناءً على ذلك.
10000 عنصر

1000000 عنصر

4051600
19026900
114201800
1157256000

681400
2717800
11489400

36456100

بيان الافراج هذه المقالة مستنسخة على: https://www.tutorialspoint.com/java-program-to-remove-duplicates-from-a-given-stack إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] لحذفه
أحدث البرنامج التعليمي أكثر>

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

Copyright© 2022 湘ICP备2022001581号-3