时间复杂度分配

时间:2014-02-13 23:45:55

标签: java time-complexity

我在编程课程的介绍中有一项任务,我根本不懂。由于家里的问题,我一直落后。我不是要求你为我做任务我只是希望得到一些像我这样的编程布道的帮助。

问题是:

    Calculate the time complexity in average case for searching, adding, and removing in a

       - unsorted vector
       - sorted vector
       - unsorted singlelinked list
       - sorted singlelinked list
       - hash table

Let n be the number of elements in the datastructure 
and present the solution in a 
table with three rows and five columns.

我不确定这甚至意味着什么..我尽可能多地阅读时间复杂性,但我不理解它......这太令人困惑了。我不知道我甚至会在哪里开始..记住我是一个新手程序员,就像他们来的那样愚蠢。我上学期的表现非常好,但是在开始的时候在家里遇到了问题,所以我错过了很多讲座和第一次任务,所以现在我已经在我头上了..

也许如果有人可以给我答案以及其背后的原因,我可以理解并做其他人吗?我很难通过理论学习,实例效果最好。

3 个答案:

答案 0 :(得分:1)

时间复杂度是一个公式,描述了操作成本如何随元素数量的变化而变化。它通常用“big-O”表示法表示,例如 O(1)或恒定时间, O(n)其中成本与n线性相关, O(n 2 其中成本随输入大小的平方而增加。可能还有其他涉及指数或对数的指数。阅读“Big-O表示法”。

要求您评估五种不同的数据结构,并为每种数据结构提供三种不同操作的平均成本(因此该表包含三行五列)。

答案 1 :(得分:0)

时间复杂度是一个抽象概念,它允许我们通过查看执行了多少操作来处理其输入来比较各种算法的复杂性。确切地说,确切的操作次数并不重要,最重要的是,操作次数如何随着输入复杂性的增加而缩放。

通常,为n,并且复杂度被表示为被表示的输入的数目O(p(n)),以及p(n)是某种表达与n。如果算法具有O(n)复杂度,则意味着线性扩展,对于每个新输入,运行算法所需的时间增加相同的数量。

如果算法的复杂度为O(n^2),则表示操作量增加为输入数的平方。这是on and on,直到指数复杂的算法,对于足够大的输入实际上是无用的。

您的教授要求您查看给定的操作和判断,如何随着列表大小的增加而扩展,您正在处理。基本上这是通过查看算法和想象来完成的,需要什么类型的循环。例如,如果任务是选择第一个元素,则复杂度为O(1),这意味着它不依赖于输入的大小。但是,如果要在列表中查找给定元素,则需要扫描整个列表,这取决于列表大小。希望这能让您对算法复杂性的工作原理有所了解,祝您工作顺利。

答案 2 :(得分:0)

好的,你必须首先开始做一些事情。算法复杂性背后有很多繁重的数学因素,因此新手很难理解,特别是如果你试图查找维基百科定义或更正式的定义。

一个简单的定义是,时间复杂度基本上是一种衡量成本执行量的方法。或者,您也可以使用它来查看特定算法可以运行多长时间。

使用所谓的 big-O 表示法来描述复杂性。您通常会看到O(1)O(n)之类的内容。 n通常是算法运行的元素数量(可能在结构中)。

让我们看一些大O符号:

  • O(1):这意味着操作在恒定时间内运行。这意味着无论元素数量多少,操作总是在恒定时间内运行。一个例子是查看非空数组中的第一个元素(arr[0])。这将始终以恒定时间运行,因为您只需要直接查看数组中的第一个元素。
  • O(n):这意味着操作所需的时间随着元素的数量增加线性。例如,如果您有一个数字数组,并且想要找到最大数字。要做到这一点,在最坏的情况下,您必须查看数组中的每个数字,直到找到最大的数字。这是为什么?这是因为您可以拥有一个最大数字是数组中最后一个数字的情况。因此,在检查数组中的每个数字之前,您无法确定。这就是此操作的成本为O(n)
  • 的原因
  • O(n^2):这意味着操作所需的时间随着元素的数量增加二次。这通常意味着对于元素集中的每个元素,您正在运行整个集合。这是n x nn^2。一个众所周知的例子是冒泡排序算法。在此算法中,您将遍历并交换相邻元素,以确保根据所需的顺序对数组进行排序。当不需要进行交换时,对数组进行排序。所以你有多次遍历数组,在最坏的情况下,它等于数组中元素的数量。

现在,您可以查看代码中的某些内容以获取提示,以查看算法是O(n)还是O(n^2)

单循环通常是O(n),因为这意味着你要迭代一组元素一次:

for(int i = 0; i < n; i++) {
    ...
}

双嵌套循环通常是O(n^2),因为你要迭代集合中每个元素的整个元素集

for(int i = 0; i < n; i++) {
   for(j = 0; j < n; j++) {
      ...
   }
}

现在这如何适用于您的作业?我不打算直接给你答案,但我会给你足够多的提示来弄明白:)。我上面写的描述big-O的内容也应该对你有帮助。您的作业要求您将运行时分析应用于不同的数据结构。好吧,某些数据结构根据它们的设置方式具有某些运行时属性。

例如,在链接列表中,只能通过 first 元素开始,然后才能到达列表 middle 中的元素。跟随next指针,直到找到所需的元素。考虑一下。您需要多少步骤才能找到所需的元素?您认为这些步骤与哪些相关?列表中的元素数量是否与此有关?如何使用big-O表示法表示此函数的成本?

对于您的老师问过的每个数据结构,尝试弄清楚它们是如何设置的,并尝试手动计算每个操作(搜索,添加,删除)的含义。我正在谈论写出步骤并在纸上画出结构图片!这将极大地帮助你!看一下,你应该有足够的信息来确定所需的步骤数以及它与集合中元素数量的关系。

使用这种方法,您应该能够解决您的家庭作业。祝你好运!