2013-04-04 6 views
8

の時刻の最高値をJavaのTreeSetで削除する場合は、treeSet.pollFirst()を使用します。これはScalaのmutable.TreeSetクラスに相当するものですか?ScalaのTreeSetとJavaのTreeSet - poll?

とにかく、私が実際に望むのは、removeMaxaddupdatePriorityを対数時間で表示できるヒープのような優先順位キューのデータ構造です。 mutable.PriorityQueueは対数時間でdeque(すなわちremoveMax)を私に許可していますが、ログ時に優先順位を更新する方法はありません(私はひっくり返ってスキャンしてアイテムを削除してから再追加する必要があります)線形時間)。同様にmutable.TreeSetは、対数時間で(ハックリ削除と再追加による)優先順位を更新することができますが、removeMax(つまりpollFirst)の操作はありません。どのコレクションコンテナを使用する必要がありますか?私は外部の依存関係を参照しないでください。

+0

'updatePriority'はJavaの' TreeSet'でどのように動作すると思いますか? – sharakan

+0

簡単(匿名クラスでTreeSetをオーバーライドして外部コンパレータを定義したと仮定します)。ノードを削除して追加するだけです。私の例を見てください。ここの行19と行33-36を見てください:https://github.com/pathikrit/scalgos/blob/master/temp/SandBox/AStar.java – pathikrit

+1

右は意味があります。ノードを更新する前に削除する必要があります。 – sharakan

答えて

3

あなたはO(log n)あるimmutable.TreeSetheadlast方法を、使用することができます。 mutable.TreeSetにも同じメソッドがありますが、効率を上げ、時間を償却するためにオーバーライドされていません(Scala 2.10)。 headメソッドは対数ですが、そのときイテレータをインスタンス化することができます。 lastメソッドは、それを実際にトラバースし、線形の複雑さを持ちます。良いお知らせは、カスタムOrderingで最小または最大のものを制御でき、Ordering.reverseと呼んで既存のOrderingから簡単に取得できることです。

この要素を削除する必要がある場合は、単に-=を使用してください。独自の暗黙的な値クラスを作成して、pollFirstメソッドをツリーセットにピギーバックすることができます。

implicit class MyExtensions[T](ts: mutable.TreeSet[T]) extends AnyVal { 
    def pollFirst(): T = { 
    val elem = ts.head 
    ts -= elem 
    elem 
    } 
} 
+0

headとlastは 'peekFirst'と' peekLast'に相当します - 私が望むのは** poll '** – pathikrit

+0

' TreeSet'の要素を特定した後、それを ' - ='で取り除くのは簡単です。 – axel22

+0

ああ、それは単純な 'pollLast'よりかなり醜いです – pathikrit

1

だけではなく、提案:)それを使用する、JavaのTreeSetのは、あなたのために働くので、もしあなたが:) JVMにコンパイル場合は、ウェル(スカラ座からのJavaライブラリにアクセスできることを覚えておいてください答え、:)

要件を明確にすることもできます。あなたのupdatePriorityメソッドのパラメータは何ですか?あなたの優先順位を更新しようとしていますか?

関連する問題