未排序数组中可能具有重复元素的最小和最大数量的比较是什么?
我知道在未排序的数组中查找任何内容都是O(n)问题。但是,如果数组包含重复的元素,这是真的吗?
重复元素是指在给定数组中出现多次的元素。
答案 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),具体取决于概率密度函数。