Java 在数组中搜索不同的数字,当所有其他数字都相同时,是否可以使用分治在O(logn)中进行搜索

Java 在数组中搜索不同的数字,当所有其他数字都相同时,是否可以使用分治在O(logn)中进行搜索,java,algorithm,search,Java,Algorithm,Search,假设我们有一个非常大的数组,我们需要在数组中找到唯一不同的数字,所有其他数字在数组中都是相同的,我们可以使用分治法在O(logn)中找到它吗,就像mergeSort一样,请提供一个实现。除非该数组是特殊的,否则这不能在比O(n)更好的时间复杂度下完成。根据给定的约束条件,即使应用像“分而治之”这样的算法,也必须至少访问每个数组元素一次 因为分割数组将是O(logn),当数组减小到大小2时比较2个元素将是O(1) 这是错误的。分割数组不是O(对数n)。二进制搜索在O(logn)中起作用的原因是数组

假设我们有一个非常大的数组,我们需要在数组中找到唯一不同的数字,所有其他数字在数组中都是相同的,我们可以使用分治法在O(logn)中找到它吗,就像mergeSort一样,请提供一个实现。

除非该数组是特殊的,否则这不能在比O(n)更好的时间复杂度下完成。根据给定的约束条件,即使应用像“分而治之”这样的算法,也必须至少访问每个数组元素一次

因为分割数组将是O(logn),当数组减小到大小2时比较2个元素将是O(1)

这是错误的。分割数组不是O(对数n)。二进制搜索在O(logn)中起作用的原因是数组是经过排序的,这样你就可以在每一步丢弃数组的另一半,即使不看它们有哪些元素,从而将原始问题的大小减半


直观地说,您可以这样想:即使您继续将数组分成两半,形成的树的叶节点是n/2(考虑到您在叶上比较2个元素)。您将不得不进行n/2比较,这将导致O(n)的渐近复杂性。

除非该数组是特殊的,否则这不能在比O(n)更好的时间复杂性中完成。根据给定的约束条件,即使应用像“分而治之”这样的算法,也必须至少访问每个数组元素一次

因为分割数组将是O(logn),当数组减小到大小2时比较2个元素将是O(1)

这是错误的。分割数组不是O(对数n)。二进制搜索在O(logn)中起作用的原因是数组是经过排序的,这样你就可以在每一步丢弃数组的另一半,即使不看它们有哪些元素,从而将原始问题的大小减半


直观地说,您可以这样想:即使您继续将数组分成两半,形成的树的叶节点是n/2(考虑到您在叶上比较2个元素)。您必须进行n/2比较,这会导致O(n)的渐近复杂性。

数组是否已排序?数组是否已排序?如果是,则不同的数字是第一个元素或最后一个元素,您可以在
O(1)
时间中找到它。为了找到不同的数字,在最坏的情况下,您需要迭代整个数组,这意味着您不能在少于O(n)的时间内完成它
我们可以使用分治在O(logn)中找到它吗,就像mergeSort一样
-合并排序需要
O(nlog(n))
而不是
O(logn)
@Hiresh在最坏的情况下,您必须比较n/2对元素,因此无法避免O(n)。数组排序了吗?数组排序了吗?如果是,则不同的数字是第一个元素或最后一个元素,您可以在
O(1)
时间中找到它。为了找到不同的数字,在最坏的情况下,您需要迭代整个数组,这意味着您不能在少于O(n)的时间内完成它
我们可以使用分治在O(logn)中找到它吗,就像mergeSort一样
-合并排序需要
O(nlog(n))
而不是
O(logn)
@Hiresh在最坏的情况下,您必须比较n/2对元素,因此无法避免O(n)。