This commit is contained in:
krahets
2023-08-06 23:19:19 +08:00
parent 63f09480fa
commit 983524db0f
11 changed files with 239 additions and 138 deletions

View File

@@ -3423,19 +3423,22 @@
<h2 id="241-q-a">2.4.1. &nbsp; Q &amp; A<a class="headerlink" href="#241-q-a" title="Permanent link">&para;</a></h2>
<div class="admonition question">
<p class="admonition-title">尾递归的空间复杂度是 <span class="arithmatex">\(O(1)\)</span> 吗?</p>
<p>理论上,尾递归函数的空间复杂度可以被优化至 <span class="arithmatex">\(O(1)\)</span> 。不过绝大多数编程语言(例如 Java, Python, C++, Go, C# 等)
都不支持自动优化尾递归,因此一般来说空间复杂度是 <span class="arithmatex">\(O(n)\)</span></p>
<p>理论上,尾递归函数的空间复杂度可以被优化至 <span class="arithmatex">\(O(1)\)</span> 。不过绝大多数编程语言(例如 Java, Python, C++, Go, C# 等)都不支持自动优化尾递归,因此通常认为空间复杂度是 <span class="arithmatex">\(O(n)\)</span></p>
</div>
<div class="admonition question">
<p class="admonition-title">函数和方法这两个术语的区别是什么?</p>
<p>函数function可以独立被执行所有参数都以显式传递。
方法method与一个对象关联方法被隐式传递给调用它的对象方法能够对类的实例中包含的数据进行操作。</p>
<p>因此C 和 Go 只有函数Java 和 C# 只有方法,在 C++, Python 中取决于它是否属于一个类。</p>
<p>函数function可以独立被执行所有参数都以显式传递。方法method与一个对象关联方法被隐式传递给调用它的对象方法能够对类的实例中包含的数据进行操作。</p>
<p>以几个常见的编程语言为例:</p>
<ul>
<li>C 语言是过程式编程语言没有面向对象的概念所以只有函数。但我们可以通过创建结构struct来模拟面向对象编程与结构体相关联的函数就相当于其他语言中的方法。</li>
<li>Java, C# 是面向对象的编程语言,代码块(方法)通常都是作为某个类的一部分。静态方法的行为类似于函数,因为它被绑定在类上,不能访问特定的实例变量。</li>
<li>C++, Python 既支持过程式编程(函数)也支持面向对象编程(方法)。</li>
</ul>
</div>
<div class="admonition question">
<p class="admonition-title">图片“空间复杂度的常见类型”反映的是否是占用空间的绝对大小?</p>
<p>不是,该图片展示的是空间复杂度(即增长趋势),而不是占用空间的绝对大小。每个曲线都包含一个常数项,用来把所有曲线的取值范围压缩到一个视觉舒适的范围内。
实际中,因为我们通常不知道每个方法的“常数项”复杂度是多少,所以一般无法仅凭复杂度来选择 <span class="arithmatex">\(n = 8\)</span> 之下的最优解法;但相对地 <span class="arithmatex">\(n = 8^5\)</span> 就很好选了,这是复杂度占主导的情况。</p>
<p>不是,该图片展示的是空间复杂度(即增长趋势),而不是占用空间的绝对大小。每个曲线都包含一个常数项,用来把所有曲线的取值范围压缩到一个视觉舒适的范围内。</p>
<p>实际中,因为我们通常不知道每个方法的“常数项”复杂度是多少,所以一般无法仅凭复杂度来选择 <span class="arithmatex">\(n = 8\)</span> 之下的最优解法;但相对地 <span class="arithmatex">\(n = 8^5\)</span> 就很好选了,这是复杂度占主导的情况。</p>
</div>