Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 查找数组中给定位置后元素第一次出现的有效方法是什么?_Arrays_Algorithm_Data Structures - Fatal编程技术网

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是查询的数目

首先,我们需要存储一个向量[100]。它存储数字的准确度。 对于每个查询。二进制搜索向量(这里向量的顺序是递增的),它接受O(logn)。因此它是O(mlogn)

如果数组中的数字是浮点数,我们应该将vector[100]改为map,然后取O(m*logn*logn)。

如果数字是整数,我就知道O(mlogn)。这里m是查询的数目

首先,我们需要存储一个向量[100]。它存储数字的准确度。 对于每个查询。二进制搜索向量(这里向量的顺序是递增的),它接受O(logn)。因此它是O(mlogn)


如果数组中的数字是浮点数,我们应该将vector[100]更改为map,然后它需要O(m*logn*logn)。

如果没有“在给定位置之后”的要求,您将如何有效地执行此操作?然后,当我第一次看到它们时,我会将它们放入一个
哈希表中。因此这是一个大数组。因为要对这样大小的数组有效地执行此操作,我只需执行一个循环。数字字典->位置列表,在字典中找到数字后,使用二进制搜索找到最近的位置。谢谢,这是一个好主意。我会试试。如果你没有“在一个给定的位置之后”的要求,你会如何有效地做到这一点呢?然后我会在第一次看到它们时将它们放入一个
哈希表中。所以这是一个大数组。因为要对这样大小的数组有效地执行此操作,我只需执行一个循环。数字字典->位置列表,在字典中找到数字后,使用二进制搜索找到最近的位置。谢谢,这是一个好主意。我试试看。我不懂O(1)部分。构建哈希映射是否需要O(nlgn)时间?@fall:构建数据结构的一次性成本不包括在其中-仅包括查询成本,即:固定时间哈希查找+对数时间二进制搜索。构建哈希映射可能是一次性的,然而,查找需要做很多工作。构建HashMap只需要
O(n)
时间。你只需要浏览一次列表。对于每个元素,如果它已经存在于映射中,则将其附加到与该元素关联的列表中。否则添加一个新条目。我没有得到O(1)部分。构建哈希映射是否需要O(nlgn)时间?@fall:构建数据结构的一次性成本不包括在其中-仅包括查询成本,即:固定时间哈希查找+对数时间二进制搜索。构建哈希映射可能是一次性的,然而,查找需要做很多工作。构建HashMap只需要
O(n)
时间。你只需要浏览一次列表。对于每个元素,如果它已经存在于映射中,则将其附加到与该元素关联的列表中。否则,请添加一个新条目。