私は sschaef のソリューションがとても気に入っていますが、このソリューションと比較してそのソリューションがどれほど効率的であるかを誰かが検討できるかどうか疑問に思っていました:
scala> val str = "ok:ok:k::"
str: String = ok:ok:k::
scala> str.foldLeft(Map[Char,Int]().withDefaultValue(0))((current, c) => current.updated(c, current(c) + 1))
res29: scala.collection.immutable.Map[Char,Int] = Map(o -> 2, k -> 3, : -> 4)
私の解決策は遅いと思います。n 個の合計オカレンスと m 個の一意の値がある場合:
私の解決策:すべてのオカレンスまたは n に折り畳みが残っています。これらの発生ごとに、一度検索して現在のカウントを見つけ、次に更新されたマップを作成します。更新されたマップの作成は一定の時間であると想定しています。
複雑さの合計: n * 2m または O(n*m)
sschaefの解決策:マップをチェックせずにリストにエントリを追加するだけだと仮定しているgroupByがあります(したがって、すべての値について、これは一定時間のルックアップとリストへの追加になります)ので、n. 次に、 mapValues については、おそらく一意の値を反復処理し、各キーのリストのサイズを取得します。各エントリのリストのサイズを取得するのは一定時間であると想定しています。
総複雑度: O(n + m)
これは正しいように見えますか、それとも私の仮定が間違っていますか?