数据结构表示层次结构

时间:2012-01-28 15:35:02

标签: c++ data-structures

我最近有一个面试问题,询问如何用数据结构来表示组织结构。应该有效地查询列出管理员下所有员工的查询。

我正在回答一个N路树的路线,虽然我不太确定应该是什么关键以及如何实现它。很想知道最好的方法是什么。

2 个答案:

答案 0 :(得分:1)

具有adjacency list表示的定向图似乎是最佳解决方案。

答案 1 :(得分:0)

你有一个选择 - 自定义容器对于这个确切的需求稍微更高效,或者确定哪些STL容器会做得非常好。在一次采访中,我肯定会开始说 - “让我们探讨一下STL容器会做什么,然后看看是否存在效率低下(无论是在可扩展性方面还是在支持并发性方面)为自定义容器辩护”。

因此,通常每个员工都有一个唯一的employee_id。您希望能够使用该ID搜索员工,并且可能通过名称搜索,并获得相当快的结果。因此,如果您想要快速任意插入/删除,您可以将员工ID的std :: map或unordered_map(C ++ 11)用于员工姓名和其他详细信息,并使用另一个从name到employee_id的映射。如果数据没有(经常)改变,则其中一个或两个都可以是一个有序向量 - 更好的打包和内存/缓存效率,但仍然允许O(log2n)查找。在给定基本模型的情况下,我们可以通过让每个员工对象包含其经理的employee_id以及直接报告的employee_id向量来扩展它以反映员工之间的关系。由于直接报告的数量不太可能太大,因此矢量非常实用。这确实意味着列出所有员工,你必须“走树”直接报告和他们的直接报告等,但这相当高效,与冗余记录针对每个员工的所有直接和间接报告相比,节省了大量内存。

很可能,上面的STL方法将满足您的需求。稍微锁定它可以是线程安全的,尽管可能不是最佳性能。尽管如此,当需要更多的可伸缩性,持久性,跨进程事务语义等时,数据可能会更好地转移到商业数据库中,除非您是内存数据库的专家(例如,当我在Bloomberg的Ticker工作时)工厂 - 每秒插入数十万个财务记录 - 我们做了专门的,但很少有人力资源计划需要它。)