维基百科将time complexity定义为
在计算机科学中,算法的时间复杂度是量化的 算法作为的函数运行所花费的时间量 表示输入的字符串的长度。
强势部分意味着什么?
我知道算法可以被视为一个函数,但是为什么它的输入必须是“代表”的字符串的长度?
答案 0 :(得分:0)
定义来自图灵机的上下文,您可以在其中定义不同的状态。您可以使用计算机计算的每个功能也可以使用图灵机进行计算。(我会说计算机在图灵机的基础上计算功能)
每个功能只是从一个域到另一个域或同一个域的映射。
在去图灵机之前看看有限 -automata的概念。它有有限的状态。如果你的输入长度为n
,那么它可能只需要两个统计数据但是它必须访问那些状态n
次,其中n是字符串的最后一个。
不是一个好的草图但是看下面的图像,我们的最终状态是C
,意味着是否
以c
中的字符串结尾我们的字符串将被接受。
我们使用一元数字系统。我们想检查这个字符串是否被我们的自动机接受:string是010101010
当我们从0
阅读A
后,我们转移到B
,如果我们再次阅读0
,我们将移至C,如果我们以{{1}结尾我们的字符串被接受,否则我们再次移动到0
。
在计算机中,您将数字表示为长度为A
的字符串,为了计算它,您必须访问字符串的每个字符。
图灵机以相同的方式工作,但有限自动机仅限于常规语言。这是一个大理论
你有没有想过计算机如何计算函数2 * x,其中x是你的输入。
这很有趣:D。假设我想计算20 * 2,我用一元数字系统表示这个数字因为它很容易。所以我们用0表示,1表示11,2表示111等等,所以如果我们将20转换为一元系统,我们得到n
。您可以想到图灵机或计算机(非高级),具有线性记忆的系统。
假设您的记忆中的空白点带有1111
。
输入后你会有这样的事情:#
其中###1111####
表示内存中的空插槽,图灵机的输入头是#
,所以你继续前进直到您找到第一个1
,然后将其替换为#
,这只是一个帮助符号,并将*
的右侧更改为1现在向后移动并再更改一个#
当您发现1 to *
继续执行此操作时,{1}}并在右侧写one 1
,左侧的所有#
和所有*
都会留下在右侧,现在将所有* s改回1,你有2 * x。这是跟踪,你有2 * x,其中x是你的输入。
重点是这些机器唯一记住的是状态。
1s
#####1111#######
#####111*1######
#####11**11#####
#####1***111####
#####****1111###
答案 1 :(得分:0)
较大部分中的函数表示算法的时间复杂度,而不是算法本身。算法可以用具有函数关键字的编程语言来实现,但这是其他的东西。
算法MergeSort具有32m位的列表作为输入(假设m个32位值)。它的时间复杂度T(n)是n = 32m的函数,输入大小,并且在最坏的情况下,由上限O(n log n)。 MergeSort可以作为C或JavaScript中的函数实现。
答案 2 :(得分:0)
如果有输入,则表示为字符串。所以你有一个字符串的长度。然后你有一个函数F
,它将输入的长度(作为字符串)映射到A
计算此输入所需的时间(在最坏的情况下)。
我们称之为F
时间复杂度。
假设我们有一个算法A
。它的时间复杂度是多少?
如果A
具有恒定的复杂性,则输入无关紧要。输入可以是单个值,也可以是列表,也可以是从字符串到列表列表的映射。该算法将运行相同的时间。 3秒或1000蜱或一百万年或其他什么。恒定时间值不依赖于输入。
说实话并不太复杂。
现在让我们假设A
是一种排序整数列表的算法。很明显,A
所需的时间现在取决于列表的长度。长度为0的列表实际上是按字面排序的(但是检查列表的长度)但如果输入列表的长度增加,则会更改。
您可以说存在一个函数F
,它将列表长度映射到A
排序该长度列表所需的秒数。可是等等!如果列表已经排序怎么办?因此,为简单起见,我们总是假设最坏的情况:F
将列表长度映射到A
排序该长度列表所需的最大秒数。
你可以用秒,CPU周期,滴答或其他来衡量。它不依赖于单位。
所有其他算法都是什么?如何测量算法的时间复杂度,让我吃一顿美餐?
如果你不能定义任何输入参数,那么我们回到简单的情况:恒定时间。如果有一些输入,则表示为字符串。所以你有一个字符串的长度。并且 - 类似于上面所说的 - 然后你有一个函数F
,它将输入的长度(作为字符串)映射到A
计算此输入所需的时间< / strong>(在最坏的情况下)。
我们称之为F
时间复杂度。