Optimization 存储算法问题-用很少的内存验证顺序数据

Optimization 存储算法问题-用很少的内存验证顺序数据,optimization,storage,Optimization,Storage,我在一个“面试问题”网站上发现了这一点,并思考了几天。我会继续搅拌,但我对你们的想法很感兴趣 磁带上10 GB的32位数字,按随机顺序从0到10G排列。您有64个32位的可用内存字:设计一个算法,检查从0到10G的每个数字在磁带上出现一次,并且只出现一次,连接到您的算法的读磁头通过磁带的次数最少使用磁带存储,是否执行就地合并排序或快速排序?然后按顺序遍历这些数字,跟踪以查看每个数字=previous+1 需要巧妙地实现sort,速度相当慢,但我相信可以实现目标 编辑:哦,该死的,从来没有指定你可

我在一个“面试问题”网站上发现了这一点,并思考了几天。我会继续搅拌,但我对你们的想法很感兴趣


磁带上10 GB的32位数字,按随机顺序从0到10G排列。您有64个32位的可用内存字:设计一个算法,检查从0到10G的每个数字在磁带上出现一次,并且只出现一次,连接到您的算法的读磁头通过磁带的次数最少

使用磁带存储,是否执行就地合并排序或快速排序?然后按顺序遍历这些数字,跟踪以查看每个数字=previous+1

需要巧妙地实现sort,速度相当慢,但我相信可以实现目标

编辑:哦,该死的,从来没有指定你可以写。

这里有第二种方法:通过扫描尝试建立多达30个连续数字的ish范围。即1、2、3、4、5将是一个范围,8、9、10、11、12将是另一个范围,等等。如果范围与现有范围重叠,则将其合并。我认为你只需要做有限的传球就可以得到完整的射程或者证明有差距。。。比仅仅扫描几千块来查看是否所有数字都存在要少得多


不过,我需要一点时间来证明或反驳这方面的限制。

最简单的算法是遍历并验证最低的数字是否存在,它需要检查的次数与要检查的数字一样多。然后再做一次,检查下一个最低点是否在那里。等等

这需要一个字的存储空间来跟踪您的位置-您可以通过使用所有64个字来跟踪您在搜索空间中多个不同位置的位置,从而将通过次数减少64倍-在每次通过时检查您当前的所有通过次数。当然,仍然是O(n)通过


通过使用部分单词,您可能可以将其缩减得更多,因为您对每个段的搜索空间较小,因此您不需要跟踪整个32位范围。

do2
reduce
s对数字、求和和和和按位异或

总和应为(10G+1)*10G/2

XOR应该是。。。这是一个诡计多端的问题,正如迈克尔·安德森和我所发现的。您不能在10G磁带上存储10G 32b号码。面试官(a)在和你捣乱,(b)在你开始解决一个问题之前,试图弄清楚你对这个问题想了多少。

这个问题似乎有一个到目前为止还没有人谈论过的陷阱;面试官只要求被面试者写一个检查的程序

(i) 如果构成10G的每个数字出现一次且仅出现一次——如果给定列表中的数字出现多次,受访者应该怎么做?他是否应该假设他应该停止执行程序并抛出异常,或者他应该假设他应该通过删除重复的数字并用另一个数字替换来纠正错误(这实际上可能是一个代价高昂的练习,因为这涉及到对数字集的完全重新排列)?纠正这一点需要执行问题中的第二步,即验证数据是否以尽可能最佳的方式存储,并且需要的传递次数最少

(ii)当受访者被要求仅检查10G重量数据集的数字存储方式是否要求最少的Paas访问这些数字中的任何一个时; 受访者应该怎么做?当他在存储它们的算法中发现问题时,他是否应该停止并抛出异常,或者纠正错误并继续,直到所有元素都以尽可能少的传递顺序排序

如果面试官的意图是要求面试者编写一个算法,在给定64位32位寄存器的情况下,找到可以存储在10GB中的数字的最佳组合;还要编写一个算法,以尽可能最好的方式保存这些选定的数字集,并且访问每个数字所需的传递次数最少;他应该直接问这个,不是吗

我想面试官的意图可能只是想看看被面试者是如何处理问题的,而不是从被面试者那里实际提取一个有效的解决方案;有人会相信这个想法吗

问候,,
Samba

32位数字可以采用4G=2^32个不同的值。磁带上总共有2.5*2^32个数字。因此,在2^32计数后,其中一个数字将100%重复。如果有,哦,混蛋。那么让我来解决这个问题。存储范围最多需要N个数字,而我们只有64个整数。您有2048位,因此您可以一次检查一批2048位。没有那么糟糕,但当你必须进行5242880次传球时,速度仍然相当慢。同样棘手的是,10G的32位数字无法容纳10G字节。从0到10G是(10G+1)个数字。我遗漏了什么吗?(让b->bit,b->byte)现在很晚了,我应该睡觉了,但据我统计,有2^32b个数字,每个数字都需要4B(=32b)存储空间。4B*2^32==16GB。在10GB磁带上?我哪里弄错了?我想海报的意思是“随机顺序从1到10GB”。我想这个问题有错。它要么是40Gb磁带,要么是10G磁带上的2.5G数字。你最好小心求和。。那么溢出呢?在实现方面,我们可以在求和之前先将数字转换为双字,当然,求和也是双字。另一方面,这是一个算法。算法永远不会溢出,实现会溢出;你可以很容易地以65位的长度求和(同样,如果它对所有2^32个整数进行迭代,那么对于每个位模式…00000001,它也对1…11111110进行迭代,其中的一个xor给出了…11111111。这些xor的d中有2^31个是偶数,所以结果都是零)我认为这个答案实际上就是d