Arrays 查找数组中给定位置后元素第一次出现的有效方法是什么?
比如说,, 考虑数组Arrays 查找数组中给定位置后元素第一次出现的有效方法是什么?,arrays,algorithm,data-structures,Arrays,Algorithm,Data Structures,比如说,, 考虑数组 A = [1,2,3,1,1,2,1,4,5,6,1,2,3] 数组中索引2之后元素1的第一次出现(出现的索引)是3 数组中索引2之后元素2的第一次出现是5 数组中索引4之后元素1的第一次出现是6 如果在特定索引之后没有出现,我们可以只输出-1 如何有效地执行此操作?如果是一次性查询,则最好是在位置O(n)之后对数组进行线性搜索 如果需要在同一数组上多次执行类似的查询,请从每个不同的元素构建一个哈希多重映射,并将其映射到索引的排序列表中。然后问题是a)查找元素的排序列表b
A = [1,2,3,1,1,2,1,4,5,6,1,2,3]
数组中索引2
之后元素1
的第一次出现(出现的索引)是3
数组中索引2
之后元素2
的第一次出现是5
数组中索引4
之后元素1
的第一次出现是6
如果在特定索引之后没有出现,我们可以只输出-1
如何有效地执行此操作?如果是一次性查询,则最好是在位置O(n)之后对数组进行线性搜索
如果需要在同一数组上多次执行类似的查询,请从每个不同的元素构建一个哈希多重映射,并将其映射到索引的排序列表中。然后问题是a)查找元素的排序列表b)二进制搜索排序列表(匹配不需要精确),然后返回大于指定位置的后续元素/第一个元素。我相信当
-1
应该返回时,您可以处理这些情况。这是O(1)+O(logn)=O(logn)。如果是一次性查询,那么在该位置之后线性搜索数组是最好不过的了:O(n)
如果需要在同一数组上多次执行类似的查询,请从每个不同的元素构建一个哈希多重映射,并将其映射到索引的排序列表中。然后问题是a)查找元素的排序列表b)二进制搜索排序列表(匹配不需要精确),然后返回大于指定位置的后续元素/第一个元素。我相信当-1
应该返回时,您可以处理这些情况。这是O(1)+O(logn)=O(logn)。如果数字是整数,我就知道O(mlogn)。这里m是查询的数目
首先,我们需要存储一个向量如果数组中的数字是浮点数,我们应该将vector
哈希表中。因此这是一个大数组。因为要对这样大小的数组有效地执行此操作,我只需执行一个循环。数字字典->位置列表,在字典中找到数字后,使用二进制搜索找到最近的位置。谢谢,这是一个好主意。我会试试。如果你没有“在一个给定的位置之后”的要求,你会如何有效地做到这一点呢?然后我会在第一次看到它们时将它们放入一个哈希表中。所以这是一个大数组。因为要对这样大小的数组有效地执行此操作,我只需执行一个循环。数字字典->位置列表,在字典中找到数字后,使用二进制搜索找到最近的位置。谢谢,这是一个好主意。我试试看。我不懂O(1)部分。构建哈希映射是否需要O(nlgn)时间?@fall:构建数据结构的一次性成本不包括在其中-仅包括查询成本,即:固定时间哈希查找+对数时间二进制搜索。构建哈希映射可能是一次性的,然而,查找需要做很多工作。构建HashMap只需要O(n)
时间。你只需要浏览一次列表。对于每个元素,如果它已经存在于映射中,则将其附加到与该元素关联的列表中。否则添加一个新条目。我没有得到O(1)部分。构建哈希映射是否需要O(nlgn)时间?@fall:构建数据结构的一次性成本不包括在其中-仅包括查询成本,即:固定时间哈希查找+对数时间二进制搜索。构建哈希映射可能是一次性的,然而,查找需要做很多工作。构建HashMap只需要O(n)
时间。你只需要浏览一次列表。对于每个元素,如果它已经存在于映射中,则将其附加到与该元素关联的列表中。否则,请添加一个新条目。