3 如何知道使用哪种时间复杂度分析符号? 在大多数入门算法课中,都引入了(大O)和等符号,并且学生通常会学会使用其中之一来查找时间复杂度。ΘØOOΘΘ\Theta 但是,还有其他符号,例如,和。在任何特定情况下,一种表示法要优于另一种表示法吗?ØooΩΩ\Omegaωω\omega 90 algorithms terminology asymptotics landau-notation reference-question
11 求解或近似数字序列的递归关系 在计算机科学中,我们经常必须解决递归关系,即为递归定义的数字序列找到闭合形式。在考虑运行时时,我们通常主要对序列的渐近增长感兴趣。 例子是 尾递归函数的运行时间从向下逐步降为,的身体花费时间:000nnnf(n)f(n)f(n) T(0)T(n+1)=0=T(n)+f(n)T(0)=0T(n+1)=T(n)+f(n)\qquad \begin{align} T(0) &= 0 \\ T(n+1) &= T(n) + f(n) \end{align} 的斐波那契序列: F0F1Fn+2=0=1=Fn+Fn+1F0=0F1=1Fn+2=Fn+Fn+1\qquad \begin{align} F_0 &= 0 \\ F_1 &= 1 \\ F_{n+2} &= F_n + F_{n+1} \end{align} 具有括号对的Dyck单词数:nnn C0Cn+1=1=∑i=0nCiCn−iC0=1Cn+1=∑i=0nCiCn−i\qquad\begin{align} C_0 &= 1 \\ C_{n+1}&=\sum_{i=0}^{n}C_i\,C_{n-i} \end{align} mergesort运行时重复出现在长度为列表上:nnn T(1)T(n)=T(0)=0=T(⌊n/2⌋)+T(⌈n/2⌉)+n−1T(1)=T(0)=0T(n)=T(⌊n/2⌋)+T(⌈n/2⌉)+n−1\qquad \begin{align} T(1) &= T(0) = 0 \\ T(n) … 89 asymptotics proof-techniques combinatorics recurrence-relation reference-question
9 随着问题的增加,是否有任何变得容易的问题? 这可能是一个荒谬的问题,但是随着输入量的增加,是否有可能实际上变得更容易解决的问题?我怀疑是否存在任何实际问题,但是也许我们可以发明具有这种性质的退化问题。例如,当它变大时,它可能开始“自我解决”,或者表现为其他怪异的方式。 62 algorithms asymptotics
5 在最坏的情况下,这种分类算法是Θ(n³)而不是Θ(n²)。 我刚开始学习数据结构和算法课程,我的助教为我们提供了以下用于对整数数组进行排序的伪代码: void F3() { for (int i = 1; i < n; i++) { if (A[i-1] > A[i]) { swap(i-1, i) i = 0 } } } 可能还不清楚,但是这里是我们要排序的数组的大小。nnnA 无论如何,助教都会向全班解释该算法的时间是(我认为是最坏的情况),但是无论我用反向排列的数组遍历多少次,在我看来,它应该是而不是。Θ (n 2)Θ (n 3)Θ(n3)Θ(n3)\Theta(n^3)Θ(n2)Θ(n2)\Theta(n^2)Θ(n3)Θ(n3)\Theta(n^3) 有人可以向我解释为什么这是Θ(n3)Θ(n3)Θ(n^3)而不是Θ(n2)Θ(n2)Θ(n^2)吗? 52 algorithm-analysis asymptotics runtime-analysis sorting
10 O(·)不是一个函数,那么一个函数如何等于它呢? 我完全理解大ØOO符号的含义。我的问题是,当我们说Ť(n )= O (f(n ))T(n)=O(f(n))T(n)=O(f(n)),其中Ť(n )T(n)T(n)是大小为ñnn输入上算法的运行时间。 我了解它的语义。但是Ť(n )T(n)T(n)和Ø (˚F(n ))O(f(n))O(f(n))是两回事。 Ť(n )T(n)T(n)是一个精确的数字,但是Ø (˚F(n ))O(f(n))O(f(n))不是一个产生数字的函数,因此从技术上讲我们不能说Ť(n )T(n)T(n) 等于 Ø (˚F(n ))O(f(n))O(f(n))。您 O (f (n ()))的值是多少,答案是什么?没有答案。Ø (˚F(n ))O(f(n))O(f(n)) 47 asymptotics landau-notation notation
2 是什么意思? 这是一个基本问题,但是我认为与,因为在我们趋于无穷大时,较大的项应该起主导作用?同样,这将不同于O(\ min(m,n))。那正确吗?我一直看到这种表示法,尤其是在讨论图形算法时。例如,您通常会看到:O(| V | + | E |)(例如,参见此处)。O(m+n)O(m+n)O(m+n)O(max(m,n))O(max(m,n))O(\max(m,n))O(min(m,n))O(min(m,n))O(\min(m,n))O(|V|+|E|)O(|V|+|E|)O(|V| + |E|) 44 terminology asymptotics mathematical-analysis landau-notation
4 O(n log n)描述的函数类的名称是什么? 在“ Big O”中,通用符号具有通用名称(而不是说“某些常数的哦”): O(1)为“常数” O(log n)是“对数” O(n)是“线性” O(n ^ 2)是“二次方” O(n * log n)是??? 它只是“ n log n”还是像上面这样的特殊名称? 40 terminology asymptotics
6 按渐近增长对函数进行排序 假设我有一个功能列表,例如 nloglog(n),2n,n!,n3,nlnn,…nloglog(n),2n,n!,n3,nlnn,…\qquad n^{\log \log(n)}, 2^n, n!, n^3, n \ln n, \dots 如何渐近地对它们进行排序,即在由 f≤Og⟺f∈O(g)f≤Og⟺f∈O(g)\qquad f \leq_O g \iff f \in O(g), 假设它们确实是成对可比的(另请参见此处)?使用的定义似乎很尴尬,并且通常很难证明合适的常数和的存在。Ç Ñ 0OOOcccn0n0n_0 这是关于复杂度的量度,因此我们对渐进行为感兴趣,并且我们假定所有函数仅采用非负值()。&ForAll; Ñ ,˚F (Ñ )≥ 0n→+∞n→+∞n \to +\infty∀n,f(n)≥0∀n,f(n)≥0\forall n, f(n) \ge 0 35 asymptotics landau-notation reference-question
2 天真的改组在渐近性上有多糟糕? 众所周知,这种“天真的”算法通过将每个项目与另一个随机选择的项目交换来改组数组,无法正常工作: for (i=0..n-1) swap(A[i], A[random(n)]); 具体来说,由于在次迭代中的每一次迭代中,都会做出选择之一(概率均等),因此通过计算存在可能的“路径”。因为可能的排列数为不能均匀地将路径数目划分为,该算法不可能产生路径中的每一个等概率排列。(相反,应该使用所谓的Fischer-Yates随机播放,这实际上改变了从[0..n]中选择随机数的调用与从[i..n]中选择随机数的调用;不过,这很无聊。)n nnn nnn nnnn^n n !n!n!n nnnn^n n !n!n! 我想知道的是,天真洗牌有多“糟糕”?更具体地说,令为所有置换的集合,令为通过朴素算法生成的最终置换的路径数,则的渐近行为是什么。功能P (Ñ )P(n)P(n)Ç (ρ )C(ρ)C(\rho)ρ &Element; P (Ñ )ρ∈P(n)\rho\in P(n) M(n)=n!nnmaxρ∈P(n)C(ρ)M(n)=n!nnmaxρ∈P(n)C(ρ)\qquad \displaystyle M(n) = \frac{n!}{n^n}\max_{\rho\in P(n)} C(\rho) 和 m(n)=n!nnminρ∈P(n)C(ρ)m(n)=n!nnminρ∈P(n)C(ρ)\qquad \displaystyle m(n) = \frac{n!}{n^n}\min_{\rho\in P(n)} C(\rho)吗? 首要因素是“标准化”这些值:如果幼稚的随机播放“渐近良好”,则 limn→∞M(n)=limn→∞m(n)=1limn→∞M(n)=limn→∞m(n)=1\qquad \displaystyle \lim_{n\to\infty}M(n) = \lim_{n\to\infty}m(n) = 1。 我怀疑(基于我见过的一些计算机模拟)实际值的界线是1,但是甚至知道limM(n)limM(n)\lim M(n)是有限的,还是limm(n)limm(n)\lim m(n)是界线的呢? … 33 algorithms algorithm-analysis asymptotics probability-theory randomness
4 O和Ω与最坏情况和最佳情况有何关系? 今天,我们在一次讲座中讨论了一种非常简单的算法,该算法可使用二进制搜索在排序数组中查找元素。我们被要求确定元素数组的渐近复杂度。nnn 我的想法是,显然,或更具体,因为\ log_2 n是最坏情况下的操作数。但是我可以做得更好,例如,如果我第一次点击搜索到的元素-那么下界是\ Omega(1)。O(logn)O(logn)O(\log n)O(log2n)O(log2n)O(\log_2 n)log2nlog2n\log_2 nΩ(1)Ω(1)\Omega(1) 讲师将解决方案表示为Θ(logn)Θ(logn)\Theta(\log n)因为我们通常只考虑算法的最坏情况输入。 但是,仅考虑最坏的情况时,如果给定问题的所有最坏情况具有相同的复杂度(\ Theta是我们所需要的,对吗?),用OOO和ΩΩ\Omega意义何在?ΘΘ\Theta 我在这里想念什么? 33 algorithm-analysis asymptotics landau-notation reference-question
2 为什么C的void类型不同于Empty / Bottom类型? 维基百科以及我发现的其他来源都将C的void类型列为单位类型,而不是空类型。我觉得这很混乱,因为在我看来,它void更适合于空/底类型的定义。 void据我所知,没有价值观存在。 返回类型为void的函数指定该函数不返回任何内容,因此只能执行某些副作用。 类型的指针void*是所有其他指针类型的子类型。同样,void*在C中进行来回转换是隐式的。 我不确定最后一点是否可以作为void空类型的参数,void*或多或少是与无关的特例void。 另一方面,void它本身不是所有其他类型的子类型,据我所知,这是将类型作为底部类型的要求。 28 type-theory c logic modal-logic coq equality coinduction artificial-intelligence computer-architecture compilers asymptotics formal-languages asymptotics landau-notation asymptotics turing-machines optimization decision-problem rice-theorem algorithms arithmetic floating-point automata finite-automata data-structures search-trees balanced-search-trees complexity-theory asymptotics amortized-analysis complexity-theory graphs np-complete reductions np-hard algorithms string-metrics computability artificial-intelligence halting-problem turing-machines computation-models graph-theory terminology complexity-theory decision-problem polynomial-time algorithms algorithm-analysis optimization runtime-analysis loops turing-machines computation-models recurrence-relation master-theorem complexity-theory asymptotics parallel-computing landau-notation terminology optimization decision-problem complexity-theory polynomial-time counting coding-theory permutations encoding-scheme error-correcting-codes machine-learning natural-language-processing algorithms graphs social-networks network-analysis relational-algebra constraint-satisfaction polymorphisms algorithms graphs trees
1 给定长度的常规语言中单词数量的渐近性 对于常规语言,令为长度为中的单词。使用约旦规范形式(应用于的某些DFA的无注释转换矩阵),可以证明对于足够大的, 其中是复数多项式,是复数“特征值”。(对于小,我们可能具有形式的附加项,其中如果且为且Ç Ñ(大号)大号ñ 大号Ñ Ç Ñ(大号)= ķ Σ我= 1个 P 我(Ñ )λ Ñ 我,P 我λ 我 Ñ Ç ķ [ Ñ = ķ ] [ Ñ = ķ ] 1 ñ = ķ 0大号LLCñ(大号)cn(L)c_n(L)大号LLñnn大号LLñnnCñ(L )= ∑我= 1ķP一世(n )λñ一世,cn(L)=∑i=1kPi(n)λin, c_n(L) = \sum_{i=1}^k P_i(n) \lambda_i^n, P一世PiP_iλ一世λi\lambda_iñnnCķ[ n = k ]Ck[n=k]C_k[n=k][ n = … 28 formal-languages reference-request regular-languages asymptotics combinatorics
10 “对于较小的n值,可以将O(n)视为O(1)” 我已经听过好几次了,对于足够小的n值,可以将O(n)视为/视为O(1)。 范例: 这样做的动机是基于这样一个错误的观念:O(1)总是比O(lg n)更好,总是比O(n)更好。仅当在实际条件下问题的大小实际变大时,运算的渐近顺序才有意义。如果n保持很小,那么每个问题都是O(1)! 什么足够小?10个?100?一千 您在什么时候说“我们不能再将其视为免费手术了”?有经验法则吗? 这似乎可能是特定于域或特定于案例的,但是关于如何考虑这一点是否有一般的经验法则呢? 26 asymptotics
2 具有在摊销时间内搜索,插入和删除的数据结构 是否有数据结构可维护在摊销时间内支持以下操作的有序列表?O(1)Ø(1个)O(1) GetElement(k):返回列表的第个元素。kķk InsertAfter(x,y):将新元素y插入x后面的列表中。 Delete(x):从列表中删除x。 对于最后两个操作,您可以假定x是直接作为指向数据结构的指针而给出的。InsertElement返回y的相应指针。InsertAfter(NULL,y)在列表的开头插入y。 例如,从一个空的数据结构开始,以下操作将更新有序列表,如下所示: InsertAfter(NULL,a) ⟹⟹\implies [一种] InsertAfter(NULL,b) ⟹⟹\implies [b,a] InsertAfter(b,c) ⟹⟹\implies [b,c,a] InsertAfter(a,d) ⟹⟹\implies [b,c,a,d] 删除(c) ⟹⟹\implies [b,a,d] 在这五个更新之后,GetElement(2)应该返回d,而GetElement(3)应该返回一个错误。 25 data-structures time-complexity asymptotics amortized-analysis
5 O(mn)被认为是“线性”或“二次”增长吗? 如果我有一个函数,其时间复杂度为O(mn),其中m和n是其两个输入的大小,我们将其时间复杂度称为“线性”(因为在m和n中均为线性)或“二次”(因为它是两种尺寸的产品)?或者是其他东西? 我觉得称它为“线性”是令人困惑的,因为O(m + n)也是线性的,但速度要快得多,但是我觉得称其为“二次数”也是很奇怪的,因为它在每个变量中都是线性的。 24 terminology asymptotics landau-notation