请比较两种常见的比较算法及其大O帮助

Comparison of two common comparison algorithms and their Big O help please

本文关键字:比较 帮助 算法 两种 常见      更新时间:2023-10-16

今天我的教授给了我们 2 个带回家的问题作为即将到来的 C 语言数组单元的练习,我想知道这两个问题的排序算法到底是什么,它们的 Big O 是什么。现在,我来这里不仅仅是期待答案,我已经解决了它们,但我对我的答案没有信心,所以我会在每个问题中发布它们,如果我错了,请纠正我并解释我的思维错误。

问题1:

如果我们决定一次浏览一个数组的(box(元素(文件夹(。从第一个元素开始,并将其与下一个元素进行比较。然后,如果它们相同,则比较结束,但是如果两者不相等,则继续比较接下来的两个元素 [2] 和 [3]。重复此过程,一旦比较最后两个元素,就会停止,并注意数组已经按姓氏排序,我们正在寻找相同的名字!示例:[哈珀·史蒂文、霍金·约翰、英格尔顿·史蒂文]

我相信的答案:

我相信它是 O(n(,因为它只是在比较数组 [0] 到数组 [1] 的数组元素,然后将数组 [2] 与数组 [3] 等进行比较。此过程是线性的,并一直持续到比较最后两个过程为止。绝对不是登录,因为我们没有乘以或潜水 2。

最后一个问题: 假设我们有一盒文件夹,每个文件夹都包含一个人的信息。如果我们想寻找具有相同名字的人,我们可以首先在框中的第一个文件夹上贴上贴纸,然后有序地浏览其后面的文件夹,直到找到同名的人。如果我们找到一个同名的文件夹,我们会将该文件夹移动到带有贴纸的文件夹旁边。一旦我们发现两个人的名字相同,我们就会停下来睡觉,因为我们很懒。但是,如果第一次搜索失败,我们只需删除贴纸并将其放在下一个文件夹中,然后像之前一样继续。我们重复此过程,直到贴纸位于最后一个文件夹上,在这种情况下,我们没有两个同名的人。

此数组未排序,并将带有贴纸文件夹[0]的第一个文件夹与下一个i文件夹[i]元素进行比较。

我的回答:

我觉得这不可能是 O(n(,但也许是 O(n^2(,感觉我们有一个数组,然后我们不断重复 n 与输入(文件夹(的平方成正比的过程。通过>.>

你在

这两个问题上都是对的......但更严格地解释事情会有所帮助。我不知道你们班的标准是什么;你可能不需要实际的证明,但展示比"我们没有乘以或除以二"更详细的推理永远不会有什么坏处。所以。。。


在第一个问题中,除了比较之外,这里显然什么都没有发生,所以这就是我们必须计算的。

最糟糕的情况显然是您必须遍历整个数组。

因此,在这种情况下,您必须比较a[0] == a[1],然后a[1] == a[2],...,a[N-1] == a[N]。对于N-1元素中的每个元素,都有 1 个比较。这是N-1步骤,这显然是O(N).

数组排序的事实在这里被证明是无关紧要的。(当然,因为它们不是按您的搜索键排序的——也就是说,它们是按姓氏排序的,但您是按名字进行比较的——这已经很明显了。


在第二个问题中,这里发生了两件事:比较,然后移动。

对于比较,最坏的情况是您必须进行所有N搜索,因为没有匹配项。正如您所说,我们从a[0]a[1] , ..., a[N] ;然后a[1] vs. a[2]、...、a[N]等。所以,N-1比较,然后N-2,依此类推,直到0.所以比较的总数是sum(0…N-1),即N*(N-1)/2,或N^2/2 - N/2,即O(N^2)

对于移动,最坏的情况是你发现 a[0]a[N] 之间的匹配 .在这种情况下,您必须将a[N]a[N-1]交换,然后与a[N-2]交换a[N-1],依此类推,直到a[2]a[1]交换。所以,这就是N-1交换,这是O(N),你可以忽略它,因为你已经有一个O(N^2)术语。


作为旁注,我不确定从您的描述中您是在谈论来自 a[0…N] 的数组,还是长度为 N 的数组,所以a[0…N-1],因此上述两个都可能存在一个错误。但是,向自己证明这没有什么区别应该很容易。

场景 2 是一种查找任意值的两个匹配项的方法,确实是"二次"的。 每次查找一个候选元素与所有其他元素匹配的遍历都是 O(n(。 但是你重复了n次。 n 的值会随着您的进行而下降,因此详细的比较数量将更接近 n+(n-1(+(n-2(+ ...1 是 (n+1(×(n/2( 或 1/2(n²+n(,但我们关心的只是曲线的整体形状,所以不用担心低阶项或系数。 它是O(n²(。