在Scala中实现霍夫曼算法并将结果写入文件后,我正在构建解码器。为此,我需要将我从文件中读取的List[Char]
转换为包含每个单独位的List[Boolean]
。因为它是一个大文件,我需要以最快的方式做到这一点。
我目前有以下算法:
def uncompress(fileString : String, fileChars : List[Char]) : String = {
var bools:List[Boolean] = List[Boolean]()
fileChars.foreach(f => bools = bools ++ byte2Bools(f))
}
def byte2Bools(b: Char): Seq[Boolean] =
0 to 7 map isBitSet(b)
def isBitSet(byte: Char)(bit: Int): Boolean =
((byte >> bit) & 1) == 1
但是,在600KB文件上完成此算法需要30多分钟!此外,我不确定是否可能在创建此算法时犯了一些错误。
如何才能提高性能?
答案 0 :(得分:2)
fileChars.flatMap(byte2Bools)
会更快地将List[Char]
转换为List[Boolean]
。
但是将List
与原始类型一起使用已经意味着你有大量的内存开销,对于Boolean
来说更是如此。我将String
用于字符,Array[Boolean]
或BitSet
用于比特(因为您事先知道长度)。当然,这会使代码更复杂......