【问题标题】:Two hash tables with same key vs a combined hash具有相同键的两个哈希表与组合哈希
【发布时间】:2019-05-03 17:42:33
【问题描述】:

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

/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() 调用,另一个需要一个调用,但由于散列、空间等原因可能不是首选……此外,设计方面,没有限制。

【问题讨论】:

  • dir_owners_and_dependencies 的第二个类型参数真的需要是向量吗?听起来这些向量总是包含两个项目(一个所有者向量和一个依赖向量),在这种情况下,将向量存储在向量中是多余的;您可以改用tuple、数组或类/结构(其中包含两个向量)。
  • @TedLyngmo 会的。它更像是一个 CS 问题而不是编程。但 C++ 始终是一个不错的选择。
  • @JeremyFriesner 是的。明确包含不同的所有者和部门以供以后使用。一个目录可能依赖于许多其他目录。
  • @KyleDickson 它仍然不是最小的、完整的和可验证的。尝试从这里复制你自己的代码并编译它。

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


【解决方案1】:

回答您的问题:

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

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

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

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

然后你的地图变成:

unordered_map<string, directory> directories;

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

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

【讨论】:

  • 当然。我更感兴趣的是了解性能而不是实施。你有什么想分享的吗?
猜你喜欢
  • 2018-02-12
  • 1970-01-01
  • 2021-05-14
  • 2016-03-11
  • 2020-11-16
  • 1970-01-01
  • 1970-01-01
  • 2011-06-09
  • 2014-09-14
相关资源
最近更新 更多