Questions tagged «algorithm-analysis»

有关确定算法属性的科学和技术的问题,通常包括正确性,运行时和空间使用情况。使用[runtime-analysis]标记可查询有关算法运行时间的问题。


2
为什么增加对数概率比相乘概率快?
为了解决这个问题,在计算机科学中,我们经常要计算以下几种概率的乘积: P(A,B,C) = P(A) * P(B) * P(C) 最简单的方法就是将这些数字相乘,这就是我要做的。但是,老板说最好添加概率的日志: log(P(A,B,C)) = log(P(A)) + log(P(B)) + log(P(C)) 这给出了对数概率,但是如果需要,我们可以在以后获得概率: P(A,B,C) = e^log(P(A,B,C)) 日志添加被认为更好,原因有两个: 它防止“下溢”,因为下溢的概率乘积如此之小,以至于四舍五入为零。由于概率通常很小,因此这通常是一种风险。 它之所以快,是因为许多计算机体系结构执行加法的速度比乘法快。 我的问题是关于第二点。这就是我所看到的描述方式,但是没有考虑获取日志的额外费用!我们应该将“原木成本+加成成本”与“乘法成本”进行比较。考虑到这一点,它还会变小吗? 同样,Wikipedia页面(对数概率)在这方面令人困惑,指出“转换为对数格式很昂贵,但是只发生一次。” 我不明白这一点,因为我认为您需要在添加之前独立记录每个术语的日志。我想念什么? 最后,“计算机执行加法的速度比乘法快”的说法有点含糊。这是特定于x86指令集的,还是处理器体系结构的一些更基本的特征?

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

7
有什么特点
有时候,仔细检查一下,很容易确定算法的时间复杂度。具有两个嵌套循环算法显然为。该探索的所有可能的组合的算法两个值中的基团是明显。N 2 N 2 NñNNñ2N2N^2ñNN2ñ2N2^N 但是,我不知道如何“发现”具有复杂度的算法。例如,递归mergesort实现就是一个。mergesort或其他算法的共同特征是什么,如果我正在分析的话会给我一个提示?Θ (N log N )Θ (N日志ñ)Θ(Nlog⁡N)\Theta(N \log N)Θ (N日志ñ)Θ(Nlog⁡N)\Theta(N \log N) 我敢肯定,算法具有复杂度的方法不止一种,因此任何答案都值得赞赏。顺便说一句,我正在寻求一般特征和提示,而不是严格的证明。Θ (N日志ñ)Θ(Nlog⁡N)\Theta(N \log N)

5
Collat​​z递归运行多长时间?
我有以下Python代码。 def collatz(n): if n <= 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{ …

1
Ukkonen算法的运行时间如何取决于字母大小?
我担心Ukkonen算法的渐近运行时间问题,它可能是在线性(?)时间构造后缀树的最流行算法。 这是丹·古斯菲尔德(Dan Gusfield)撰写的《关于字符串,树和序列的算法》(第6.5.1节)的引用: “ ... Aho-Corasick,Weiner,Ukkonen和McCreight算法都需要空间,或者O (m )时限应替换为O (m log m )和O的最小值(m log | Σ |) ”。Θ (m | Σ |)Θ(米|Σ|)\Theta(m|\Sigma|)O (米)Ø(米)O(m)Ø (米日志m )Ø(米日志⁡米)O(m \log m)Ø (米日志| Σ | )Ø(米日志⁡|Σ|)O(m \log|\Sigma|) [ 是字符串长度,Σ是字母的大小]米米mΣΣ\Sigma 我不明白为什么这是真的。 空间:好吧,如果我们使用大小为数组表示节点外的分支,那么实际上,我们最终会占用Θ (m | Σ |)空间。但是,据我所知,还可以使用哈希表(例如Python中的字典)存储分支。这样一来,我们将只将Θ (m )指针存储在所有哈希表中(因为树中有Θ (m )个边),同时仍然能够访问O (1 )中的子节点。Θ(|Σ|)Θ(|Σ|)\Theta(|\Sigma|)Θ (米|Σ|)Θ(m|Σ|)\Theta(m|\Sigma|)Θ (米)Θ(m)\Theta(m)Θ (米)Θ(米)\Theta(m)Ô (1 )Ø(1个)O(1) …


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

2
更难的是:对已排序的牌组进行混洗还是对经过改组的牌组进行分类?
您有不同元素组成的数组。您可以访问比较器(一个黑盒函数接受两个元素a和b并返回true iff a &lt; b)和一个真正随机的位源(一个黑盒函数不接受任何参数并返回一个独立的均匀随机位)。请考虑以下两个任务:nnnaaabbba&lt;ba&lt;ba < b 该数组当前已排序。产生均匀(或近似均匀)的随机选择排列。 该数组由自然而然随机选择的一些排列组成。产生一个排序的数组。 我的问题是 哪个任务需要渐近的能量? 我无法更精确地定义问题,因为我对信息论,热力学或其他任何需要回答此问题的知识都不了解。但是,我认为这个问题可以定义得很清楚(希望有人在回答这个问题时能帮助我!)。 现在,按照算法,我的直觉是它们相等。请注意,每种排序都是相反的顺序,反之亦然。排序需要比较,而洗牌,因为它从选取的随机排列ñ !选择,需要登录n !≈ ñ 日志ñ随机位。改组和排序都需要大约n次交换。logn!≈nlognlog⁡n!≈nlog⁡n\log n! \approx n \log nn!n!n!logn!≈nlognlog⁡n!≈nlog⁡n\log n! \approx n \log nnnn 但是,我觉得应该采用兰道尔原理来回答,该原理说需要一点能量来“擦除”。直觉上,我认为这意味着对数组进行排序更加困难,因为它需要“擦除” 位信息,从低能量,高熵的无序基态到高度有序的状态。但另一方面,对于任何给定的计算,排序只是将一个排列转换为另一个排列。由于我是一个完全的非专家,所以我希望了解物理学的人可以帮助“解决”这个问题!nlognnlog⁡nn \log n (该问题在math.se上没有得到任何答案,因此我将其重新张贴在这里。希望可以。)

2
随机快速排序的优点是什么?
在他们的著作随机化算法, Motwani和拉加打开与他们的RandQS功能的说明引入-随机快速排序-其中所述枢轴,用于将所述组分成两个部分,是随机选择。 一段时间以来,我一直在绞尽脑汁(虽然动力不足),但是我无法看到该算法比每次简单地选择中间元素(索引而不是大小)有什么优势。 我想我看不到这是什么:如果初始集合是按随机顺序排列的,那么在集合中随机位置拾取元素和在固定位置拾取元素之间有什么区别? 有人可以简单地启发我吗?

4
算法中的递归和生成函数
组合学在计算机科学中起着重要作用。我们经常在分析以及算法设计中使用组合方法。例如,一种用于在图形中查找ķķk顶点覆盖集的方法可能只是检查所有( nķ)(ñķ)\binom{n}{k}可能的子集。尽管二项式函数呈指数增长,但如果ķķk是某个固定常数,我们将通过渐近分析得出多项式时间算法。 通常,现实生活中的问题需要更复杂的组合机制,我们可以根据复发情况定义这些机制。一个著名的例子是斐波那契数列(天真的)定义为: F(n )= ⎧⎩⎨1个0F(n − 1 )+ f(n − 2 )如果 n = 1如果 n = 0除此以外F(ñ)={1个如果 ñ=1个0如果 ñ=0F(ñ-1个)+F(ñ-2)除此以外f(n) = \begin{cases} 1 & \text{if } n = 1 \\ 0 & \text{if } n = 0 \\ f(n-1) + f(n-2) & \text{otherwise} \end{cases} 现在,使用该递归计算第ññn个项的值呈指数增长,但是由于有了动态编程,我们可以在线性时间内对其进行计算。现在,并不是所有的递归都适合于DP(即阶乘函数),但是当将某些计数定义为递归而不是生成函数时,它是潜在的可利用属性。 生成函数是一种对给定结构进行形式化计数的优雅方法。也许最著名的是定义为的二项式生成函数: (x + y)α= …

4
为什么不对链接列表使用快速排序?
快速排序算法可以分为以下步骤 确定枢纽。 根据数据透视表对链接列表进行分区。 将链表递归分为两部分。 现在,如果我始终选择最后一个元素作为枢轴,那么识别枢轴元素(第一步)将花费时间。O(n)O(n)\mathcal O(n) 识别枢轴元素之后,我们可以存储其数据并将其与所有其他元素进行比较以识别正确的分区点(第二步)。当我们存储数据透视表数据时,每个比较将花费时间,而每个交换将花费O(1 )时间。因此,总共需要n 个元素的O(n )时间。O(1)O(1)\mathcal O(1)O(1)O(1)\mathcal O(1)O(n)O(n)\mathcal O(n)nnn 因此,递归关系为: 是 O(n log n ),它与带有链接列表的合并排序中的相同。T(n)=2T(n/2)+nT(n)=2T(n/2)+nT(n) = 2T(n/2) + nO(nlogn)O(nlog⁡n)\mathcal O(n \log n) 那么,为什么对链表而言合并排序比快速排序更受青睐?

1
蛮力Delaunay三角剖分算法的复杂度
在马克·德·伯格等人的“计算几何:算法和应用”一书中,有一种非常简单的蛮力算法,用于计算Delaunay三角剖分。该算法使用了非法边的概念-可能不会出现在有效Delaunay三角剖分中的边,必须用其他一些边替换。在每个步骤中,该算法仅查找这些非法边缘并执行所需的位移(称为“ 边缘翻转”),直到没有非法边缘为止。 算法LegalTriangulation(TTT) 输入。一些三角TTT点集的PPP。 输出。的合法三角剖分PPP。 而 TTT包含非法边缘pipjpipjp_ip_j do \quad让pipjpkpipjpkp_i p_j p_k和pipjplpipjplp_i p_j p_l邻近于两个三角形pipjpipjp_ip_j。 \quad从T删除,然后添加p k p l。返回牛逼。pipjpipjp_ip_jTTTpkplpkplp_kp_l TTT 我听说这种算法在最坏的情况下会在时间内运行;但是,我不清楚这句话是否正确。如果是,如何证明这一上限?O(n2)O(n2)O(n^2)

4
Quicksort向孩子们解释
去年,我读了一篇有关“幼儿园量子力学”的精彩论文。这不是件容易的事。 现在,我想知道如何用最简单的词来解释quicksort。我如何证明(或至少是手波)平均复杂度为,对于幼儿园班级,最佳和最差情况是什么?还是至少在小学?Ø (ñ日志n )Ø(ñ日志⁡ñ)O(n \log n)

2
堆-给出
最有可能在问过这个问题。来自CLRS(第二版)问题6.5-8- 给出一个时间算法,将k个排序列表合并为一个排序列表,其中n是所有输入列表中元素的总数。(提示:请使用最小堆进行k向合并。)O(nlgk)O(nlg⁡k)O(n \lg k)kkknnnkkk 由于有排序的列表且总共有n个值,所以我们假设每个列表包含n个kkknnn数字,而且每个列表都严格按升序排序,结果也将按升序存储。nknk\frac{n}{k} 我的伪代码看起来像这样- list[k] ; k sorted lists heap[k] ; an auxiliary array to hold the min-heap result[n] ; array to store the sorted list for i := 1 to k ; O(k) do heap[i] := GET-MIN(list[i]) ; pick the first element ; and keeps track of …

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.