Questions tagged «algorithms»

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

1
通过随机分区进行集中选择?
在数字的数组中查找中值元素的常用简单算法是:AAAnnn 从采样元素并替换为n3/4n3/4n^{3/4}AAABBB 排序并找到排名元素和的BBB|B|±n−−√|B|±n|B|\pm \sqrt{n}lllrrrBBB 检查和在的中位数的相对侧,并且对于某些适当的常数在和与之间最多有元素。如果没有发生,则失败。lllrrrAAACn−−√CnC\sqrt{n}AAAlllrrrC>0C>0C > 0 否则,通过在和之间对的元素进行排序来找到中位数AAAlllrrr 不难看出这是线性运行的,并且成功的可能性很高。(所有不良事件与二项式的期望值相差很大。) 针对相同问题的另一种算法,这里描述的是一种更自然的方法,可以教给看过快速排序的学生:随机选择 还很容易看出,该循环的预期运行时间是线性的:说“回合”是一系列递归调用,当一个人进行1 / 4-3 / 4分割时结束,然后观察到一个回合最多为2。(在第一回合中,成功分割的概率为1/2,然后实际上增加了,因为描述了算法,所以回合长度受几何随机变量支配。) 所以现在的问题是: 是否有可能表明随机选择在线性时间内运行的可能性很高? 我们有回合,并且每个回合的长度至少为,概率最大为,因此并集约束得出运行时间为以概率。k 2 − k + 1 O (n log log n )1 − 1 / O (log n )O(logn)O(log⁡n)O(\log n)kkk2−k+12−k+12^{-k+1}O(nloglogn)O(nlog⁡log⁡n)O(n\log\log n)1−1/O(logn)1−1/O(log⁡n)1-1/O(\log n) 这有点令人不满意,但实际上是真的吗?


4
使用内点法找到线性编程的精确角点解
单纯形算法贪婪地走在多面体的角上,以找到线性规划问题的最佳解决方案。结果,答案永远是多面体的一角。内部点方法在多面体内部移动。结果,当多面体的整个平面最佳时(如果目标函数与该平面完全平行),我们可以在该平面的中间得到一个解。 假设我们要查找多面体的一个角。例如,如果我们想通过将其简化为线性编程来进行最大匹配,则我们不希望得到包含“该匹配包含0.34%的边缘XY和0.89%的边缘AB和...”的答案。我们想得到一个0和1的答案(由于所有角都由0和1组成,因此单纯形会给我们一个答案)。有没有办法使用内点方法来确保在多项式时间内找到精确的角点解?(例如,也许我们可以修改目标函数以偏向角落)



4
评估给定Bubblesort算法的平均时间复杂度。
考虑冒泡的伪代码: FOR i := 0 TO arraylength(list) STEP 1 switched := false FOR j := 0 TO arraylength(list)-(i+1) STEP 1 IF list[j] > list[j + 1] THEN switch(list,j,j+1) switched := true ENDIF NEXT IF switched = false THEN break ENDIF NEXT 在评估平均时间复杂度时,我必须牢记的基本思想是什么?我已经完成了最坏情况和最佳情况的计算,但是我一直在认真思考如何评估内循环的平均复杂度,以形成方程。 最坏的情况是: ∑我= 0ñ(∑j = 0n − (i + …

1
对于以下问题,是否存在亚三次算法?
给定对称实矩阵,有一种算法可计算总和在所有1 \ leq i &lt;j &lt;k \ leq n上,时间复杂度优于O(n ^ 3)?n×nn×nn \times nA=(aij)A=(aij)A=(a_{ij})∑i,j,kmax(aij,aik,ajk)∑i,j,kmax(aij,aik,ajk)\sum_{i,j,k}\max(a_{ij},a_{ik},a_{jk})1≤i&lt;j&lt;k≤n1≤i&lt;j&lt;k≤n1\leq i<j<k\leq nO(n3)O(n3)O(n^3)

2
最小公除数
基本上,问题是:对于一组正数,找到一个最小数,它不是的任何元素的除数,即。SSSdddSSS∀x∈S, d∤x∀x∈S, d∤x\forall x \in S,\ d \nmid x 表示n=|S|n=|S|n = |S|和C=max(S)C=max(S)C = \max(S) 。考虑函数F(x)=F(x)=F(x) = 不除x的最小素数xxx。很容易看到F(x)≤logxF(x)≤log⁡xF(x) \leq \log x。对于集合SSS,令F(S)=F(S)=F(S) = 不除S的任何元素的最小素数SSS。我们有一个上限 F(S)≤F(lcm(S))≤F(Cn)≤nlogC.F(S)≤F(lcm⁡(S))≤F(Cn)≤nlog⁡C.F(S) \leq F(\operatorname{lcm}(S)) \leq F(C^n) \leq n \log C. 因此,一种简单的蛮力算法(它枚举了从111到n \ log C的所有数字,nlogCnlog⁡Cn \log C并检查它是否未除以S的任何元素)SSS是多项式的,并且具有时间复杂度O(n2logC)O(n2log⁡C)O(n^2 \log C)。 解决该问题的另一种方法是计算S的每个元素的所有因子,SSS并在蛮力算法中使用它们,以检查xxx是否为O(1)O(1)O(1)时间的答案。该算法的时间复杂度为O(n⋅min(C−−√,nlogC)+nlogC)O(n⋅min(C,nlog⁡C)+nlog⁡C)O(n \cdot \min (\sqrt{C}, n \log C) + n \log C)并且使用O(nlogC)O(nlog⁡C)O(n …

2
关于算法的好数学书[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 我很喜欢数学的优雅和严谨,现在正在寻找有关算法和算法分析的文献。现在,涵盖什么算法对我来说并没有多大关系,但是如何呈现和对待它们就非常重要。¹我最看重一种非常清晰准确的语言,该语言以严格抽象的方式定义了所有使用的概念。 我发现由Cormen,Leiserson,Rivest和Stein撰写的经典算法简介非常整洁,但是对数学的处理不够好,并且其证明和定义非常非正式。在这方面,Sipser的《计算理论导论》似乎更好,但是仍然没有提供从数学到算法的无缝过渡。 谁能推荐一些东西? ¹:算法至少应使用经典的非平凡抽象数据结构(例如图形,数组,集合,列表,树等)来调用其所需数据的管理,最好也对此类数据结构进行操作。如果完全忽略数据结构的使用和管理问题,我不会太感兴趣。不过,我不太关心用它们解决的问题。

1
解决NP完全问题的所有已知算法是否具有建设性?
是否有已知算法可以在不隐式生成证书的情况下正确输出“是”到NP完全问题? 我知道,将可满足性预言器转变为令人满意的分配器很简单:只需遍历变量,每次都要求可满足性预言器解决该变量与原始问题的结合。 但是这样的包装器会有用吗?所有坐式求解器都在可能分配的空间中进行搜索吗? 还是存在某些类型的NP完全问题(旅行商,子集总和等),其中求解器可以利用数学定理来证明必须存在解?喜欢通过矛盾进行证明吗?

2
确定两个正则表达式是否等效的算法
给定两个任意的正则表达式,是否存在一种“高效”算法来确定它们是否与同一组字符串匹配? 更笼统地说,我们可以计算两个匹配集的交集大小吗? 有哪些算法可以做到这一点,它们所处的复杂性等级是什么? 如果我们不允许Kleene星,那是否完全改变了图片?

3
DFT中交叉边缘和前边缘之间的差异
在深度优先的树中,有定义树的边(即遍历中使用的边)。 有一些剩余的边缘连接其他一些节点。交叉边缘和前边缘有什么区别? 从维基百科: 基于此生成树,原始图的边缘可分为三类:前向边缘(从树的节点指向其后代之一),后边缘(从节点到其祖先之一),和交叉边缘,两者都不起作用。有时,属于生成树本身的树边缘与前边缘分开进行分类。如果原始图形是无向的,则其所有边缘均为树形边缘或后边缘。 从一个节点指向另一个节点的遍历中未使用的边线是否不建立父子关系?

5
复杂度为O(n)的词频
在接受Java开发人员职位面试时,有人问我以下问题: 编写一个具有两个参数的函数: 代表文本文档的字符串,以及 提供要返回的项目数的整数。 实现函数,使其返回按单词频率排序的字符串列表,最频繁出现的单词在前。您的解决方案应在时间运行,其中是文档中的字符数。nO (n )O(n)O(n)ñnn 以下是我的回答(用伪代码),由于排序,它不是,而是时间。我不知道该怎么做时间。 O (n log n )O (n )O (n )O(n)O(n)Ø (ñ 日志n )O(nlog⁡n)O(n \log n)O (n )O(n)O(n) wordFrequencyMap = new HashMap&lt;String, Integer&gt;(); words = inputString.split(' '); for (String word : words) { count = wordFrequencyMap.get(word); count = (count == null) ? 1 : …

1
图灵在曼彻斯特计算机上神秘的小程序计算了什么?
我正在阅读Turing的“计算机与智能计算”论文(https://www.csee.umbc.edu/courses/471/papers/turing.pdf),发现其中有一段片段: 我在曼彻斯特计算机上设置了一个仅使用1,000个存储单元的小程序,通过该程序,提供了一个16位数字的计算机会在两秒钟内回复另一个。我无视任何人从这些答复中学习到的有关程序的足够知识,以便能够预测对未尝试值的任何答复。 在我看来,这似乎是机器学习的问题:)但撇开我对AI的兴趣,我的问题如下: 有谁知道什么该方案是在做什么? 我很好奇 PS:从输入和输出的长度来看,我怀疑这是一种加密算法,但是我希望您能从实际程序中获得任何线索。

4
一群人互相购买礼物的最低购物次数
我们有个人。我们列出了谁必须为组内谁购买礼物的清单。每个人可能需要购买/接收任意数量的礼物,或者根本不需要。在购物旅行中,一部分人会一起前往同一家商店,并为不在商店中的任何人购买礼物。他们可能不会在同一购物之旅中为其他人购买礼物,因为那样就不会感到惊讶。一个人可能会进行多次购物旅行。我们希望最大程度地减少每个人购买所需礼物所需的购物行程总数。ñnn 例如,假设有5个人,每个人都必须为组中的其他每个人购买礼物。让人们从1到5进行编号。这可以在4个购物行程中完成,如下所示: 行程1、1、2、3去购物 行程2:1、4、5去购物 旅程3:2、4去购物 行程4:3、5购物 我将如何解决这个问题?很明显,输入可以用有向图表示,但是我不知道从那里去。有人提出了biclique覆盖问题,但尽管类似,却无法回答这个问题。 我们可以将输入视为个顶点上的有向图,其中边表示人u必须为人v购买礼物。的目标是找到一组bicliques的(小号1,Ť 1),... ,(小号ķ,Ť ķ)使得ķ是最小的,并且边集Ë图的的一个子集∪ 我(š 我 × Ť 我)G GGn nn(u ,v )(u,v)(u,v)uuvv(S1,T1),…,(Sk,Tk)(S_1,T_1),\dots,(S_k,T_k)kkEE∪i(Si×Ti)\cup_i (S_i \times T_i)。同样,在将双斜线的定义扩展到有向图时,双斜线(S i,T i)(Si,Ti)(S_i,T_i)仅包含将S i映射SiS_i到T i的边TiT_i。这不同于biclique覆盖问题中,我们不要求每个biclique是的一个子图G ^GG(我们不要求小号我 × Ť 我 ⊆ ËSi×Ti⊆ES_i \times T_i \subseteq E每个我ii)。 具体来说,我会接受以下任一答案: 证明此问题是NP难题或 提出了多项式时间算法,可以准确回答此问题(无近似值或上限) 记录下来,我在任何地方都没有看到这个问题,我只是出于好奇而想知道。

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.