搜索未排序的数组

时间:2010-03-30 15:08:56

标签: search comparison

未排序数组中可能具有重复元素的最小和最大数量的比较是什么?

我知道在未排序的数组中查找任何内容都是O(n)问题。但是,如果数组包含重复的元素,这是真的吗?

重复元素是指在给定数组中出现多次的元素。

6 个答案:

答案 0 :(得分:3)

所以这里的想法是你必须从前到后走数组,因为它是未排序的。这意味着你正在观察O(n) - 元素的线性遍历。无论您要搜索的是位置0,位置8还是位置n-1,您都必须走到阵列才能找到它。

现在,如果数组中可能存在重复项,唯一的区别是您可能会找到该值的多个实例。如果您正在寻找所有这些或仅仅是第一个,它仍然是O(n)情况。重复项不会改变复杂性。

最好的情况 - 你在第一次比较中找到它(假设你只需要找到一个)。

最坏情况 - 给定值没有重复,这是你检查的最后一个 - 第n次比较。

如果你必须找到所有重复项,它总是会进行n次比较,因为你必须访问未排序数组中的每个元素。

答案 1 :(得分:2)

即使存在重复元素,O(n)时间也是如此。您应该熟悉big-oh notation

在最坏的情况下,请考虑这个数组:1, 1, 1, 1, ..., 1, 1, 2。如果从第一个元素开始,搜索2将完全进行n比较,因此重复项根本没有帮助。如果你要搜索1,你可以在一次比较中找到它,但是如果你很幸运的话,你也可以在一次比较中找到一个元素的不同元素的输入,所以有重复的真的没有多大意义,除了你更有可能获得幸运,并用更少的步骤找到你的目标元素。但它仍然是O(n)

几乎总是最好的情况和最坏的情况。大多数算法的实际性能总是取决于给定的输入,大的符号只是让你对算法的执行方式有一个模糊的概念。这并不是说渐近符号是无用的,只是它并不总是完全准确,因为涉及的基本常数确实在实践中有所作为。

如果对性能有疑问,请运行自己的基准测试。

答案 2 :(得分:1)

我认为应该进行2n次比较

for (int i=0; i<n; i++)
    if (a[i]==ele)
        break
    else
        continue;

因此,在最坏的情况下,有两次比较(i<n)(a[i]==ele)完成了n次。因此2n比较。如果有某种方法可以减少i<n,我不知道如何。

答案 3 :(得分:0)

作为一般经验法则,当我们谈到忽略O(n)等常数的渐近复杂性时,无论你的工作量是工作量的两倍还是工作量的三倍都无关紧要。因此问题是O (n)在这种情况下保持O(n)。

在这个特殊问题中,在未排序的数组中有重复项不会加快搜索元素的过程。当然,如果元素在数组中是10次,你可能会发现它平均快10倍,但只要这不依赖于n,它就不会改变复杂性。

答案 4 :(得分:0)

  

最小和最大的是什么   未排序数组中的比较数   也可能有重复的元素?

如果要搜索单个指定值,则最小和最大数量的比较将分别为1和n。如果已知该值在数组中,并且您只是在寻找它的位置,那么您可以放弃n-1次比较。

  

我明白找到任何东西   未排序的数组是O(n)问题。但是   如果数组包含重复,则为true   元素也是?

是的,它仍然是O(n)。

假设重复的存在意味着平均来说搜索时间缩短了一半。嗯,这是一个很大的减少,但它不会影响O(n)时间。 Big-O不是一般的情况,它是最糟糕的情况,最坏的情况不会改变。无论如何,用一个常数因子除以n不会影响大O时间。

答案 5 :(得分:0)

和其他人一样,我同意一个没有重复的未排序数组,详尽的线性搜索将是O(n)。

如果允许重复,则算法仅在假设任何元素重复的概率均匀分布的情况下保持为O(n)。

如果存在描述重复元素分布的不同概率密度函数,则搜索算法可能小于O(n),具体取决于概率密度函数。