Questions tagged «runtime-analysis»

有关用于估计随着输入大小增加算法的运行时间增加的方法的问题。

3
算法分析的魔力背后是否有一个系统?
关于如何分析算法的运行时间存在很多问题(例如,参见运行时分析和算法分析)。许多都是类似的,例如那些要求对嵌套循环或分而治之算法进行成本分析的方法,但是大多数答案似乎都是量身定制的。 另一方面,另一个通用问题的答案通过一些示例解释了更大的图景(尤其是关于渐近分析),但没有说明如何弄脏您的手。 有没有一种结构化的,通用的方法来分析算法的成本?成本可能是运行时间(时间复杂度),也可能是某种其他成本度量,例如执行的比较次数,空间复杂度或其他。 这应该成为一个参考问题,可以用来指导初学者。因此其范围比平常大。请小心给出一般的,有说服力的答案,至少由一个示例说明了这一点,但仍然涵盖了许多情况。谢谢!

4
(何时)哈希表查找为O(1)?
人们通常说哈希表查找是在恒定时间内进行的:您计算哈希值,这将为数组查找提供索引。但这忽略了碰撞。在最坏的情况下,每一项都恰好落在同一存储桶中,并且查找时间变为线性()。Θ(n)Θ(n)\Theta(n) 数据上是否存在可以使哈希表查找真正变为?这是仅是平均水平,还是哈希表可以进行最坏情况查找?O (1 )O(1)O(1)O(1)O(1)O(1)O(1) 注意:我是从程序员的角度出发的;当我将数据存储在哈希表中时,它几乎总是字符串或某些复合数据结构,并且数据在哈希表的生存期内发生变化。因此,尽管我欣赏有关完美哈希的答案,但从我的观点来看,它们很可爱,但很有趣,而且不切实际。 PS跟进:哈希表操作O(1)适用于哪种数据?

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)吗?

3
为什么二元搜索比三元搜索快?
在搜索的阵列使用二进制搜索元素需要,在最坏情况下日志2次 Ñ迭代因为,在每一个步骤中,我们修剪我们的搜索空间的一半。相反,如果我们使用“三元搜索”,则每次迭代都将减少三分之二的搜索空间,因此最坏的情况应该是log 3 N &lt; log 2 N迭代...ññN日志2ñ日志2⁡ñ\log_2 N日志3ñ&lt; 日志2ñ日志3⁡ñ&lt;日志2⁡ñ\log_3 N < \log_2 N 似乎三元搜索更快,那么为什么要使用二元搜索呢?

3
如何为功能语言建模算法复杂度?
算法复杂度被设计为与较低级别的细节无关,但是它基于命令式模型,例如,数组访问和修改树中的节点需要O(1)时间。在纯功能语言中不是这种情况。Haskell列表需要线性时间才能访问。修改树中的节点需要制作树的新副本。 那么功能语言是否应该有替代的算法复杂性建模?

2
为什么二进制搜索的big-O中的日志不是以2为底的?
我是了解计算机科学算法的新手。我了解二进制搜索的过程,但是我对其效率有些误解。 在元素的大小中,平均需要步骤才能找到特定元素。取双方的底数为2的对数,得出。那么二分查找算法的平均步数不是吗? n log 2(s )= n log 2(s )s=2ns=2ns = 2^nnnnlog2(s)=nlog2⁡(s)=n\log_2(s) = nlog2(s)log2⁡(s)\log_2(s) 维基百科有关二进制搜索算法的文章说,平均性能为。为什么会这样呢?为什么这个数字不是?log 2(n )O(logn)O(log⁡n)O(\log n)log2(n)log2⁡(n)\log_2(n)

3
硬件/实现会影响算法的时间/空间复杂度吗?
我什至都不是CS学生,所以这可能是一个愚蠢的问题,但是请忍受... 在前计算机时代,我们只能用抽屉数组来实现数组数据结构。由于一个有定位与从它提取值之前对应的索引的抽屉,阵列查找的时间复杂度是,假设二进制搜索。Ø(升Ò 克(n ))Ø(升ØG(ñ))O(log(n)) 但是,计算机的发明产生了很大的变化。现代计算机可以如此快速地从其RAM中读取数据,因此我们现在认为数组查找的时间复杂度为(即使从技术上讲也不是这种情况,因为将寄存器移至更远的距离需要花费更多时间,等等)O (1 )Ø(1个)O(1) 另一个例子是Python字典。虽然人们可能会得到一本字典访问的复杂性与病人写重载魔术方法(或可笑的坏运气,即具有大量的散列冲突的键),它通常被认为是Ø (1 )。在这种情况下,时间复杂度既取决于Python字典的哈希表实现,也取决于哈希函数的键的实现。O (n )Ø(ñ)O(n)__hash__O (1 )Ø(1个)O(1) 这是否意味着硬件/实现会影响算法的时间复杂度?(虽然这两个示例都是关于数据结构而不是算法,但后者是建立在前者之上的,而且我从未听说过数据结构的时间复杂性,因此在这里我使用术语“算法”) 对我来说,算法是抽象的和概念性的,它们的属性(例如时间/空间复杂度)不应受到是否以特定方式实现而受到影响,但它们是吗?

3
为什么选择排序比气泡排序快?
维基百科上写道:“ ...选择排序几乎总是胜过气泡排序和侏儒排序。” 任何人都可以向我解释为什么选择排序比气泡排序更快的原因,尽管它们都具有: 最坏情况下的时间复杂度:Ø( ñ2)O(n2)\mathcal O(n^2) 比较数: Ø( ñ2)O(n2)\mathcal O(n^2) 最佳案例时间复杂度: 气泡排序:O(n )O(n)\mathcal O(n) 选择排序:Ø( ñ2)O(n2)\mathcal O(n^2) 平均案件时间复杂度: 气泡排序:Ø( ñ2)O(n2)\mathcal O(n^2) 选择排序:Ø( ñ2)O(n2)\mathcal O(n^2)

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 

3
在运行时边界中是否出现比逆Ackermann增长慢的函数?
一些复杂的算法(联合查找)具有渐近时间复杂度中出现的近似恒定的逆阿克曼函数,如果忽略近似恒定的逆阿克曼项,则它们是最坏情况下的时间最优。 是否有已知算法的运行时间有任何示例,这些算法的运行时间从根本上比逆阿克曼倒数慢(例如,在多项式或指数等变换下不等同于阿克曼的函数倒数)给出了最著名的最坏情况时间解决根本问题的复杂性?

2
如何描述算法,证明和分析算法?
在阅读计算机编程艺术(TAOCP)之前,我没有深入考虑这些问题。我将使用伪代码来描述算法,理解算法并仅估计增长顺序的运行时间。该TAOCP彻底改变了我的脑海里。 TAOCP使用英语加上步骤和goto来描述算法,并使用流程图更轻松地描绘算法。似乎是低级的,但是我发现有一些优点,尤其是流程图,我已经忽略了很多。我们可以在计算遍历该箭头时用关于当前事务状态的断言标记每个箭头,并为该算法提供归纳证明。作者说: 作者的争论是我们真正理解为什么只有当我们达到了我们的思想隐含地填充所有断言的程度时算法才是有效的方法,如图4所示。 我还没有经历过这样的东西。另一个优点是,我们可以计算每个步骤执行的次数。用基尔霍夫的第一定律很容易检查。我没有精确地分析运行时间,因此在估算运行时间时可能会省略一些。±1±1\pm1 分析增长顺序有时是无用的。例如,由于它们都是,因此我们无法区分quicksort和heapsort ,其中是期望的随机变量,因此我们应该分析常数,例如,和,因此我们可以比较和更好。而且,有时我们应该比较其他数量,例如方差。仅对运行时间的增长顺序进行粗略分析是不够的。作为TAOCPE(T(n))=Θ(nlogn)E(T(n))=Θ(nlog⁡n)E(T(n))=\Theta(n\log n)EXEXEXXXXE(T1(n))=A1nlgn+B1n+O(logn)E(T1(n))=A1nlg⁡n+B1n+O(log⁡n)E(T_1(n))=A_1n\lg n+B_1n+O(\log n)E(T2(n))=A2lgn+B2n+O(logn)E(T2(n))=A2lg⁡n+B2n+O(log⁡n)E(T_2(n))=A_2\lg n+B_2n+O(\log n)T1T1T_1T2T2T_2 将算法翻译成汇编语言并计算运行时间,这对我来说太难了,所以我想知道一些技术来更粗略地分析运行时间,这对于C,C ++等高级语言也很有用或伪代码。 我想知道研究工作中主要使用哪种描述风格,以及如何处理这些问题。

5
Collat​​z递归运行多长时间?
我有以下Python代码。 def collatz(n): if n &lt;= 1: return True elif (n%2==0): return collatz(n/2) else: return collatz(3*n+1) 该算法的运行时间是多少? 尝试: 如果表示函数的运行时间。然后,我想我有 T(n)T(n)T(n)collatz(n)⎧⎩⎨T(n)=1 for n≤1T(n)=T(n/2) for n evenT(n)=T(3n+1) for n odd{T(n)=1 for n≤1T(n)=T(n/2) for n evenT(n)=T(3n+1) for n odd\begin{cases} T(n)=1 \text{ for } n\le 1\\ T(n)=T(n/2) \text{ for } n\text{ even}\\ T(n)=T(3n+1) \text{ …


4
为什么随机化快速排序具有O(n log n)的最坏情况运行时间成本
随机快速排序是快速排序的扩展,其中随机选择枢轴元素。该算法在最坏情况下的时间复杂度是多少?据我说,它应该是Ø (ñ2)Ø(ñ2)O(n^2),因为最坏的情况是按排序顺序或反向排序顺序选择随机选择的枢轴。但是在某些文本[1] [2]中,最坏的情况是时间复杂度写为Ø (ñ 日志n)Ø(ñ日志⁡ñ)O(n\log{n}) 对不对

5
哈希表操作O(1)适用于哪种数据?
从(何时)的答案是哈希表查找O(1)?,我收集到,当数据满足某些统计条件时,哈希表具有最坏情况的行为,至少已摊销,并且有一些技术可以使这些条件变宽。O(1)O(1)O(1) 但是,从程序员的角度来看,我事先并不知道我的数据是什么:它通常来自某些外部来源。而且我很少一次拥有所有数据:插入和删除的发生率经常不低于查找率,因此需要对数据进行预处理以微调哈希函数。 因此,迈出一步:在掌握了有关数据源的一些知识之后,如何确定哈希表是否有机会进行操作,以及可能在哈希函数上使用哪些技术?O(1)O(1)O(1)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.