内存不足【分而治之算法】
Out of memory [divide and conquer algorithm]
所以我有一个 foo table,它很大,每当我尝试从中读取所有数据时 table Node.JS 都会出现内存不足错误!但是,您仍然可以通过设置偏移量和限制来获取数据块;但是我又一次无法合并所有的块并将它们保存在内存中,因为我 运行 再次内存不足!在我的算法中,我有很多 id,需要检查每个 id 是否存在于 foo table 中;当我无法将所有数据都放在内存中以查看 foo table 中是否存在 id 时,最佳解决方案是什么(就算法复杂性而言)?
PS:天真的解决方案是获取数据块并逐块查看每个 id 的块;但复杂度是 n 的平方;我相信应该有更好的方法...
您可以对您的 ID 进行排序,并将它们分成块。然后你可以在每个块中保留值的内存范围 - (lowestId,highestId) for that chunk.
使用内存二分查找可以快速找到可能包含的chunk(如果有的话)id,然后将那个特定的chunk加载到内存中进行二分查找。
两者的复杂度都应为 LogN。一般来说,阅读二分查找算法。
"PS: The naive solution is to get chuncks of data and see chunck by chunck for each id; but the complexity is n squared; there should be a better way I believe..."
假设您可以将整个 table 加载到您的内存中。在任何情况下,您都需要检查每个 ID 是否在数据库中。没有什么比比较更好的了。
话虽如此,我想到了哈希 table。假设 ID 是整数,并且是随机选择的。您可以通过最后两位数字(或与此相关的前两位数字)散列您需要检查的 ID。然后检查你记忆中的项目会更快。
在您指定的约束条件下,您可以创建一个散列 table,其中包含您要查找的 ID 作为键,所有值都初始化为 false。
然后,逐块读取 table 块,并针对 table 中的每个项目,在散列 table 中查找它。如果找到,请将散列 table 条目标记为 true。
完成所有块后,您的散列 table 将保存在 table 中找到的 ID 的真值。
假设hash table lookup的时间复杂度是固定的,那么这个算法的时间复杂度是O(N)。
所以我有一个 foo table,它很大,每当我尝试从中读取所有数据时 table Node.JS 都会出现内存不足错误!但是,您仍然可以通过设置偏移量和限制来获取数据块;但是我又一次无法合并所有的块并将它们保存在内存中,因为我 运行 再次内存不足!在我的算法中,我有很多 id,需要检查每个 id 是否存在于 foo table 中;当我无法将所有数据都放在内存中以查看 foo table 中是否存在 id 时,最佳解决方案是什么(就算法复杂性而言)?
PS:天真的解决方案是获取数据块并逐块查看每个 id 的块;但复杂度是 n 的平方;我相信应该有更好的方法...
您可以对您的 ID 进行排序,并将它们分成块。然后你可以在每个块中保留值的内存范围 - (lowestId,highestId) for that chunk.
使用内存二分查找可以快速找到可能包含的chunk(如果有的话)id,然后将那个特定的chunk加载到内存中进行二分查找。
两者的复杂度都应为 LogN。一般来说,阅读二分查找算法。
"PS: The naive solution is to get chuncks of data and see chunck by chunck for each id; but the complexity is n squared; there should be a better way I believe..."
假设您可以将整个 table 加载到您的内存中。在任何情况下,您都需要检查每个 ID 是否在数据库中。没有什么比比较更好的了。
话虽如此,我想到了哈希 table。假设 ID 是整数,并且是随机选择的。您可以通过最后两位数字(或与此相关的前两位数字)散列您需要检查的 ID。然后检查你记忆中的项目会更快。
在您指定的约束条件下,您可以创建一个散列 table,其中包含您要查找的 ID 作为键,所有值都初始化为 false。
然后,逐块读取 table 块,并针对 table 中的每个项目,在散列 table 中查找它。如果找到,请将散列 table 条目标记为 true。
完成所有块后,您的散列 table 将保存在 table 中找到的 ID 的真值。
假设hash table lookup的时间复杂度是固定的,那么这个算法的时间复杂度是O(N)。