对于内射函数,boost :: bimap是否过度杀伤?

时间:2018-04-26 21:54:59

标签: c++ data-structures bimap boost-bimap

设T_1和T_2为两种类型,f:Dom(T_1) - > Dom(T_2)是一个不是双射的内射函数;并且为了讨论的缘故,假设我将f表示为不同的对而不是用于计算它的代码。现在,我需要能够相对快速地应用f和f ^ { - 1},所以我想到了每个方向的地图。然后我想到我可能想要这两个地图的数据结构 - 因为我有多个这样的f。#。

我自然而然地认为"嗯,我确定Boost必须有类似的东西",实际上,Boost有一个Bimap结构。问题是,那个是用于一般的二元关系;此外,它必须考虑重复插入的可能性,而不是每次都重新优化结构,而在我的情况下,我只插入一次,然后进行多次查找。所以,我觉得bimap可能对我来说有点矫枉过正,并且对我的用例没有优化。这是真的吗?

注意:

  • 我对时间复杂度(和实际时间)感兴趣而牺牲了空间。
  • 非内射f的相同问题(f ^ { - 1}是非函数关系)。

1 个答案:

答案 0 :(得分:0)

正常的C ++容器行为(通过您对对象大小的提示加强)是存储每个键和值(这些概念仅在非内蕴情况下是不同的)仅一次。单独的插入和查找阶段建议连续存储(对于缓存局部性,如果没有别的话)。 “以空间为代价的时间”表示您需要哈希表

因此,存储一个pair<T1,T2>数组和一对低负载因子open-addressed哈希表,将键和值(分别)映射到数组中的索引。这些中的每一个都只是一个索引数组(或者在分配(完整)数组后计算的指针),并且具有良好的缓存性能。

非单射案例

按(非唯一)T2值对对进行排序(或至少分组),并将散列表(对于每个此类唯一值)存储在开头奔跑。然后可以一起找到所有相应的T1个对象(在第一个不同的T2或数组的末尾停止。)

如果有许多T2==对象且可互换,则可以存储pair<T1,index>pair<T2,index>的单独数组,每个如上所述将指数存储到另一个。然后两个哈希表中的每个条目都将索引存储到T1数组中,因为在哈希查找和对中的T2对象之后始终需要检查相等性的密钥可以从T1旁边存储的索引中立即明确地获取。