内存不足[分而治之算法]

时间:2015-06-09 14:02:14

标签: node.js algorithm divide-and-conquer

所以我有一个foo表,这是巨大的,每当我尝试从该表读取所有数据Node.JS给我内存错误!但是你仍然可以通过偏移和限制获得数据块;但是我再也无法合并所有的chuncks并将它们放在内存中,因为我再次遇到内存不足!在我的算法中,我有很多id,需要检查每个id是否存在于foo表中;什么是最好的解决方案(在算法复杂性方面)什么时候我不能拥有内存中的所有数据来查看foo表中是否存在id?

PS:天真的解决方案是获取数据块并通过chunck查看每个id的chunck;但复杂性是平方的;我应该有更好的方式......

3 个答案:

答案 0 :(得分:1)

您可以对您的ID进行排序,并将其分解为块。然后,您可以在每个块中保留值的内存范围 - (lowerId,highestId)。

您可以快速找到在内存二进制搜索中使用的块(如果有)id,然后将该特定块加载到内存中并对其进行二进制搜索。

两者的复杂性应该是LogN。一般来说,请阅读二进制搜索算法。

答案 1 :(得分:1)

在您指定的约束下,您可以创建一个包含您要查找的ID的哈希表,并将所有值初始化为false。

然后,按块读取表块,并对表中的每个项目进行查找,在哈希表中查找。如果找到,请将哈希表条目标记为true。

在遍历所有块之后,您的哈希表将为表中的ID找到值true。

假设哈希表查找具有固定的时间复杂度,则该算法的时间复杂度为O(N)。

答案 2 :(得分:0)

" PS:天真的解决方案是获取数据块并通过chunck查看每个id的chunck;但复杂性是平方的;我应该有更好的方式......"

我们假设您可以将整张表加载到您的记忆中。在任何情况下,您都需要检查每个ID,无论它是否在DB中。你不能比比较更好。

话虽如此,脑海中浮现出一个哈希表。假设ID是整数,它们是随机选取的。您可以使用最后两位数字(或前两位)来检查您需要检查的ID。然后检查你记忆中的物品会更快。