Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何确定我的代码是O(n)、O(nlogn)、O(1)、O(n^2)?_Java_Algorithm_Computer Science - Fatal编程技术网

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

Java 如何确定我的代码是O(n)、O(nlogn)、O(1)、O(n^2)?,java,algorithm,computer-science,Java,Algorithm,Computer Science,我很难理解如何确定我的程序的运行时间,有没有简单的方法?另外,当我尝试搜索数组中的特定元素时,为什么时间复杂度是O(1)而不是O(n)?(我认为它是O(n),因为在最坏的情况下,您必须遍历整个数组以确定元素是否存在)搜索是数组中的O(n)。它是这样的,如果你的数组中有n个项目,那么你正在寻找的项目有可能位于数组的末尾。所以你需要检查每个元素,我们称之为动作。因为有n个元素,所以有n个动作,所以O(n)。O(n)要求您首先定义“n”可能是什么。比如说,任务是: 给定一个大小为t的整数数组a,以及一

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

搜索是数组中的O(n)。它是这样的,如果你的数组中有n个项目,那么你正在寻找的项目有可能位于数组的末尾。所以你需要检查每个元素,我们称之为动作。因为有n个元素,所以有n个动作,所以O(n)。

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

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

然后,我想到了这个算法:

for (int i = 0; i < a.length; i++) if (a[i] == x) return i;
return -1;
for(int i=0;i
这个算法是
O(t)

这是什么意思

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

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

在0点附近(小阵列),到处都是。疯狂的摇摆-你更多的是测量JVM启动时间,你的音乐播放器是否切换到下一个曲目,你的浏览器是否在工作,谁知道是什么。一团糟。但最终这条线会稳定下来。一旦你的输入阵列中有几百万个项目,热点启动、虚拟机预热、音乐播放器——这些都不再对测量产生有意义的影响

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

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

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

现在你知道O(n)是什么意思了。然后,解释为什么该算法是
O(n)
:如果您的数组中有一百万个数字,那么您必须查看一百万个条目才能找到答案。无论谁告诉你这是
O(1)
都是错的,或者更可能是你听错了。也许他们在谈论:

如果只为这个任务提供了一些优化的集合,要确定给定的整数x是否在数据结构a中(其中包含t元素),有多困难


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

如果说时间复杂度是O(1),那么很可能是哈希表。你是对的:搜索数组不能是O(1)(除非你只搜索第一个元素…)。如果数组未排序,则必须线性搜索,这就是O(n)。唯一可以接近O(1)搜索时间的数据结构是哈希表。