我有一大套(100 000)二进制字符串(固定长度k),如下所示: “ 011100001111000010”,“ 111011011110000100”等。某些二进制字符串包括前导零。 我想获得一个长度为k的列表 L ,使得a [i] =在第i个位置具有1的二进制字符串的数量。例如:
输入:
"1011"
"0111"
"0111"
输出:
[1,2,3,3]
由于二进制字符串的数量很大(100000+),并且使用嵌套的for循环k大约为100,所以效率似乎非常低。解决这个问题的最有效方法(或至少更有效的方法)是什么?
答案 0 :(得分:1)
没有比循环遍历每个字符更快的方法了,因为您必须查看每个字符才能知道每个字符串要增加的计数器。唯一不正确的情况是,如果您具有关于字符串特征的先验其他知识(即,如果它们是按照某种顺序排序的,等等)。
因此,您必须使用2个循环:一个循环遍历所有字符串,一个内部循环遍历当前字符串内的所有字符。如果该字符串的第i个字符为1,则只需增加第i个计数器即可。
编辑:请注意,问题是embarrassingly parallel,因此使用线程并行化非常容易。尽管它不会渐近地加快速度,但您可以通过CPU支持的并发线程数来加快速度。只需注意,对于不熟悉它的人来说,高效的多线程编程绝非易事。