- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
Pi = 3.14159 26 5358979323846 26 433...所以要重复的第一个 2 位子串是 26。
找到要重复的前 20 位子字符串的有效方法是什么?
我有大约 500 GB 的 Pi 数字(每个数字 1 个字节)和大约 500 GB 的可用磁盘空间。
我有大约 5 GB 的可用 RAM。
我对一种适用于任意序列的高效算法感兴趣,而不是对 Pi 本身的特定答案感兴趣。换句话说,我对“打印 123....456”形式的解决方案不感兴趣,即使它打印的数字是正确的。
我将每个子字符串放入哈希表并报告第一次冲突。
(哈希表是一个排序好的链表数组,数组中的索引由字符串的底部数字给出(转换为整数),每个节点存储的值是在数组中的位置在子串第一次出现的地方展开 Pi。)
在我用完 RAM 之前,这一切正常。
我考虑过要扩展到更长的序列:
为从特定范围开始的所有子字符串生成散列,然后继续搜索其余数字。这需要为每个范围重新扫描 Pi 的整个序列,因此变成阶数 N^2
将 20 位子字符串集合分桶排序到多个文件,然后使用哈希表分别查找每个文件中的第一个重复项。不幸的是,使用这种方法我用完了磁盘空间,因此需要 20 次遍历数据。 (如果我以 1000 位数字开始,那么我将以 1000 个 20 位数字的子字符串结束。)
每字节存储 2 位 Pi 以释放更多内存。
将基于磁盘的后备存储添加到我的哈希表。我担心这会表现得很差,因为没有明显的引用位置。
有没有更好的方法?
我尝试了 Adrian McCarthy 的 qsort 方法,但这似乎比查找重复项的散列法要慢一些
我查看了 btilly 关于并行化算法的 MapReduce 建议,但它在我的单台计算机上受到严重 IO 限制,因此不适合我(使用我的单磁盘驱动器)
昨晚我实现了supercat的方法来拆分文件,并在前180亿位中搜索19位子串。
这找到了 16 个匹配,所以我使用 Jarred 的建议重新检查 19 个数字匹配以找到第一个 20 个数字匹配
搜索 180 亿个数字拆分文件需要 3 小时,然后重新扫描文件以查找匹配项需要 40 分钟。
20 位子字符串 84756845106452435773 位于 Pi 的十进制扩展中的位置 1,549,4062,637 和 17,601,613,330。
非常感谢大家!
最佳答案
这是一个有趣的问题。
首先让我们做一些信封背面的数字。任何特定的 20 位数字序列将在 1020 中匹配一次。如果我们走到第 n 个数字,我们大约有 n2/2 对 20 位数字序列。因此,为了有很大的机会找到匹配项,我们可能需要让 n 略高于 1010。假设每条记录占用 40 个字节,我们将需要大约 400 GB 的数据。 (我们实际上需要比这更多的数据,所以我们应该为超过 1 TB 的数据做好准备。)
这让我们了解了所需的数据量。百亿位数。数百 GB 的数据。
问题来了。如果我们使用任何需要随机访问的数据结构,随机访问时间由磁盘速度设置。假设您的磁盘以 6000 rpm 的速度运行。那是每秒 100 次。平均而言,您想要的数据位于磁盘的一半位置。所以你平均每秒得到 200 次随机访问。 (这可能因硬件而异。)访问它 100 亿次将花费 5000 万秒,也就是一年多的时间。如果您先读再写,最后需要 200 亿个数据点 - 您已经超出了硬盘驱动器的预计使用生命周期。
另一种方法是以不随机访问的方式处理一批数据。经典的做法是进行良好的外部排序,例如合并排序。假设我们有 1 TB 的数据,我们在排序期间读取了 30 次,写入了 30 次。 (两个估计都高于需要,但我在这里描绘了最坏的情况。)假设我们的硬盘驱动器具有 100 MB/s 的持续吞吐量。然后每次通过需要 10,000 秒,共 600,000 秒,略低于一周。这是非常可行的! (实际上它应该比这更快。)
算法如下:
这很好,但如果我们不想花一周时间怎么办?如果我们想向它扔多台机器怎么办?事实证明这非常容易。有众所周知的分布式排序算法。如果我们将初始文件分成 block ,我们可以并行执行第 1 步和第 4 步。如果在第 4 步之后我们没有找到匹配项,那么我们可以使用更大的输入 block 从头开始重复。
其实这种模式很常见。真正不同的是将初始数据转换为要排序的内容,然后查看匹配的组。这是 http://en.wikipedia.org/wiki/MapReduce算法。这将很好地解决这个问题。
关于algorithm - 有效地计算在 Pi 的十进制扩展中重复的前 20 位子串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10197317/
我收到未知数据,我想以编程方式查看相关性,并将所有完全相关的变量组合在一起(忽略方向)。在下面的数据集中,我可以手动查看相关性并说 a, f, g, h一起去吧b, d, e .我怎样才能以编程方
这个问题在这里已经有了答案: use dplyr's summarise_each to return one row per function? (3 个答案) 关闭 4 年前。 作为探索性工作的
我想要完成的是使用数组存储未知大小的多项式。我在互联网上看到的是使用一个数组,每个单元格都包含系数,度数是单元格编号,但这不是有效的,因为如果我们有一个多项式,如:6x^14+x+5。这意味着我们将从
嘿伙计们,我一直在尝试解析 HTML 文件以从中抓取文本,但时不时地,我会得到一些非常奇怪的字符,例如 à€œ。我确定是“智能引号”或弯头标点符号导致了我的所有问题,因此我的临时修复是搜索所有这些字符
我原来的 data.table 由三列组成。 site、observation_number 和 id。 例如以下是 id = z 的所有观察结果 |site|observation_number|i
"Premature optimisation is the root of all evil (but it's nice to have once you have an ugly solutio
给定这个数组 X: [1 2 3 2 3 1 4 5 7 1] 和行长度数组R: [3 2 5] 表示转换后每行的长度。 我正在寻找一个计算效率高的函数来将 X reshape 为数组 Y: [[ 1
我有一些 data.frame s: # Sample data a <- data.frame(c(1:10), c(11:20)) names(a) <- c("A", "B") b <- dat
我有点困惑。列表擅长任意位置插入,但不善于随机访问? (怎么可能)如果你不能随机访问,你怎么知道在哪里插入? 同样,如果你可以在任何位置插入,为什么你不能从那个位置高效地读取? 最佳答案 如果您已经有
我有一个向量,我想计算它的移动平均值(使用宽度为 5 的窗口)。 例如,如果有问题的向量是[1,2,3,4,5,6,7,8],那么 结果向量的第一个条目应该是 [1,2,3,4,5] 中所有条目的总和
有一个随机整数生成器,它生成随机整数并在后台运行。需求设计一个API,调用时返回当时的簇数。 簇:簇是连续整数的字典顺序。例如,在这种情况下,10,7,1,2,8,5,9 簇是 3 (1,2--5--
我想做的是将一组 (n) 项分成大小相等的组(大小为 m 的组,并且为简单起见,假设没有剩余,即 n 可以被 m 整除)。这样做多次,我想确保同一组中的任何项目都不会出现两次。 为了使这稍微更具体一些
假设我有一些包含类型排列的模板表达式,在本例中它们来自 Abstract Syntax Tree : template
我已经在这方面工作了几天,似乎没有我需要的答案。 由于担心这个被标记为重复,我将解释为什么其他问题对我不起作用。 使用 DIFFLIB for Python 的任何答案都无助于我的需求。 (我在下面描
我正在使用 NumPy 数组。 我有一个 2N 长度向量 D,并希望将其一部分 reshape 为 N x N 数组 C. 现在这段代码可以满足我的要求,但对于较大的 N 来说是一个瓶颈: ``` i
我有一个问题: 让我们考虑这样的 pandas 数据框: Width Height Bitmap 67 56 59 71 61 73 ...
我目前正在用 C 语言编写一个解析器,设计它时我需要的东西之一是一个可变字符串“类”(一组对表示实例的不透明结构进行操作的函数),我将其称为 my_string。 string 类的实例只不过是包装
假设我在 --pandas-- 数据框中有以下列: x 1 589 2 354 3 692 4 474 5 739 6 731 7 259 8 723
我有一个成员函数,它接受另一个对象的常量引用参数。我想 const_cast 这个参数以便在成员函数中轻松使用它。为此,以下哪个代码更好?: void AClass::AMember(const BC
我们目前正在将 Guava 用于其不可变集合,但我惊讶地发现他们的 map 没有方法可以轻松创建只需稍作修改的新 map 。最重要的是,他们的构建器不允许为键分配新值或删除键。 因此,如果我只想修改一
我是一名优秀的程序员,十分优秀!