- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试寻找一种快速算法来搜索多个位数组的最长前缀。在我的应用程序中,这些位数组可以无限长且长度可变。例如,如果我有那些位数组:
0b1011001
0b1001101
0b1001010
0b1010100
最长的前缀是 10。我目前正在对位数组进行 ORing 和 NAND 运算以找到它们的公共(public) 0 和 1,并将结果一起进行 XORing。
OR
0b1011111
NAND
0b0111111
XOR
0b1100000
有没有更快的解决方案?
最佳答案
它可以很好地(线性)扩展位数组的数量。
它不能很好地缩放位数组的大小,理想情况下它应该根据公共(public)前缀的长度而不是位数组的大小进行缩放。
位数组中的单个字节/字的位操作应该比一次一个地遍历位快得多。 (虽然不确定 Python 能给你多少低级控制)。
如果这是像 C 这样的低级语言,我会以与您类似的方式解决这个问题,但会引用其他答案中的一些想法。
在我的例子中,我假设计算机是一台 64 位机器。
我从 (OR NAND XOR) 开始,只是每个位数组的前 64 位,(这些是 64 位机器上的基本操作,复杂度仅为 O( # of arrays ) )。
然后快速找到结果中第一个设置位的位置,(大多数计算机内置或至少在优化的汇编代码中有一些快速方法,for C,如果有设置位,返回该值.
否则,重复每个位数组的下一个 64-127 位。
(您将需要以某种方式处理不同长度的位数组,可能是通过找到串的最小长度位数组,然后将其用作最大值。)
这种方法的好处是它与位数组的数量成线性关系,并且与公共(public)前缀的长度成线性关系。
如果有大量的位数组,您可以通过使用并行性来提高速度。
首先,您可以在运行 NAND 的同时运行 OR。
您可以更巧妙地应用以下内容:
如果我有 4 个位数组 A,B,C,D
代替(((A或B)或C)或D)
我可以做(A 或 B)或(C 或 D)。
在这两种情况下,完成的 OR 次数相同。
但是第二种方法可以有效地并行化(实际上,在单核机器上采用第二种方法可能会更快,因为 CPU 实际上通常会有多个 ALU。)
写出逻辑有点棘手,因为您不能使用单个 for 循环和单个临时变量来保存 OR 的结果。
您可以想象将子结果存储在一个长度为位数组数量一半的数组中。将 A OR B 的子结果存储在 array[0] 中,将 C OR D 存储在 array[1] 中,然后执行 array[0] OR array[1]。 (您可以将结果存储在长度减半的新数组中,或者覆盖数组中的值以节省空间和内存分配)。
将工作划分为足够大的 block ,以使整个计算机保持忙碌,而不会引入太多开销。
有了足够多的处理器,您就可以接近位数组数量的对数复杂度,而不是线性的。但实际上,在 6 核机器上获得 5 倍的加速可能已经很不错了。
关于python - 查找位数组的最长前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11775932/
我正在尝试编写一个名为 map-longest 的 Clojure 实用函数(感谢备用名称建议)。该函数将具有以下“签名”: (map-longest fun missing-value-seq c1
为什么我创建了一个重复的线程 我在阅读后创建了这个线程 Longest increasing subsequence with K exceptions allowed .我意识到提出问题的人并没有真
我正在编写一个 Sub 来识别 1 到 1000 之间最长的 Collatzs 序列。由于我刚刚开始学习 VBA,我想知道如何添加过程来计算每个序列的长度。 Sub Collatz() Dim i
我正在编写一个 Sub 来识别 1 到 1000 之间最长的 Collatzs 序列。由于我刚刚开始学习 VBA,我想知道如何添加过程来计算每个序列的长度。 Sub Collatz() Dim i
我正在尝试减去 CSV 中的两列以创建第三列“持续时间”结束时间 - 开始时间 每一行也对应一个用户 ID。 我可以创建一个仅包含“持续时间”列的 csv 文件,但我宁愿将其重定向回原始 csv。 例
我在 2018.04 玩这个最长的 token 匹配,但我认为最长的 token 不匹配: say 'aaaaaaaaa' ~~ m/ | a+? | a+ /; # 「a」
因此,按照规范规定最终用户/应用程序提供的给定变量(200 字节)的字节长度。 使用 python 字符串,字符串的最大字符长度是多少,满足 200 字节,因此我可以指定我的数据库字段的 max_le
我需要针对我们的Jenkins构建集群生成每周报告。报告之一是显示具有最长构建时间的作业列表。 我能想到的解决方案是解析每个从属服务器(也是主服务器)上的“构建历史”页面,对于作业的每个构建,都解析该
我正在构建一个 iOS 应用程序,它将流式传输最长为 15 秒的视频。我阅读了有关 HLS 的好文章,因此我一直在对片段大小为 5 秒的视频进行转码。如果视频的第一部分加载时间太长,那么我们可以在接下
docs for Perl 6 longest alternation in regexes punt to Synopsis 5记录 longest token matching 的规则.如果不同的
我是一名优秀的程序员,十分优秀!