2017-01-14 11 views
0

で、私は問題を解決していると私はこれだ:依存[セット[INT]] Scalaの

ant : scala.collection.mutable.ListBuffer[Set[Int]] = ListBuffer(Set(), Set(0), Set(0), Set(1), Set(2), Set(1), Set(3,4), Set(5, 6), Set(7)) 

ListBufferでの設定は、例えば、依存関係を表します。ant(1)ですがSet(0)は、ant(1)がAnt(0)のSet()に依存することを意味します。 ant(7)はAnt(5)とant(6)に依存することを意味するSet(5,6)です。

私が必要とするのは、繰り返しのないセット間のすべての依存関係を持つ新しいListBuffer [Set [Int]]です。たとえば、ant(6)はant(3)とant(4)に依存します。 ant(1)とant(4)はant(2)に依存し、ant(1)とant(2)はant(0)に依存するので、antのすべての依存関係(6)である:だから初期ListBufferの結果がでなければなりません(3,4,1,2,0)

セット:それを行うための最善の方法がある

solution : scala.collection.mutable.ListBuffer[Set[Int]] = ListBuffer(Set(), Set(0), Set(0), Set(1,0), Set(2,0), Set(1,0), Set(3,4,1,2,0), Set(5,6,1,3,4,0,2), Set(7,5,6,1,0,4,3,2)) 

ありがとうございました。

+0

間違ったデータ構造を使用している場合は、代わりにツリーを使用する必要があります。 –

+0

@Mr Dおそらく、 'tree'ではなく' graph'という単語を探しています。 –

+0

だから、この構造では不可能ですか? – KonaKona

答えて

1

これは間違いなく、表現しようとしているデータ構造が間違っています。あなたが求める結果を得るには、データ構造そのものよりも複雑なステップの苦労を経なければなりません。

ここから始めます。

import collection.mutable.ListBuffer 
val ant: ListBuffer[Set[Int]] = ListBuffer(Set(), Set(0), Set(0), Set(1), Set(2), 
              Set(1), Set(3,4), Set(5, 6), Set(7)) 

ここで、現在の依存関係のそれぞれにサブ依存関係を追加する必要があります。これらはIntSetであるため、表示順は関係ありません。

ant.map(_.flatMap(x => ant(x) + x)) 
// ListBuffer(Set(), Set(0), Set(0), Set(0, 1), Set(0, 2), Set(0, 1), Set(1, 3, 2, 4), Set(5, 1, 6, 3, 4), Set(5, 6, 7)) 

新しい結果が以前の結果と同じになるまで、これを繰り返す必要があります。 Streamイテレータは繰り返しを設定し、各要素は前のものと異なります。dropWhile

// a ListBuffer Stream 
val lbStrm: Stream[ListBuffer[Set[Int]]] = 
    Stream.iterate[ListBuffer[Set[Int]]](ant)(_.map(_.flatMap(x => ant(x) + x))) 

// grab the first one after the results settle 
lbStrm.zipWithIndex.dropWhile{case (lb,x) => lb != lbStrm(x+1)}.head._1 
// ListBuffer(Set(), Set(0), Set(0), Set(0, 1), Set(0, 2), Set(0, 1), Set(0, 1, 2, 3, 4), Set(0, 5, 1, 6, 2, 3, 4), Set(0, 5, 1, 6, 2, 7, 3, 4)) 

わかりませんが、実行可能です。その開始データ構造を再設計する方がはるかに良いでしょう。

関連する問題