2016-04-16 18 views
0

C++では、オブジェクトをリンクリストに格納することがありました。オブジェクトをその位置を指すイテレータに関連付けます。次に、イテレータを指定すると、O(1)時間にリンクリストからオブジェクトを削除できます。リストは、リスト内の前後の要素へのポインタを更新するだけなので、操作はO(1)です。私が話しているC++メソッド:http://www.cplusplus.com/reference/list/list/erase/O(1)のリンクリストから要素を削除する - Java対C++

Javaで同じO(1)の複雑さでこれを行う方法はありますか?

LinkedListのは、後続の要素をシフトするようだ:https://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html#remove(int)

多分これを達成するために別のJavaクラスはありますか?

おかげ

+1

速度が心配な場合は、リンクリストを慎重に使用してください。確かに、あなたは簡単に挿入して削除することができますが、あなたがしているすべてのものは価格があります。時にはかなり重い。一つは、それらのリンクされたリストの要素が本当に悪い地域を作る場所にあります。予測とキャッシュのCPU能力は、泥棒に入ります。 – user4581301

答えて

3

標準ライブラリLinkedListは、あなたがこれを行うことはできません。 remove(int)は要素をシフトする必要はありませんが、を検索すると、削除するリストノードがであり、リニアな時間がかかります。イテレータは使用できますが、Javaイテレータの無効化はC++イテレータの無効化よりもはるかに積極的です。その要素に配置されたイテレータを介して1つの要素を削除した後、他のイテレータは無効になります。

あなたはおそらくあなた自身のLinkedListクラスを書く必要があります。

+0

シフト要素では、削除された要素の後に要素をループし、リスト内のインデックスをデクリメントすることを意味しました。私はそれもリストをループして削除する位置に行くことを忘れていました。実際には、リスト全体をループします。イテレータを使うことができたらどういう意味ですか?カスタムLinkedListがなければ、私はあなたができるとは思わない。 編集:イテレータの削除メソッドについて話していたかもしれません。 – walter2011

+0

@ walter2011: "削除された要素の後ろの要素をループし、リスト内のインデックスを減らすことを意味しました。ノードはそのインデックスを明示的にトラッキングしないため、調整するノードごとのインデックスデータはありません。イテレータの使用に関しては、実際にイテレータの 'remove'メソッドを意味しました。 – user2357112

+0

私はjavadocをそれほど文字通り解釈していたと思います。それは「後続の要素を左にシフトする(指標から1を引く」)。 – walter2011

0

前と次のポインタを操作するとリンクされたリストでO(n)時間がかかったことは誰も言いませんでした。それはそれをO(n)にする要素を見つけることです。

リスト内の各要素について、これらの「イテレータ」(これは呼び出されないもの)の1つがある場合は、これらの「イテレータ」の各要素を調べる必要がありますリスト内の任意のランダムなオブジェクトに対してこれはO(n)操作です。

正しいオブジェクトが見つかると、前と次の要素の更新は要素の数に依存しないため、言語に関係なくO(n)になります。

0

イテレータを使用してアイテムを見つけたら、remove()を呼び出してO(1)の要素を削除できますが、これはリストを変更していないか、同時更新をサポートするリストを使用している場合にのみ有効です。