Questions tagged «algorithms»

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

2
是否可以避免合并排序中的“除法”步骤?
因此,合并排序是一种分而治之的算法。在查看上图时,我在考虑是否有可能基本上绕过所有划分步骤。 如果您在原始数组上跳两次时迭代原始数组,则可以在索引i和i + 1处获取元素,然后将它们放入自己的排序数组中。一旦拥有所有这些子数组(如图所示,[[7,14],[3,12],[9,11]和[2,6]),您就可以简单地进行常规合并例程来获取排序数组。 遍历数组并立即生成所需的子数组是否比整体执行除法步骤效率低?

1
寻找最佳问题顺序以最大程度地减少学生的总时间
假设有一个大学的辅导课。我们有一组问题Q = { q 1 … q k }和一组n个 学生S = { s 1 … s n }。每个学生有问题,即,针对每个学生的特定子集疑问小号Ĵ,让Q Ĵ ⊆ Q是一系列问题,一个学生都有怀疑。假设 ∀ 1 ≤ Ĵ ≤ ñ :Q Ĵ ≠ķkkQ = { q1个… qķ}Q={q1…qk}Q = \{ q_1 \ldots q_k \}ñnn小号= { s1个… 秒ñ}S={s1…sn}S = \{ s_1 \ldots s_n \}sĴsjs_j问Ĵ⊆ QQj⊆QQ_j …

2
计算元素不完全等于其索引±M的排列
最近在算法面试中有人问我这个问题,但未能解决。 给定两个值N和M,您必须计算长度为N的排列数目(使用1到N的数字),以使排列中任何数字与其排列中的位置之间的绝对差不等于M. 示例-如果N = 3且M = 1,则1 2 3和3 2 1是有效的排列,但1 3 2无效,因为数字3位于位置2且它们的差为=M。 我尝试了NxM动态编程,但没有形成不计入重复次数的重复发生。


1
这是将任何递归过程转换为尾递归的通用方法吗?
看来我已经找到了将任何递归过程转换为尾递归的通用方法: 使用额外的“结果”参数定义帮助程序子过程。 将应用于过程的返回值的参数应用于该参数。 调用此帮助程序过程即可开始。“结果”参数的初始值是递归过程的退出点的值,因此,最终的迭代过程将从递归过程开始收缩的地方开始。 例如,这是要转换的原始递归过程(SICP练习1.17): (define (fast-multiply a b) (define (double num) (* num 2)) (define (half num) (/ num 2)) (cond ((= b 0) 0) ((even? b) (double (fast-multiply a (half b)))) (else (+ (fast-multiply a (- b 1)) a)))) 这是转换后的尾递归过程(SICP练习1.18): (define (fast-multiply a b) (define (double n) (* …


1
如果不是多项式或指数式,那么该函数叫什么?
我刚刚在Garey和Johnson的“计算机与难处理性”的第6页上找到了这句话。 时间复杂度函数不能如此有限的任何算法都称为指数时间算法(尽管应注意,此定义包括某些非多项式时间复杂度函数,例如,通常不将其视为指数函数)功能)。nlognnlog⁡nn^{\log n} 我的问题如下 如果不是多项式也不是指数式,那么该函数叫什么?是否有名称或特殊情况?nlognnlog⁡nn^{\log n} 谢谢。

2
什么是通用搜索的外行解释?
我正在阅读有关计算机科学主题的书,但缺少一些先决条件。通常,当我碰到术语时,我不理解我只是在查找它们,但是对于通用搜索,我只是无法找到适合没有统计学/计算机科学背景的读者的解释。 我一直在阅读Scholarpedia上有关“ 通用搜索”的文章,该文章似乎涵盖了该主题。对于“ 通用搜索”(或“ 莱文搜索”)的含义,我将不胜感激。

2
高效算法,可随机生成一个多集的两个分散,无序排列
背景 \newcommand\ms[1]{\mathsf #1}\def\msD{\ms D}\def\msS{\ms S}\def\mfS{\mathfrak S}\newcommand\mfm[1]{#1}\def\po{\color{#f63}{\mfm{1}}}\def\pc{\color{#6c0}{\mfm{c}}}\def\pt{\color{#08d}{\mfm{2}}}\def\pth{\color{#6c0}{\mfm{3}}}\def\pf{4}\def\pv{\color{#999}5}\def\gr{\color{#ccc}}\let\ss\gr假设我有两个相同批次的nnn大理石。每个大理石可以是ccc种颜色之一,其中c≤nc≤nc≤n。令ninin_i表示每批中颜色为i的大理石的数量iii。 令SS\msS为多集{1,…,1n1,2,…,2n2,…,1c,…,cnc}{1,…,1⏞n1,2,…,2⏞n2,…,1c,…,c⏞nc}\small\{\overbrace{\po,…,\po}^{n_1},\;\overbrace{\pt,…,\pt}^{n_2},\;…,\;\overbrace{\vphantom 1\pc,…,\pc}^{n_c}\}代表一批。在频率表示中,SS\msS也可以写为(1n12n2…cnc)(1n12n2…cnc)(\po^{n_1} \;\pt^{n_2}\; … \;\pc^{n_c})。 \ msS的不同置换数SS\msS由多项式给出: |SS|=(nn1,n2,…,nc)=n!n1!n2!⋯nc!=n!∏i=1c1ni!.|SS|=(nn1,n2,…,nc)=n!n1!n2!⋯nc!=n!∏i=1c1ni!.\left|\mfS_{\msS}\right|=\binom{n}{n_1,n_2,\dots,n_c}=\frac{n!}{n_1!\,n_2!\cdots n_c!}=n! \prod_{i=1}^c \frac1{n_i!}. 题 是否有一个有效的算法来生成两个弥漫,错乱排列PPP和QQQ的SS\msS随意?(分布应均匀。) 甲置换PPP是漫如果对于每个不同的元件iii的PPP,的实例iii在大致均匀间隔的出PPP。 例如,假设S=(1424)={1,1,1,1,2,2,2,2}S=(1424)={1,1,1,1,2,2,2,2}\msS=(\po^4\;\pt^4)=\{\po,\po,\po,\po,\pt,\pt,\pt,\pt\}。 {1,1,1,2,2,2,2,1}{1,1,1,2,2,2,2,1}\{\po, \po, \po, \pt, \pt, \pt, \pt, \po\}不扩散 {1,2,1,2,1,2,1,2}{1,2,1,2,1,2,1,2}\{\po, \pt, \po, \pt, \po, \pt, \po, \pt\}是分散的 更严格地: 如果,则只有一个实例要在 “间隔” ,所以让。ni=1ni=1n_i=1iiiPPPΔ(i)=0Δ(i)=0\Delta(i)=0 否则,令是实例之间的距离 和实例 的在。从中减去期望的实例之间的距离,定义以下内容: 如果在均匀分布,则应该为零,或者如果为非常接近零。d(i,j)d(i,j)d(i,j)jjjj+1j+1j+1iiiPPPiiiδ(i,j)=d(i,j)−nniΔ(i)=∑j=1ni−1δ(i,j)2δ(i,j)=d(i,j)−nniΔ(i)=∑j=1ni−1δ(i,j)2\delta(i,j)=d(i,j)-\frac n{n_i}\qquad\qquad\Delta(i)=\sum_{j=1}^{n_i-1} \delta(i,j)^2iiiPPPΔ(i)Δ(i)\Delta(i)ni∤nni∤nn_i\nmid n 现在定义统计量来衡量每个在均匀间隔的数量。如果接近零,或大致,我们称弥散。(可以选择特定于的阈值,以便在使扩散。)s(P)=∑ci=1Δ(i)s(P)=∑i=1cΔ(i)s(P)=\sum_{i=1}^c\Delta(i)iiiPPPPPPs(P)s(P)s(P)s(P)≪n2s(P)≪n2s(P)\ll n^2k≪1k≪1k\ll1SS\msSPPPs(P)&lt;kn2s(P)&lt;kn2s(P)<kn^2 …

1
Knuth的线性时间乘法算法为什么不“计数”?
维基百科有关乘法算法的页面提到了Donald Knuth的有趣文章。基本上,它涉及将傅立叶变换乘法与对数大小的乘法的预计算表进行组合。它以线性时间运行。 本文的行为就像这种算法,某种程度上不算作“真正的”乘法算法。更重要的是,是否可以在偶数O(n lg n)时间内完成乘法是一个悬而未决的问题! 此算法的哪些细节使它不算作“真实”乘法算法? 我的猜测是: 预先计算表格所花费的时间超过了线性时间。另一方面,它仍然可以及时完成,n lg n因此看起来仍然令人印象深刻。 某种程度上不允许随机访问。但是,为什么其他算法可以使用哈希表和指针之类的东西呢? 当您增加机器的字长时,它会以某种方式缩放错误,例如,如果您有一台256位机器在一条指令中执行256位乘法,那么直到您拥有2 ^ 256个以上的元素,该算法才有意义。另一方面,我们在联合发现中担心逆阿克曼因子。 “有没有线性时间乘法算法?” 问题是用一些功能较弱的机器暗中进行的,但这只能得到提示。

1
如何找到幂集的子集的最短表示形式?
我正在寻找解决以下问题的有效算法或NP硬度的证明。 令为一个集合,为的子集。找到一个最小长度的序列,使得对于每个,都有一个使得。ΣΣ\SigmaA⊆P(Σ)A⊆P(Σ)A\subseteq\mathcal{P}(\Sigma)ΣΣ\Sigmaw∈Σ∗w∈Σ∗w\in \Sigma^*L∈AL∈AL\in Ak∈Nk∈Nk\in\mathbb{N}{wk+i∣0≤i&lt;|L|}=L{wk+i∣0≤i&lt;|L|}=L\{ w_{k+i} \mid 0\leq i < |L| \} = L 例如,对于,单词是该问题的解决方案,因为对于存在,对于,。w = b a c { a ,b } k = 0 { a ,c } k = 1A={{a,b},{a,c}}A={{a,b},{a,c}}A = \{\{a,b\},\{a,c\}\}w=bacw=bacw = bac{a,b}{a,b}\{a,b\}k=0k=0k=0{a,c}{a,c}\{a,c\}k=1k=1k=1 至于我的动机,我试图表示一个有限自动机的边集,其中每个边都可以用输入字母中的一组字母来标记。我想存储一个字符串,然后在每个边缘保留一对指向该字符串的指针。我的目标是最小化该字符串的长度。


1
查找常规语言的最大因式分解
让语言为常规。L⊆Σ∗L⊆Σ∗\mathcal{L} \subseteq \Sigma^* 因式分解是单词集的最大对,其中(X ,Y )LL\mathcal{L}(X,Y)(X,Y)(X,Y) X⋅Y⊆LX⋅Y⊆LX \cdot Y \subseteq \mathcal{L} X≠∅≠YX≠∅≠YX \neq \emptyset \neq Y, 其中 | 。X ∈ X ,ÿ ∈ ÿ }X⋅Y={xyX⋅Y={xyX \cdot Y = \{xyx∈X,y∈Y}x∈X,y∈Y}x \in X, y \in Y\} (X,Y)(X,Y)(X,Y)如果每个对与都是或Y \就是最大不是\ subseteq Y'。(X′,Y′)≠(X,Y)(X′,Y′)≠(X,Y)(X',Y') \neq (X,Y)X′⋅Y′⊆LX′⋅Y′⊆LX'\cdot Y' \subseteq \mathcal{L} X⊈X′X⊈X′X \not \subseteq X'Y⊈Y′Y⊈Y′Y \not \subseteq Y' …

1
使用最少的交换次数,以便每个垃圾箱包含相同颜色的球
有垃圾箱,第个垃圾箱包含球。球有种颜色,有球,颜色为。令。nnniiiaiaia_innnaiaia_iiiim=∑ni=1aim=∑i=1naim=\sum_{i=1}^n a_i 交换是从一个垃圾箱取一个球,然后与另一个垃圾箱交换一个球。我们希望交换的数量最少,以使每个垃圾箱仅包含相同颜色的球。 我对所有都知道一个简单的特殊情况。(如果所有,那么您甚至可以最多交换一次每个球来做到这一点。)ai≤2ai≤2a_i\leq 2iiiai=2ai=2a_i=2iii 编辑:这是错误的,因为找到是NP困难的。c(D)c(D)c(D) 如果我们知道哪种颜色进入哪个容器,问题就很容易了。 考虑多图,。如果我们知道颜色去仓,然后有平行弧在 IFF斌包含颜色的球。图的每个组成部分都是欧拉。所需的最小交换次数是,其中是覆盖的弧不相交循环的数量D=(V,A)D=(V,A)D=(V,A)V={v1,…,vn}V={v1,…,vn}V=\{v_1,\ldots,v_n\}iiib(i)b(i)b(i)kkk(j,b(i))(j,b(i))(j,b(i))AAAjjjkkkiiim−c(D)m−c(D)m-c(D)c(D)c(D)c(D)AAA。我们可以通过“跟随”欧拉回路进行交换。(使用最小周期的弧进行交换可以将其更改为较小的最小周期和自循环)。一旦整个图形设置了自环,我们就进行了所有必要的交换。 这个问题通常有多难?

2
随机均匀采样完美匹配
假设我有一个图表与的完美匹配的(未知)组。假设这个集合是非空的,那么从随机地进行均匀采样有多困难?如果我对分布接近均匀但不太均匀的分布没问题,那有没有一种有效的算法?GGGM(G)M(G)M(G)GGGM(G)M(G)M(G)

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.