في هذه المقالة، سنستكشف طريقتين لإزالة العناصر المكررة من المكدس في Java. سنقوم بمقارنة الطريقة المباشرة مع الحلقات المتداخلة وطريقة أكثر كفاءة باستخدام HashSet. الهدف هو توضيح كيفية تحسين إزالة التكرارات وتقييم أداء كل نهج.
اكتب برنامج Java لإزالة العنصر المكرر من المكدس.
مدخل
Stackdata = 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
لإزالة التكرارات من مكدس معين، لدينا طريقتان -
فيما يلي برنامج 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 −
يوجد أدناه برنامج 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)
للتحقق مما إذا كان العنصر موجودًا بالفعل.فيما يلي خطوة إزالة التكرارات من مكدس معين باستخدام النهج الأمثل -
يوجد أدناه برنامج Java لإزالة التكرارات من مكدس معين باستخدام HashSet −
public static Stackidea2(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) عند الوصول إلى عنصر عشوائي لتقليل تكلفة الحساب التحقق من وجود العنصر أم لا.
فيما يلي خطوة إزالة التكرارات من مكدس معين باستخدام كلا الطريقتين المذكورتين أعلاه -
مثال
استيراد java.util.HashSet; import java.util.Random; import java.util.Set; import java.util.Stack; الطبقة العامة DuplicateStackElements { مكدس ثابت خاص
import java.util.HashSet; import java.util.Random; import java.util.Set; import java.util.Stack; public class DuplicateStackElements { private static StackinitData(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)); } }
الإخراج
* وحدة القياس هي النانو ثانية.
public static void main(String[] args) { Stackdata1 = initData( ); Stack data2 = manualCloneStack(data1); idea1(data1); idea2(data2); }
100 عنصر | 1000 عنصر | 10000 عنصر
| 100000 عنصر
1000000 عنصر |
| الفكرة 1|
4051600 |
19026900 |
114201800 |
1157256000 |
| الفكرة الثانية|
681400 |
2717800 |
11489400 |
36456100 |
|
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3