微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何确定我的代码是否为 O(n)、O(nlogn)、O(1)、O(n^2)?

如何解决如何确定我的代码是否为 O(n)、O(nlogn)、O(1)、O(n^2)?

我很难理解如何确定我的程序的运行时间,有没有简单的方法来做到这一点?另外,当我尝试搜索数组中的特定元素时,为什么时间复杂度是 O(1) 而不是 O(n)? (我认为它是 O(n) 因为在最坏的情况下你必须遍历整个数组才能找出元素是否存在)

解决方法

O(n) 要求您首先定义“n”可能是什么。说,任务是:

给定一个a整数数组,大小为t和一个特定整数 x,返回 xa 中出现的第一个索引>;如果 x 不在 a 中,则返回 -1。

然后,想到了这个算法:

for (int i = 0; i < a.length; i++) if (a[i] == x) return i;
return -1;

这个算法是O(t)

这是什么意思?

好吧,做个图表。在 x 轴上,放置“花费的时间”(或占用的内存;您可以根据需要测量空间复杂度或时间复杂度)。在 y 轴上,放置“t”:该数组的大小。

现在,开始运行您的算法。首先是 1 大小的数组,然后是 2 大小的数组,然后继续。最终是一个百万大小的数组。把它画出来。

在 0 点(小阵列)附近,到处都是。 wild 波动 - 您更多的是在测量 JVM 启动时间,您的音乐播放器是否切换到下一首曲目,您的浏览器是否在做一些工作,谁知道呢。一团糟。但最终这条线会稳定下来。一旦您的输入数组中有几百万个项目、热点启动、VM 预热、音乐播放器 - 这些就不再对测量产生有意义的影响。

一旦线路稳定下来,它会是什么样子?

O(n) 算法说:“它看起来像一条非水平直线”。因为如果你绘制 y = C*x,(为 C 选择任何常数),它看起来像一条非水平直线。

O(1) 算法看起来像一条水平线(为什么?因为 y = C 看起来像那样)。 O(n^2) 算法看起来就像 y = x^2 一样,如果你绘制它,依此类推。就像 y = 812398x^2 + 234124124x 最终看起来几乎与 y = x^2 几乎完全一样,只要你“向右走得足够远”,在 O(x) 符号中,常数因子和黯淡因子({{1} } 是常数,812398 部分被忽略)被忽略。这是关于“图表最终是什么样子的?”,而这些方面根本不影响这一点。

现在您知道 234124124x 是什么意思了。解释为什么这个算法是 O(n) 就很简单了:如果你的数组中有一百万个数字,你必须查看一百万个条目才能找出答案。谁告诉你是 O(n) 是错误的,或者你更有可能听错了。也许他们在谈论:

为这个任务提供一些优化的集合,以确定给定的整数 x 是否在数据结构 a 中,这有多难?有 t 个元素吗?

对于数组,答案是 O(1),但如果 O(n)a,答案是 HashSet。哈希集不需要检查每个元素。

,

在数组中搜索是 O(n)。就像这样,如果您的数组中有 n 个项目,则您要查找的项目有可能位于数组的末尾。所以你需要检查每个元素,我们称之为一个动作。由于有 n 个元素,因此有 n 个动作,因此 O(n)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。