我们可以使用地图而不是二叉搜索吗?
Can we use maps for searching instead of binary search?
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 视为更好的选择。
由于确切的运行时间取决于密钥的长度和类型、它们的分布、它们的数量,因此建议针对您的特定应用程序进行基准测试。
- 是否可以使C++类成为Objc类的委托
- 是否可以使一个类成为两个不同层次结构的子类?
- 是否有编译器标志可以使较新的 gcc 版本像旧版本一样构建
- C 可以使destuructor不称为班级成员和基类攻击方的灾难
- 搜索功能使程序崩溃
- 可以使未命名的结构静态
- 是否可以使整数仅收到一个单个数字而不是两个接收输入
- C++:有哪些常规方法可以使代码更有效地用于大数字
- 是否可以使 std 容器使用默认运算符为新?
- LD_BIND_NOW可以使可执行文件运行得更慢?
- 是否可以使头文件使文本居中?- 在控制台中
- 有什么方法可以使核心忙碌等待
- 有没有一种技术可以使虚函数在所有派生类中强制重写?
- 有没有一种方法可以使全局函数/静态成员函数一次可呼出
- 是否有一种方法可以使此C 14递归模板在C 17中短
- 编写一个可以使二维数组平坦的函数
- 有哪些优化技巧可以使我的代码运行得更快
- 有没有更好的方法可以使此代码线程安全?线程局部静态似乎是一个生硬的工具
- 如果必须在同一向量上写入线程,是否可以使用线程
- 对于具有两个模板化变量的模板化类,是否可以使一个 var 引用另一个 var