具有相同键的两个哈希表与组合哈希

时间:2018-12-02 01:54:18

标签: c++ hash stl hashtable unordered-map

我想知道(以下)哪种实现会在时间和空间上给我带来更好的性能。假设我具有以下目录结构。

/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()调用,另一个需要一个调用,但由于哈希,空间等原因可能不是首选。此外,从设计角度来看,没有限制。

1 个答案:

答案 0 :(得分:0)

要回答您的问题:

  1. 多个O(1)查找将比单个O(1)查找更昂贵。添加或删除项目时,更新多个地图也需要花费更多时间。
  2. 存储键等对于地图来说有一定的开销。使用一张地图,您只需支付一次开销。使用多张地图,您需要支付多次。

当然,查找所需的全部为O(1),内存所需的全部为O(n),但是两个映射占用的内存是原来的两倍。两倍的查询花费两倍的时间。

我认为使用一个以类为值的单个地图会更好。 (请原谅语法; C ++不是我每天都在工作的东西。)

class directory {
    vector<string> owners;
    vector<string> dependencies;
}

然后您的地图变为:

unordered_map<string, directory> directories;

因此,如果您想了解有关特定目录的某些信息,请在地图中查找该目录。您可以立即访问所有者和依赖项。没有理由为每个不同的属性都有单独的地图。

使用存储类的单个映射的另一个好处是:它简化了代码。那总是一件好事。