【发布时间】:2020-09-23 20:11:30
【问题描述】:
地图提供 O(1) 查找。难道我们不能遍历数组一次并建立一个与其索引对应的映射(与数组相反),当我们想搜索一些东西时,我们可以调用map[VALUE],它会返回索引。
它可能不适用于数组中的大值,但假设a[i]<10^5,我们不能这样做而不是二进制搜索吗?然后,每个查询将是 O(1)。
P.S:我的意思是无序地图..
【问题讨论】:
-
是的,为什么你认为你不能?
-
“地图提供 O(1) 查找”编号
std::map是O(log(n))。std::unordered_map平均为O(1)。 -
当然可以……但这里有个问题……如果数组中的值发生变化怎么办?您还必须更新地图。如果数组中有多个相同的值怎么办?你会怎么处理呢?
-
不要忘记,虽然
O(1)可能意味着“恒定时间”,但“时间”可能是巨大的。O(n)算法可以轻松胜过O(1)算法,如果后者每次查找有 1 年的恒定开销,而前者每次查找使用 (1ms *n)。算法复杂度与现实生活中的运行时间不同。 -
在数据库术语中,您描述的是一个索引表。您的所有数据都放在
std::vector中。索引表是std::map<key, vector-index>。您可以创建多个索引表,通常每个索引字段一个,而不必对std::vector中的数据进行排序。
标签: python c++ algorithm data-structures