Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.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
Java 在已排序和未排序数组中查找公共元素的Big-O_Java_Arrays_Sorting_Time Complexity_Big O - Fatal编程技术网

Java 在已排序和未排序数组中查找公共元素的Big-O

Java 在已排序和未排序数组中查找公共元素的Big-O,java,arrays,sorting,time-complexity,big-o,Java,Arrays,Sorting,Time Complexity,Big O,在打印出两个数组中的公共元素时,很难掌握大O。尺寸为a,另一个尺寸为b 我知道两个未排序的数组是O(ab) 但是当a未排序而b已排序时又如何呢 两个都排序了吗 任何解释都很好。我假设您希望使用$O(1)$额外内存,因为否则,您可以使用哈希表在$O(a+b)$中解决问题(排序或未排序)。此外,我将假设每个数组中的元素都是唯一的,但如果不是,则可以很容易地修改算法 如果两者都未排序,实际上您可以通过简单地对其中一个数组排序,然后使用下面的方法来改进您的方法。这将得到$O((a+b)\min(\lg

在打印出两个数组中的公共元素时,很难掌握大O。尺寸为a,另一个尺寸为b

我知道两个未排序的数组是O(ab)

但是当a未排序而b已排序时又如何呢

两个都排序了吗


任何解释都很好。

我假设您希望使用$O(1)$额外内存,因为否则,您可以使用哈希表在$O(a+b)$中解决问题(排序或未排序)。此外,我将假设每个数组中的元素都是唯一的,但如果不是,则可以很容易地修改算法

如果两者都未排序,实际上您可以通过简单地对其中一个数组排序,然后使用下面的方法来改进您的方法。这将得到$O((a+b)\min(\lg a\lg b)$

如果a未排序,b已排序,则可以迭代a中的所有元素,并使用检查它们是否在b中。这提供了$O(b+a\lg b)$方法


如果两者都已排序,则可以通过使用简单的双指针算法(在两个数组上依次递增索引)轻松获得$O(a+b)$。

我假设您希望使用$O(1)$额外内存,因为否则,您可以在$O(a+b)中解决任何问题(已排序或未排序)另外,我将假设每个数组中的元素都是唯一的,但是如果不是,算法可以很容易地进行修改

如果两个数组都未排序,实际上您可以通过简单地对其中一个数组排序,然后使用下面的方法来改进您的方法。这将得到$O((a+b)\min(\lg a\lg b)$

如果a未排序,b已排序,则可以迭代a中的所有元素,并使用检查它们是否在b中。这提供了$O(b+a\lg b)$方法


如果两者都已排序,则可以通过使用简单的双指针算法(在两个数组上依次递增索引)轻松获得$O(a+b)$。

一种有效的方法是使用哈希表(
Java中的HashMap
)。算法如下:

foreach element of the smallest array (1) O(N) add element to the hash table (2) O(1) foreach element of the biggest array (3) O(M) if element is in the hash table (4) O(1) print element 最小数组(1)O(N)的每个元素 将元素添加到哈希表(2)O(1) 最大数组(3)O(M)的每个元素 if元素位于哈希表(4)O(1)中 打印元素 每个步骤的时间复杂度都在上面的伪代码中注释

  • 迭代大小为X的数组的元素具有O(X)的时间复杂度和恒定的内存复杂度(元素的大小)
  • 在哈希表中插入元素具有恒定的时间和空间复杂性
  • 检查元素是否在哈希表中具有恒定的时间和空间复杂性
因此总体时间复杂度为O(N+M),而空间复杂度为O(N)

注意

  • 这种复杂性不受数组是否排序的影响
  • 只有当最小的数组可以放入内存时,此算法才有效
  • 最好使用最小的数组来构建哈希表,因为它将减少内存中较小的哈希表

希望有帮助!

一种有效的方法是使用哈希表(
HashMap
在Java中)。算法是:

foreach element of the smallest array (1) O(N) add element to the hash table (2) O(1) foreach element of the biggest array (3) O(M) if element is in the hash table (4) O(1) print element 最小数组(1)O(N)的每个元素 将元素添加到哈希表(2)O(1) 最大数组(3)O(M)的每个元素 if元素位于哈希表(4)O(1)中 打印元素 每个步骤的时间复杂度都在上面的伪代码中注释

  • 迭代大小为X的数组的元素具有O(X)的时间复杂度和恒定的内存复杂度(元素的大小)
  • 在哈希表中插入元素具有恒定的时间和空间复杂性
  • 检查元素是否在哈希表中具有恒定的时间和空间复杂性
因此总体时间复杂度为O(N+M),而空间复杂度为O(N)

注意

  • 这种复杂性不受数组是否排序的影响
  • 只有当最小的数组可以放入内存时,此算法才有效
  • 最好使用最小的数组来构建哈希表,因为它将减少内存中较小的哈希表

希望有帮助!

您可以在
O(m+n)
中使用
HashSet
进行排序和未排序。不过,我只想使用简单的数组和循环。您可以在
O(m+n)
中使用
HashSet
进行排序和未排序。不过,我只想使用简单的数组和循环。