Questions tagged «algorithms»

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

3
识别Watson-Crick回文的空间复杂性
我有以下算法问题: 确定识别作为Watson-Crick回文的DNA字符串的空间图灵复杂性。 Watson-Crick回文是指其原始字符串反向排列的字符串。的补体被定义信明智的,通过DNA启发:A是T的补体和C是G.一个简单的例子的用于WC-回文的补ACGT。 我提出了两种解决方法。 一个需要空间。O(n)O(n)\mathcal{O}(n) 一旦机器完成读取输入。输入磁带必须以相反的顺序复制到工作磁带上。 然后,机器将从左侧读取输入和工作带,并比较每个条目,以验证工作带中的单元格是输入单元格的补充。这需要空间。O(n)O(n)\mathcal{O}(n) 另一个需要空间。O(logn)O(log⁡n)\mathcal{O}(\log n) 在读取输入时。计算输入磁带上的条目数。 输入磁带读完后 将信件的补语复制到工作带上 将字母L复制到工作带的末尾 (循环点)如果计数器= 0,请清除工作带并输入是,然后暂停 如果输入磁带显示L 将输入头向左移动计数器指示的次数(需要第二个计数器) 如果输入磁带显示R 将输入头向右移动计数器指示的次数(需要第二个计数器) 如果保存在工作带上的值的单元格与输入磁带上的当前单元格匹配 将计数器减2 向左或向右移动一个,分别取决于R或L在工作带上 将L或R的补语复制到工作带以代替当前的L或R 继续循环 如果值不匹配,请清除工作带并输入否,然后暂停 这大约占空间,用于存储两个计数器,当前补码和值L或R。2logn+22log⁡n+22\log n+2 我的问题 第一个需要线性时间和空间。第二个需要时间和空间。我从报价中得到了问题,并提出了这两种方法,但是我不知道该选择哪种方法。我只需要说明问题的空间复杂性。n22n22\frac{n^2}{2}lognlog⁡n\log n 我感到困惑的原因 我倾向于说第二个是最好的选择,因为它在时间上比较好,但是答案仅来自我很幸运并想出一种算法。看起来,如果我想给某些东西添加空间复杂性,那么不需要运气就可以得出正确的算法。我想念什么吗?我是否应该甚至提出解决问题的方法来解决空间的复杂性?

1
给定一个字符串和一个CFG,可以在字符串之后跟随哪些字符(以CFG的句子形式)?
令是某些上下文无关文法G的终结符集合,N是非终结符符号G的非终结符集合。ΣΣ\SigmañNNGGG 说我有一个字符串,使得X 一Ý ∈ 小号(ģ )其中X ,ÿ ∈ (Σ ∪ Ñ )*和小号(ģ )是的句型ģ。一个∈ (Σ ∪ Ñ)+a∈(Σ∪N)+a \in (\Sigma \cup N)^+X 一ÿ∈ 小号(G )xay∈S(G)x a y \in \mathcal{S}(G)X ,ÿ∈ (Σ ∪ Ñ)∗x,y∈(Σ∪N)∗x,y\in (\Sigma \cup N)^*小号(G )S(G)\mathcal{S}(G)GGG 鉴于,我想以确定一组C ^ = { b | 瓦特一个b ž ∈ 小号(ģ ),b ∈ Σ ∪ Ñ …

3
使用渐近符号时出错
我试图了解以下重复发生的以下证明有什么问题 T(n)=2T(⌊n2⌋)+nT(n)=2T(⌊n2⌋)+n T(n) = 2\,T\!\left(\left\lfloor\frac{n}{2}\right\rfloor\right)+n T(n)≤2(c⌊n2⌋)+n≤cn+n=n(c+1)=O(n)T(n)≤2(c⌊n2⌋)+n≤cn+n=n(c+1)=O(n) T(n) \leq 2\left(c\left\lfloor\frac{n}{2}\right\rfloor\right)+n \leq cn+n = n(c+1) =O(n) 文档说,因为归纳假设它的错误是 T(n)≤cnT(n)≤cn T(n) \leq cn 我在想什么?

2
在这种平方根边界查找算法中,如何获得循环不变性?
最初在math.SE上,但在那里没有答案。 考虑以下算法。 u := 0 v := n+1; while ( (u + 1) is not equal to v) do x := (u + v) / 2; if ( x * x <= n) u := x; else v := x; end_if end_while 其中u,v和n是整数,除法运算是整数除法。 解释算法计算的结果。 使用您对第一部分的回答作为算法的后置条件,建立循环不变式,并证明算法终止且正确。 在类中,后置条件被发现是和不变是0 ≤ ü 2 ≤ …

3
测试二叉树是否为搜索树并计算完整分支的算法
我需要创建一个递归算法,以查看二叉树是否为二叉搜索树,并用假定的全局计数变量计算有多少个完整分支(一个有左右两个子节点的父节点)。这是我的数据结构类的作业。 到目前为止,我有 void BST(tree T) { if (T == null) return if ( T.left and T.right) { if (T.left.data < T.data or T.right.data > T.data) { count = count + 1 BST(T.left) BST(T.right) } } } 但是我真的无法弄清楚这一点。我知道该算法无法解决问题,因为如果第二个if语句不正确,则计数将为零。 有人可以帮我解决这个问题吗?


5
以可逆方式将有向图转换为无向图
我正在寻找一种算法,以可逆的方式将有向图(有向图)转换为无向图,即,如果我们得到无向图,则该有向图应该是可重构的。我知道这将以无向图具有更多顶点为代价,但是我不介意。 有谁知道该怎么做或可以提出任何建议?提前致谢。 更新:关于下面的AdrianN的答案。这可能是一个很好的起点,但我认为它不能以当前形式运行。这是为什么我不这样认为的图像: DW发表评论后进行更新:我认为图的顶点是未标记的。如果一个解决方案涉及到标注顶点(就像AdrianN一样),那么无论标注如何完成,它都应该给出相同的(同构)无向图。我对带有标记顶点的图的“同构”定义是,存在与这两个图相关的标记的排列,但是我不确定未标记图的确切定义。

1
如何减少图中的相交边数?
我正在图编辑器上工作。图表显示与连接器(边缘)连接的2D形状(节点)。 我想添加一个操作,在选择了节点的情况下,将它们“解缠结”:如果可能的话,它会重新放置它们以减少交叉边缘的数量(如果必须用弯曲点绘制边缘就可以了) 。 因此,我想要一个图算法,在给定一个(拓扑)图嵌入及其节点子集的情况下,仅修改那些节点上的嵌入(拓扑),以最大程度地减少交叉边缘的数量。 通过阅读有关顶点图的信息并浏览Cabello和Mohar(2013),我认为这个问题是NP-难的。因此,对于任何给定参数值都具有已知的多项式时间复杂度的参数化算法(例如,相交边的数量),我将感到满意。这似乎是可行的,但我个人很难提出这样的算法。 问题: 我在哪里寻找这样的算法? 是否存在? 在现有软件中? 这样的操作是否有任何重要的实践经验?(理论上看起来不错的东西在实践中可能并不那么好,反之亦然。) (我不确定在哪里最好问这个问题:在这里,在StackOverflow还是MathOverflow上?)

5
什么是有效算法?
从渐近行为的角度来看,什么被视为“有效”算法?当时画线的标准/原因是什么?就我个人而言,我认为任何可能被我天真地称为“次多项式”的事物,例如例如都是有效的,而任何将是“无效的”。但是,我听说过任何多项式阶数都被称为有效的东西。这是什么原因?f(n)=o(n2)f(n)=o(n2)f(n) = o(n^2)n1+ϵn1+ϵn^{1+\epsilon}Ω(n2)Ω(n2)\Omega(n^2)


1
给定一组线段,如何构造双向连接的边列表?
对于嵌入在平面中的给定平面图,由一组线段,每个线段均由其端点。为平面细分构造DCEL数据结构,描述算法,证明其正确性并显示复杂性。G(V,E)G(V,E)G(V,E)E={e1,...,em}E={e1,...,em}E= \left \{ e_1,...,e_m \right \} eieie_i{Li,Ri}{Li,Ri}\left \{ L_i,R_i \right \} 根据对DCEL数据结构的描述,DCEL的不同对象(即顶点,边和面)之间存在许多连接。因此,DCEL似乎很难构建和维护。 您知道可用于构造DCEL数据结构的任何有效算法吗?

1
是否存在一种有效的算法来确定图是否具有平凡的自同构性?
我正在研究与拉丁方有关的问题,并且我想要一种基本上可以归结为决策问题的方法: 输入:有限的简单图形G。 输出:YES如果G具有非平凡的自同构,NO否则。 因此... 问题:是否存在一种有效的算法来确定图是否具有平凡的自同构性? 我们可以使用Nauty或Bliss(可能还有其他一些软件包)来计算整个自同构组,但是我不需要它。我需要确定的只是它是否微不足道。 从理论上讲,这种决策问题在某种程度上“计算整个自同构组”的复杂性是等效的。我不确定。 对我而言,“有效”基本上意味着“在实践中比计算整个同构组更快”,但是我也对它的理论感兴趣。

2
寻找最佳订购
我遇到了这个问题,正在努力寻找解决方法。任何想法将不胜感激! 假设我们给出一个矩阵{−1,0,1}n × k{−1,0,1}n × k\{-1, 0, 1\}^{n\ \times\ k} ,例如 ⎡⎣⎢⎢⎢⎢⎢⎢1−10−11001−101010000010−11−11−1⎤⎦⎥⎥⎥⎥⎥⎥[1010−1−100010110−1−1−10111000−1]\begin{bmatrix} 1 & 0 & 1 & 0 & -1 \\ -1 & 0 & 0 & 0 & 1 \\ 0 & 1 & 1 & 0 & -1 \\ -1 & -1 & 0 & 1 & …

2
布尔矩阵中的孤岛计数
给定布尔矩阵X,令0项代表海洋,1项代表陆地。将一个岛定义为垂直或水平(但不是对角线)相邻的1个条目。n × 米ñ×米n \times mXX\mathrm X0001个1个11个1个1 最初的问题是计算给定矩阵中的孤岛数量。作者描述了一个递归解(内存)。O(n米)Ø(ñ米)\mathcal{O}(nm) 但是我没有尝试找到一种流式处理(从左到右,然后向下到下一行)的解决方案,该解决方案可以动态地计算具有或O(n )或O(n + m )内存的岛(没有限制)时间复杂度)。那可能吗?如果没有,我该如何证明?O(米)Ø(米)\mathcal{O}(m)O(n)Ø(ñ)\mathcal{O}(n)O(n+m)Ø(ñ+米)\mathcal{O}(n+m) 该count功能某些输入的预期输出的一些示例: Ç Ò ù Ñ 吨⎛⎝⎜010111010⎞⎠⎟= 1 ; Ç Ò ù Ñ 吨⎛⎝⎜101010101⎞⎠⎟= 5 ; Ç Ò ù Ñ 吨⎛⎝⎜111101111⎞⎠⎟= 1 ;CØüñŤ(010111010)=1个;CØüñŤ(101010101)=5;CØüñŤ(111101111)=1个; count\begin{pmatrix} 010\\ 111\\ 010\\ \end{pmatrix} = 1; % count\begin{pmatrix} 101\\ 010\\ 101\\ \end{pmatrix} = 5; % …

1
如何最大限度地
我看到了很多算法问题,这些问题总是导致以下问题: 你有一个整数数组h[1..n]≥0H[1 ..ñ]≥0h[1..n]\geq 0,则需要找到i,j一世,Ĵi,j这样最大化(h[j]−h[i])(j−i)(H[Ĵ]-H[一世])(Ĵ-一世)(h[j]-h[i])(j-i)中O(n)Ø(ñ)O(n)时间。 显然,O(n2)Ø(ñ2)O(n^2)时间解决方案是考虑所有对,但是,有什么方法可以使的表达式最大化,O(n)Ø(ñ)O(n)而又不了解性质hHh吗? 我想到了一个想法是修复jĴj,那么我们需要找到i∗一世∗i^*从11个1到j−1Ĵ-1个j-1等于argmaxi{(h[j]−h[i])(j−i)}argmax一世{(H[Ĵ]-H[一世])(Ĵ-一世)}\text{argmax}_i\{(h[j]-h[i])(j-i)\}或argmaxi{h[j]j−h[j]i−h[i]j+h[i]i}argmax一世{H[Ĵ]Ĵ-H[Ĵ]一世-H[一世]Ĵ+H[一世]一世}\text{argmax}_i\{h[j]j-h[j]i-h[i]j+h[i]i\},由于jĴj是固定的,因此我们需要argmaxi{−h[j]i−jh[i]+ih[i]}argmax一世{-H[Ĵ]一世-ĴH[一世]+一世H[一世]}\text{argmax}_i\{-h[j]i-jh[i]+ih[i]\}。 但是,我看不出要摆脱内部jĴj依赖项的方法。有什么帮助吗?

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.