【发布时间】:2012-02-24 20:21:26
【问题描述】:
假设您遇到以下问题。您有两个具有一对一映射的索引集。为简单起见,假设您有一个类似 int a [] = {21, 30, 45, 78} 的数组,此列表将 {1, 2, 3, 4} 映射到 {21, 30, 45, 78}。获得反向映射的最有效方法是什么,即给定索引30,您希望算法为45 返回2,您希望3 等等。我可以想到以下几点:
对索引进行二分搜索。这是内存效率高且具有复杂性
O(log n)。拥有一个包含
79元素和reverseMap[21] = 1, reverseMap[30] = 2, reverseMap[45] = 3, reverseMap[78] = 4的数组。这是O(1),因此速度更快,但内存效率不高。
对于我的应用程序来说,内存和速度都很重要。我内存不足,因为这是一个数字运算代码,因此可以处理数亿个点。速度也很重要,因为算法会被多次调用。
我觉得哈希表在这里很有用,但我不太了解它可以发表评论。我很感激对这个问题的任何见解。此外,由于编码是在c++ 中完成的,我希望看到使用STL 而不是外部库的方法。
【问题讨论】:
-
那我相信你在找codereview.stackexchange.com
-
我知道您请求了内部库,但值得研究 boost bimap。 boost.org/doc/libs/1_42_0/libs/bimap/doc/html/index.html
-
哈希是标准的:
std::unordered_map,O(1)-ish,而且内存开销要低得多。 -
@GradGuy:如果向量未排序,则不能使用二分搜索作为反向查找,您必须使用线性搜索,或者也坚持一个排序的版本。
-
@GradGuy:如果您的数组需要快速查找“数以亿计的点”,那么您将需要换一种思路,因为这些数据无法有效地放入内存中。如果这是针对用户程序的,您可能需要重新设计。