我们可以使用地图而不是二叉搜索吗?

Can we use maps for searching instead of binary search?

本文关键字:搜索 可以使 地图 我们      更新时间:2023-10-16

Maps 给出 O(1( 查找。我们不能遍历数组一次并构建与其索引(与数组相反(相对应的映射,当我们想要搜索某些东西时,我们可以调用map[VALUE],它将返回索引。

它可能不适用于数组中的大值,但假设a[i]<10^5,我们不能这样做而不是二叉搜索吗?然后,每个查询将为 O(1(。

PS:我的意思是无序地图。

哈希表,如 Python 字典,将提供每次查找的摊销常数平均成本。

对于大型数据集,这可能成为二叉搜索的有趣替代方案。

由于以下原因,某些算法可能绝对需要二进制搜索:

当查找值不在数据集中时,二叉搜索仍然可以在相同的O(logn(成本下判断数据集中大于查找值的最小值和小于查找值的最大值。

对我来说,重复的问题不是一个问题,因为您可以在数组中存储(值,频率(或(值,[payload1,payload2,...](的元组,因此仍然使用哈希表。

以下是您可能需要考虑的问题 -

  • 不能在映射中存储相同值的多个元素

  • 查找时间为O(log(n))而不是O(1)

  • 地图中发生的不是魔法,它使我们能够在更短的时间内访问它。unordered_map后台有一个哈希过程正在进行,这提供了O(1),这也需要时间。因此,大O隐藏了一个很大的恒定时间因子。标准map为您提供O(logn)查找,与数组中的二叉搜索具有相同的复杂性。


搜索的平均时间复杂度大致相同。在C++中使用标准地图时遇到的主要问题是它无法容纳具有相同值的多个元素。您可能使用map获得的一个优点是删除和插入时间将O(logn)

因此,如果您知道您将要处理的数据集没有重复的元素和/或会频繁添加/删除元素,那么在这种情况下,您当然可以考虑将 map 视为更好的选择。

由于确切的运行时间取决于密钥的长度和类型、它们的分布、它们的数量,因此建议针对您的特定应用程序进行基准测试。