在Scala中实现霍夫曼算法后,我现在留下了一个长度超过10.000的位数组。现在我想将这个数组转换为字节,并以尽可能最快的方式将其写入文件。
我目前有以下算法:
val bits = encode(createCodeTree(fileChars))(fileChars)
val string = new StringBuilder
for(List(b1,b2,b3,b4,b5,b6,b7,b8) <- bits.grouped(8)) string.append(bitsToByte(b1,b2,b3,b4,b5,b6,b7,b8))
def bitsToByte(bits : Boolean*) : Char = {
var amount = 0;
for(i <- 1 until bits.length){
amount += (if(bits(i-1)) 1 else 0) * scala.math.pow(2,i).intValue()
}
amount.toChar
}
我想知道是否还有改进的余地(因为我不认为每次创建新列表都非常优化)。另外,我想知道由于在for(List(b1,b2,b3,b4,b5,b6,b7,b8) <- bits.grouped(8))
的列表中使用bits.length%8!=0
,这是否可能导致错误的结果?
答案 0 :(得分:2)
我不知道这是否更快,但它肯定更简洁。
bits.grouped(8)
.map(_.foldLeft(0)((i,b) => (i<<1) + (if(b) 1 else 0)).toChar)
.mkString
我也认为这个bit-&gt; byte-&gt;字符转换更正确。
这假设这些位从左到右是最重要的。如果情况并非如此,则将fold
从.foldLeft(0)((i,b) =>...
更改为.foldRight(0)((b,i) =>...