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

时间:2010-01-14 03:40:45

标签: optimization storage

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

“磁带上有10 GB的32位数字,从0到10G都是随机顺序。你有64位32位字的可用内存:设计一种算法来检查每个0到10G的数字是否出现一次并且只有一次在录像带上,通过连接到算法的读头最少通过录像带。“

6 个答案:

答案 0 :(得分:1)

这是一个棘手的问题,正如Michael Anderson和我已经想到的那样。您不能在10G磁带上存储10G 32b号码。面试官(a)正在弄乱你,(b)在你开始解决问题之前试图找出你对问题的看法。

答案 1 :(得分:1)

32位数字可以采用4G = 2 ^ 32个不同的值。磁带总数上有2.5 * 2 ^ 32个数字。因此,在2 ^ 32计数之后,其中一个数字将重复100%。如果磁带上有< = 2 ^ 32个数字,则有可能存在两种不同的情况 - 当所有数字不同或至少重复一次时。

答案 2 :(得分:0)

使用磁带进行存储,执行就地mergesort或quicksort?然后按顺序遍历数字,跟踪以查看每个数字=前一个+ 1。

需要巧妙地实现排序,并且相当慢,但实现了我相信的目标。

编辑:哦,开玩笑,从来没有指明你可以写。

这是第二种方法:通过尝试构建多达30个范围的连续数字进行扫描。 IE 1,2,3,4,5将是一个范围,8,9,10,11,12将是另一个范围,等等。如果范围与现有范围重叠,则它们将合并。我认为你只需要制作有限数量的通行证来获得完整的范围或者证明存在间隙......远远不只是扫描几千块以查看是否所有数字都存在。

但是我需要一点时间来证明或反驳这种限制。

答案 3 :(得分:0)

完全天真的算法,需要尽可能多的通过,以检查数字,将走过并验证最低数字是否存在。然后再次检查下一个最低点是否存在。等等。

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

你可以通过使用部分字词来进一步减少它 - 假设你的每个片段的搜索空间较小,你就不需要跟踪完整的32位范围。

答案 4 :(得分:-1)

对数字进行2 reduce s,求和和按位异或。

总和应为(10G + 1)* 10G / 2
异或应该......某事

答案 5 :(得分:-1)

看起来问题中有一个问题,到目前为止还没有人谈过这个问题;面试官只要求受访者写一个CHECKS

的程序

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

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

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

我认为面试官的意图可能只是看到受访者如何处理问题,而不是实际从受访者那里提取出有效的解决方案;谁买这个概念?

此致 桑巴