【问题标题】:Counting ones in a set of "binary strings" (Python)在一组“二进制字符串”中计算一个(Python)
【发布时间】:2019-08-05 21:43:03
【问题描述】:

我有一大组(100 000)二进制字符串(固定长度 k),如下所示: “011100001111000010”、“111011011110000100”等。一些二进制字符串包含前导零。 我想获得一个长度为 k 的列表 L 使得 a[i] = 在第 i 个位置具有 1 的二进制字符串的数量。例如:

输入:

"1011"
"0111"
"0111"

输出:

[1,2,3,3]

由于二进制字符串的数量非常大(100000+)并且 k 大约为 100,因此使用嵌套的 for 循环似乎非常低效。解决这个问题的最有效(或至少更有效)的方法是什么?

【问题讨论】:

    标签: python string loops for-loop binary


    【解决方案1】:

    没有比循环每个字符至少一次更快的方法了,因为您必须查看每个字符才能知道要为每个字符串递增哪些计数器。唯一不正确的情况是,如果您对字符串的特征有一些先验额外的知识(即,如果它们是根据某种顺序排序的,等等)。

    所以你必须使用 2 个循环:一个循环遍历所有字符串,一个内部循环遍历当前字符串中的所有字符。如果字符串的第 i 个字符为 1,则只需增加第 i 个计数器。

    编辑:注意问题是embarrassingly parallel,所以很容易使用线程来并行化它。尽管它不会使其渐近更快,但您可能可以通过 CPU 支持的并发线程数来加速它。请注意,对于不熟悉它的人来说,高效的多线程编程绝非易事。

    【讨论】:

    • 感谢您的回复。我知道我需要以某种方式检查所有字符 - 但是我不确定使用 2 个简单的 for 循环是否是最佳选择。也许最好将所有字符串转换为 numpy 数组,然后简单地将它们全部相加。
    • @BGa 即使您这样做了,也不会改变每个字符串的每个字符(或位)都必须访问一次这一事实。所以你仍然有一个 O(N·k)asymptotic complexity,其中 N 是字符串的数量,而 k 是字符串的长度.请注意,在复杂性理论中,O(n)O(1000n + 10000) 相同,因为常数因素被简单地忽略了。
    猜你喜欢
    • 2014-12-25
    • 1970-01-01
    • 2017-04-05
    • 1970-01-01
    • 2015-08-22
    • 2023-01-18
    • 2021-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多