【发布时间】:2016-04-18 19:18:50
【问题描述】:
我在 Scala 中编写了一个霍夫曼压缩/解压缩。解码小文件时需要几秒钟,但解码大文件时需要很长时间。关于如何加快此过程的任何建议?
def lookup(list:List[Int],list2:List[(Char,List[Int])]): Option[String]={
val mutableListBuffer = scala.collection.mutable.ArrayBuffer(list2: _*)
var option:Option[String]= None
for(i <- 0 until mutableListBuffer.length){
if(mutableListBuffer(i)._2 == list){
option = Some(mutableListBuffer(i)._1.toString)
}
}
option
}
/*
*Decode function for matching groups of bits in a list to characters in the HCodeMap
*@returns String
*/
def decode(acc:Int,s:String,list:(List[Int],List[(Char,List[Int])])):String ={
var s = ""
var accum = 1
val listp1 = scala.collection.mutable.ArrayBuffer(list._1: _*)
val listp2 = scala.collection.mutable.ArrayBuffer(list._2: _*)
var tupList = (listp1,listp2)
while(!tupList._1.isEmpty){
if(lookup(tupList._1.take(accum).toList,tupList._2.toList).isDefined){
println(accum)
s = s ++ lookup(tupList._1.take(accum).toList,tupList._2.toList).getOrElse("a")
Log.d("MyTAG", "de" + s)
tupList._1.remove(0,accum)
accum = accum - accum + 1
}
else{
accum = accum + 1
}
}
s
}
代码在 Android 设备上执行,因此使用递归不是一个有效的选项,使用不可变列表也不是。任何建议将不胜感激。再次感谢。
【问题讨论】:
-
如果您能解释一下参数是什么,并更详细地命名它们,那将会很有帮助。此外,还有一些奇怪之处 -
acc是第一个解码的 arg,但未使用。真的很难看出代码在做什么。 -
你说得对, acc 是多余的。第二个是要解码的字符串。第三个是一对包含要解码的位列表以及包含字符及其位表示的代码映射。我以更递归的方式拥有它,但不得不重写它,因为由于递归,android 正在报告堆栈溢出错误。
-
你为什么使用
tupList?直接使用底层的listp1和listp2不会做任何事情,只会更清楚。我认为您应该先清理这段代码,然后再担心优化它,...这样可以更清楚地看到可以改进的地方。 -
除非我自己明确创建 tupList,否则我会收到“递归值列表需要类型”错误。
-
递归值列表需要类型 val list = scala.collection.mutable.ArrayBuffer(list: _*)。这就是创建 tupList 变量的原因。我最初使用递归,但在转移到 Android 时出现堆栈溢出错误。
标签: android scala huffman-code