この記事では、Java のスタックから重複要素を削除する 2 つの方法を検討します。 ネストされたループ を使用した単純なアプローチと、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
特定のスタックから重複を削除するには、2 つのアプローチがあります -
以下は、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
は、別のスタックからデータをコピーしてデータを生成し、それを 2 つのアイデア間のパフォーマンス比較に使用します。
以下は、素朴なアプローチを使用して特定のスタックから重複を削除するステップです -
以下は、素朴なアプローチを使用して特定のスタックから重複を削除する Java プログラムです -
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())
はスタック内のすべての要素を通過する最初のループを処理し、2 番目のループは です。
resultStack.contains(element)
要素が既に存在するかどうかを確認します。以下は、最適化されたアプローチを使用して特定のスタックから重複を削除する手順です-
以下は、HashSet を使用して指定されたスタックから重複を削除する Java プログラムです -
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
Set 内に一意の要素を格納するには、ランダムな要素にアクセスするときに O(1) の複雑性を利用して、計算コストを削減します。要素が存在するかどうかを確認します。
両方のアプローチを併用する
例
インポート java.util.HashSet; java.util.Randomをインポートします。 java.util.Setをインポートします。 java.util.Stackをインポートします。 パブリック クラス DuplicateStackElements { private static Stack
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 要素 |
|
693100 | |||||
135800 | 36456100
|
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3