使用scala开始的后缀数组

时间:2015-05-06 11:10:01

标签: string scala suffix-array

今天我正在尝试使用scala创建后缀数组。我能够用大量代码完成它但后来我听说可以通过使用压缩和排序仅使用几行来创建它。

我现在遇到的问题是从头开始。我尝试使用二进制搜索和zipWithIndex来创建以下"树"但到目前为止,我还没能创造任何东西。我甚至不知道只使用一条线是否可行,但我敢打赌它是大声笑。

我想做的是从一个单词" cheesecake"是Seq:

b

有人能推动我走正确的道路吗?

4 个答案:

答案 0 :(得分:7)

要生成$(document).on('open.fndtn.offcanvas', '[data-offcanvas]', function () { var off_canvas_wrap = $(this); }); (或任何其他scala.collection.TraversableLike)的所有可能后缀,您只需使用tails方法:

String

如果您需要索引,则可以使用GenIterable.zipWithIndex

scala> "cheesecake".tails.toList
res25: List[String] = List(cheesecake, heesecake, eesecake, esecake, secake, ecake, cake, ake, ke, e, "")

答案 1 :(得分:2)

你正在寻找.scan方法,特别是.scanRight(因为你想从字符串的结尾(即右侧)开始构建,在前一个字符前面(看看你的金字塔底部到顶部))。

引用documentation

  

生成包含应用累积结果的集合   操作员从右到左。

这里的运营商是:

  • 前置当前字符
  • 减少计数器(因为您的第一个元素是"cheesecake".length,倒计时)

所以:

scala> s.scanRight (List[(String, Int)]())
                   { case (char, (stringAcc, count)::tl) => (char + stringAcc, count-1)::tl
                     case (c, Nil) => List((c.toString, s.length-1))
                   }
        .dropRight(1)
        .map(_.head)
res12: scala.collection.immutable.IndexedSeq[List[(String, Int)]] =
           Vector((cheesecake,0),
                  (heesecake,1),
                  (eesecake,2),
                  (esecake,3),
                  (secake,4),
                  (ecake,5),
                  (cake,6),
                  (ake,7),
                  (ke,8),
                  (e,9)
                )

最后的dropRight(0)是删除(List[(String, Int)]())(第一个参数),它作为开始构建的第一个元素(你可以传递最后e个你的字符串并在cheesecak上迭代,但我觉得这样做更容易。)

答案 2 :(得分:1)

一种方法,

"cheesecake".reverse.inits.map(_.reverse).zipWithIndex.toArray

Scala字符串配有有序集合方法,例如reverseinits,后者提供了一组字符串,其中每个字符串都删除了最新字符。

答案 3 :(得分:1)

编辑 - 根据posted之前的suffix问题(来自Purely Functional Data Structures练习,我相信suffix应该/可能包括""空列表,即{{1>} 字符串

scala> def suffix(x: String): List[String] = x.toList match {
     |    case Nil             => Nil
     |    case xxs @ (_ :: xs) => xxs.mkString :: suffix(xs.mkString)
     | }
suffix: (x: String)List[String]

scala> def f(x: String): List[(String, Int)] = suffix(x).zipWithIndex
f: (x: String)List[(String, Int)]

测试

scala> f("cheesecake")
res10: List[(String, Int)] = List((cheesecake,0), (heesecake,1), (eesecake,2), 
            (esecake,3), (secake,4), (ecake,5), (cake,6), (ake,7), (ke,8), (e,9))