请比较两种常见的比较算法及其大O帮助
Comparison of two common comparison algorithms and their Big O help please
今天我的教授给了我们 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²(。
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么比较运算符如此快速
- 我可以使用 g++ 进行三种比较 (<=>) 吗?
- 需要帮助设置在C++中使用的Potrace
- 在指针的帮助下,文本文件中单词的频率
- 比较字符数组
- 将模板化的类型与C++中的某些类/类型进行比较
- C++自定义比较函数
- 如何比较自定义类的std::变体
- 计算每个节点的树高,帮助我解释这个代码解决方案
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- std::设置自定义比较器
- 布尔比较运算符是如何在C++中工作的
- 需要帮助比较属于类的数组
- 在将数组与字符数组进行比较后需要帮助输出一次结果
- C 帮助(ISO C 禁止指针和整数之间的比较.)
- C++:比较可变参数无符号 int 模板参数的帮助程序
- 逻辑帮助:比较值并取最小距离,同时将其从"available to compare"列表中删除
- 比较类语法帮助中的对象;
- 请比较两种常见的比较算法及其大O帮助