我想知道(以下)哪种实现会在时间和空间上给我带来更好的性能。假设我具有以下目录结构。
/dir1
OWN={root,usr}
/dir2
DEP={dir1}
OWN={usr}
我一次遍历“ ./”中的所有目录,其中每个目录都有一个所有者文件,并且可能有一个依赖文件。我阅读了他们的内容并构建了哈希表。
#include <iostream>
#include <unordered_map>
using namespace std;
int main(int argc, char** argv){
unordered_map<string, vector<string>> dir_ownerss;
// /dir1 --> [root, usr]
// /dir2 --> [usr]
unordered_map<string, vector<string>> dir_dependenciess;
// /dir1 --> [dir2]
unordered_map<string, vector<vector<string>>> dir_owners_and_dependenciess;
// /dir1 --> [ [/dir1, root, usr] [/dir2, usr] ]
// /dir2 --> [ [/dir2, usr] ]
return 0;
}
此程序之后,我将进行一些查找或find()操作以检查所有权和依赖项。由于哈希运算平均为O(1),因此按顺序排列,我看不出任何区别。一个需要两个find()调用,另一个需要一个调用,但由于哈希,空间等原因可能不是首选。此外,从设计角度来看,没有限制。
答案 0 :(得分:0)
要回答您的问题:
当然,查找所需的全部为O(1),内存所需的全部为O(n),但是两个映射占用的内存是原来的两倍。两倍的查询花费两倍的时间。
我认为使用一个以类为值的单个地图会更好。 (请原谅语法; C ++不是我每天都在工作的东西。)
class directory {
vector<string> owners;
vector<string> dependencies;
}
然后您的地图变为:
unordered_map<string, directory> directories;
因此,如果您想了解有关特定目录的某些信息,请在地图中查找该目录。您可以立即访问所有者和依赖项。没有理由为每个不同的属性都有单独的地图。
使用存储类的单个映射的另一个好处是:它简化了代码。那总是一件好事。