Questions tagged «algorithms»

算法是定义明确的问题解决方案的一系列明确定义的步骤。如果您的问题与算法的设计和分析有关,请使用此标签。

5
更快的算法在理论计算机科学中意味着什么?
如果针对某个问题A 有一个在时间运行的算法,而有人提出了一个在时间运行的算法,其中,它是否被认为是对先前算法的改进?O (f (n )/ g (n ))g (n )= o (f (n ))O(f(n))O(f(n))O(f(n))O(f(n)/g(n))O(f(n)/g(n))O(f(n)/g(n))g(n)=o(f(n))g(n)=o(f(n))g(n) = o(f(n)) 在理论计算机科学的背景下,提出这样的算法是否有意义?
18 algorithms 

3
为什么没有针对SAT和其他决策问题的近似算法?
我有一个NP完全决策问题。给定问题的一个实例,我想设计一种算法,如果问题可行,则输出YES,否则输出NO。(当然,如果算法不是最佳算法,则会出错。) 对于此类问题,我找不到任何近似算法。我一直在寻找SAT,并且在Wikipedia页面上有关近似算法的内容如下:该方法的另一个局限性是它仅适用于优化问题,而不适用于“纯粹”的决策问题,例如可满足性,尽管通常可以.. 。 例如,为什么我们不将近似率定义为与算法犯错的数量成正比呢?我们如何实际以贪婪和次优方式解决决策问题?

2
垂直能见度问题的高效算法
在思考一个问题时,我意识到我需要创建一种有效的算法来解决以下任务: 问题:我们给了nnn边的二维方盒,其边与轴平行。我们可以从顶部进行调查。但是,也有mmm水平段。每段具有的整数yyy -协调(0≤y≤n0≤y≤n0 \le y \le n)和xxx坐标- (0≤x1&lt;x2≤n0≤x1&lt;x2≤n0 \le x_1 < x_2 \le n)并连接点(x1,y)(x1,y)(x_1,y)和(x2,y)(x2,y)(x_2,y)(看下图)。 我们想知道,对于框顶部的每个单元段,如果我们仔细观察该段,可以在框内垂直看到多深。 x∈{0,…,n−1}x∈{0,…,n−1}x \in \{0,\dots,n-1\}maxi: [x,x+1]⊆[x1,i,x2,i]yimaxi: [x,x+1]⊆[x1,i,x2,i]yi\max_{i:\ [x,x+1]\subseteq[x_{1,i},x_{2,i}]} y_i 示例:给定和分段,如下图所示,结果为。看看有多深的光线可以进入盒子。米= 7 (5 ,5 ,5 ,3 ,8 ,3 ,7 ,8 ,7 )n=9n=9n=9m=7m=7m=7(5,5,5,3,8,3,7,8,7)(5,5,5,3,8,3,7,8,7)(5, 5, 5, 3, 8, 3, 7, 8, 7) 对我们来说幸运的是,和都非常小,我们可以离线进行计算。米nnnmmm 解决此问题的最简单算法是蛮力:对于每个段,遍历整个数组并在必要时进行更新。然而,它给我们不是很可观。O(mn)O(mn)O(mn) 很大的改进是使用了一个片段树,该树能够在查询过程中最大化片段上的值并读取最终值。我不会进一步描述它,但是我们看到时间复杂度是。O((m+n)logn)O((m+n)log⁡n)O((m+n) \log n) 但是,我想出了一个更快的算法: 大纲: 按坐标的降序对段进行排序(线性时间使用计数排序的变化)。现在注意,如果以前任何段都被任何段覆盖,则随后的任何段都不能再束缚通过该段的光束。然后,我们将从框的顶部到底部进行扫线。yyyxxxxxx …

3
测试语言是否无上下文的算法
是否有一种算法/系统程序来测试一种语言是否不受上下文限制? 换句话说,在给定的代数形式指定的语言(想到像),测试的语言是否是与否上下文无关。想象一下,我们正在编写一个Web服务,以帮助学生完成所有作业。您指定语言,Web服务将输出“无上下文”或“无上下文”。有没有什么好的方法可以自动执行此操作?L={anbnan:n∈N}L={anbnan:n∈N}L=\{a^n b^n a^n : n \in \mathbb{N}\} 当然,还有一些用于手动证明的技术,例如抽运引理,奥格登引理,帕里克引理,互换引理等等。但是,它们每个人都需要在某个时候进行手动洞察,因此尚不清楚如何将它们中的任何一种转化为算法。 我看到Kaveh在其他地方写过,非上下文无关的语言集不是可递归枚举的,因此似乎没有希望任何算法都能在所有可能的语言上运行。因此,我认为Web服务将需要能够输出“无上下文”,“非上下文”或“我无法分辨”。在教科书中很可能会看到的多种语言上,是否有除“我无法分辨”以外的其他算法通常能够提供答案?您将如何构建这样的Web服务? 为了使这个问题更好地解决,我们需要确定用户如何指定语言。我愿意接受建议,但我在想这样的事情: L={E:S}L={E:S}L = \{E : S\} 其中是一个单词表达式,S是一个在长度变量上的线性不等式的系统,具有以下定义:EEESSS 每个就是一个字表达。(这些代表可以容纳∑ ∗中任何单词的变量。)x,y,z,…x,y,z,…x,y,z,\dotsΣ∗Σ∗\Sigma^* 中的每一个都是单词表达。(示例性地,Σ = { a ,b ,c ,… },因此a ,b ,c ,…表示基础字母中的单个符号。)a,b,c,…a,b,c,…a,b,c,\dotsΣ={a,b,c,…}Σ={a,b,c,…}\Sigma=\{a,b,c,\dots\}a,b,c,…a,b,c,…a,b,c,\dots 每是一个字表达式中,如果η是一个长度可变。aη,bη,cη,…aη,bη,cη,…a^\eta,b^\eta,c^\eta,\dotsηη\eta 单词表达的串联是单词表达。 每个的是一个长度可变。(这些代表可以包含任何自然数的变量。)m,n,p,q,…m,n,p,q,…m,n,p,q,\dots 每个是长度可变的。(这些代表相应单词的长度。)|x|,|y|,|z|,…|x|,|y|,|z|,…|x|,|y|,|z|,\dots 这似乎足以处理我们在教科书练习中看到的许多情况。当然,如果愿意,您可以替换以代数形式指定语言的任何其他文本方法。

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
元素变化时计算逆矩阵
给定矩阵。让的逆矩阵是(即,)。假设中的一个元素已更改(例如,更改)。目的是在此更改后找到。有没有找到一种比从头重新计算逆矩阵更有效的方法来找到这个目标。n×nn×nn \times nAA\mathbf{A}AA\mathbf{A}A−1A−1\mathbf{A}^{-1}AA−1=IAA−1=I\mathbf{A}\mathbf{A}^{-1} = \mathbf{I}AA\mathbf{A}aijaija _{ij}a′ijaij′a' _{ij}A−1A−1\mathbf{A}^{-1}

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)α= …

8
为什么我们可以假设算法可以表示为位字符串?
我开始读一本关于计算复杂性和图灵机的书。这是报价: 一旦确定某种规范编码,就可以将算法(即机器)表示为位字符串。 提供此断言只是一个简单的事实,但我无法理解。 例如,如果我有一个算法,将作为输入并计算或:(x + 1 )2XXx(x + 1)2(X+1个)2(x+1)^2 int function (int x){ x = x + 1; return x**2; } 如何使用字母将其表示为字符串?{ 0 ,1 }∗{0,1个}∗\{0, 1\}^*

1
在两个或三个查询中找到一个多项式
黑框表示我可以在任意点求值多项式。f (x )f(x)f(x)f(x)f(x)f(x)f(x) 输入:度为的单项多项式的黑盒。df(x)∈Z+[x]f(x)∈Z+[x]f(x) \in\mathbb{Z}^+[x]ddd 输出:多项式的系数。dddf(x)f(x)f(x) 我的算法:让 f(x)=xd+ad−1xd−1+⋯+a1x+a0f(x)=xd+ad−1xd−1+⋯+a1x+a0f(x) = x^{d} + a_{d-1} x^{d-1} + \cdots + a_1 x + a_0 评价多项式在使用黑盒子的许多点,并得到线性方程的系统。现在,我可以求解线性方程组以获得所需的系数。f(x)f(x)\mathcal{f(x)}ddd 但是,在这种情况下,我需要许多对黑匣子的查询。我想减少查询数量。有什么方法可以将查询数量减少到两个或三个吗?O(d)O(d)\mathcal{O(d)}

3
使用NIL表示空节点的目的是什么?
在我的算法和数据结构课程中,教授,幻灯片和这本书(算法简介,第3版)都使用了这个词NIL来表示例如不存在的节点(在树中)的子代。 有一次,在一次演讲中NIL,我的同学没有说,而是null教授纠正了他,而我不明白为什么教授强调这个词。 人们为什么使用单词NIL代替null,或none或任何其他单词?是否NIL具有其他人没有的某些特定含义?有历史原因吗? 请注意,我在网络上也看到了一些地方,例如,使用单词null代替NIL,但是通常使用最后一个。

4
查找一对不重叠的位向量
我给您列出了宽度为的n个位nn向量。您的目标是从列表中返回两个不共有1的位向量,或者报告不存在这样的对。ķkk 例如,如果我给您那么唯一的解决方案是。可替代地,输入没有解。任何包含全零位向量和另一个元素都具有平凡的解。[ 00110 ,01100 ,11000 ] [00110,01100,11000][00110, 01100, 11000]{ 00110 ,11000 } {00110,11000}\{00110, 11000\}[ 111 ,011 ,110 ,101 ] [111,011,110,101][111, 011, 110, 101]000 ... 0 000...0000...0Ë ee{ é ,000 ... 0 }{e,000...0}\{e, 000...0\} 这是一个稍微困难一点的示例,没有解决方案(每行都是位向量,黑色正方形为1s,白色正方形为0s): ■ ■ ■ ■ □ □ □ □ □ □ □ □ □ ■ □ □ …

4
这个有限图问题可以判定吗?哪些因素可以决定问题?
我想知道以下问题是否可以确定以及如何找出。我看到的每个问题都可以对它说“是”或“否”,因此,除了少数几个问题(此处提供)以外,大多数问题和算法是否可以确定? 输入:有向图和有限图,其中v和u为顶点 问:G中是否存在以u为初始顶点和v为最终顶点的路径?GGGvvvuuuGGGuuuvvv

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) 那么,为什么对链表而言合并排序比快速排序更受青睐?

3
可被n整除的最大和
我在StackOverflow上问了这个问题,但我认为这是一个更合适的地方。 这是算法概论课程中的一个问题: 您有aaa包含nnn正整数的数组a(该数组无需排序或元素唯一)。建议使用O(n)O(n)O(n)算法查找可被整除的元素的最大和nnn。 例如: a=[6,1,13,4,9,8,25],n=7a=[6,1,13,4,9,8,25],n=7a = [6, 1, 13, 4, 9, 8, 25], n = 7。答案是565656(与元件6,13,4,8,256,13,4,8,256, 13, 4, 8, 25) 这是比较容易找到它O(n2)O(n2)O(n^2)使用动态编程和存储与余最大的一笔0,1,2,...,n−10,1,2,...,n−10, 1, 2,..., n - 1。 另外,如果我们将注意力集中在元素的连续序列上,则可以通过存储部分和以n为模的总和来轻松地在O(n)O(n)O(n)时间内找到最佳的此类序列:让S [ i ] = a [ 0 ] + a [ 1 ] + ⋯ + 一个[ 我],对于每个剩余ř记住最大索引Ĵ使得小号[ Ĵ ] ≡ řnnnS[i]=a[0]+a[1]+⋯+a[i]S[i]=a[0]+a[1]+⋯+a[i]S[i]=a[0]+a[1]+\dots + …

2
什么时候两种常规语言的连接才是明确的?
由于语言的和乙,让我们说,他们的级联一乙是明确的,如果所有的单词w ^ ∈ 一乙,恰好有一个分解w ^ = 一b有一个∈ 一和b ∈ 乙,和暧昧否则。(我不知道该属性是否存在一个确定的术语,这很难搜索!)作为一个简单的示例,{ ε ,a }与自身的串联是不明确的(w = aAAABBBABABABw∈ABw∈ABw \in ABw=abw=abw = aba∈Aa∈Aa \in Ab∈Bb∈Bb \in B{ε,a}{ε,a}\{\varepsilon, \mathrm{a}\}),但的级联 { 一个 }与本身是明确的。w=a=εa=aεw=a=εa=aεw = \mathrm{a} = \varepsilon \mathrm{a} = \mathrm{a} \varepsilon{a}{a}\{\mathrm{a}\} 是否有一种算法来确定两种常规语言的连接是否明确?

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.