Questions tagged «algorithms»

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

4
PRNG用于精确生成n个设置位的数字
我目前正在编写一些代码来生成二进制数据。我特别需要生成具有给定数量的设置位的64位数字;更准确地说,该过程应取并返回一个伪随机的64位数字,其中恰好位设置为,其余设置为0。0&lt;n&lt;640&lt;n&lt;640 < n < 64nnn111 我当前的方法涉及以下内容: 生成一个伪随机数64。kkk 计算的位数,并将结果存储在。kkkbbb 如果,输出 ; 否则转到1。b=nb=nb = nkkk 这行得通,但看起来并不优雅。是否有某种PRNG算法可以比这更优雅地生成带有设置位的数字?nnn

2
调度问题的这种特殊情况是否可以在线性时间内解决?
爱丽丝(Alice)是一名学生,在接下来的几周里要完成很多作业。每一项家庭作业都需要她一天的时间。如果每个项目都错过了截止日期,那么每个项目都有一个截止日期,并且会对她的成绩产生负面影响(假设为实数,仅假设可比性,则获得加分)。 编写一个函数,该函数给出了(截止日期,成绩影响)列表,该时间表列出了在哪一天进行作业的时间表,以最大程度地减少对她的成绩造成的负面影响。 所有作业都必须最终完成,但是如果她错过了某个项目的截止日期,那么上交多晚都没关系。 在替代公式中: ACME公司希望向客户供水。他们都住在一条上坡路。ACME在这条街上分布着几口井。每口井可容纳一名顾客的水。客户出价要提供的金额不同。水只下坡。通过选择供应哪些客户来最大化收入。 我们可以使用存储桶排序对截止期限进行排序(或者假设我们已经按截止期限进行了排序)。 如果我们首先按降级影响进行排序,则可以使用贪婪算法轻松解决该问题。该解决方案不会比O(n log n)好。 受到中位数中位数和随机线性最小生成树算法的启发,我怀疑我们也可以在(随机化的)线性时间内解决我的简单调度/流程问题。 我在寻找: (潜在随机化)线性时间算法 或者替代地,认为不可能有线性时间 作为垫脚石: 我已经证明,仅知道在截止日期之前可以完成哪些项目,就足以在线性时间内重建完整的计划。(这种见解是我仅询问证书的第二种提法的基础。) 一个简单的(积分!)线性程序可以对这个问题进行建模。 使用该程序的对偶性,如果还为对偶程序提供了解决方案,则可以在线性时间内检查候选提议的解决方案是否最优。(两个解都可以用线性位数表示。) 理想情况下,我想在仅使用坡度影响之间比较而不在此处假设数字的模型中解决此问题。 对于这个问题,我有两种方法-一种基于使用截止日期和影响的挖掘,另一种类似于QuickSelect的方法,其基于选择随机枢轴元素并按影响对项目进行划分。两者都具有迫使O(n log n)或更坏的性能的最坏情况,但是我无法构造一个简单的特殊情况来降低两者的性能。


1
使用唯一元素编辑列表的距离
列表之间的Levenshtein-Distance编辑距离是一个经过充分研究的问题。但是如果知道每个列表中没有元素出现超过一次,我在可能的改进上找不到很多东西 。 我们还假设元素是可比较的/可排序的(但是要比较的列表并不是从头开始排序的)。 O(min(m,n)s)O(min(m,n)s)O(\min(m,n)s)sO (分钟(s ,m ,n )s )O(min(s,m,n)s)O(\min(s,m,n)s)sss 更正式地说, 我们如何有效地计算两个给定字符串s,t \ in \ Sigma ^ *之间的编辑距离 小号,吨&Element; &Sigma;∗s,t∈Σ∗s,t \in \Sigma^* ,并保证它们没有重复的字母? ΣΣ\Sigma是一个非常大的字母。


9
究竟是什么算法?
我知道这听起来可能有点开箱即用,实际上我以前总是在盒子里思考,但是最近我一直在思考,可能是因为计算机科学提供了高度的自由度,所以除了设计程序以外,大学里教过的 考虑阶乘函数。通常我们将这个函数定义为 int fact(int n) { int r = 1; for(int i=2;i&lt;=n;i++) r = r*i; return r; } 我将其称为算法,并且毫无疑问,这是正确的方法。然后,我想知道“我可以在固定时间内执行此操作吗?”,这使我想到了以下几点:如果我有一个整数数组,其中array [n]容纳n的阶乘怎么办?一旦这个数组被填充,我可以简单地将事实定义为: int fact(int n) { return array[n]; } 即使它提供了正确的结果并在恒定的时间O(1)中运行,我仍然似乎无法为该算法定标。这可以称为算法吗?否则,为什么不呢?我可以争辩说,填充数组将需要某种算法在某个时间运行,即使它在我们的大脑中才能填充数组,但这是否是标准?这些方面如何得到正式处理? 请注意,该概念可以扩展到任何在整数上操作的函数,而与参数的数量无关,如果函数具有2个参数,则仅需使用矩阵;如果函数具有3个参数,则仅需使用3,等等。而且,难道不是仅由于内存消耗而使用这些解决方案吗? 同样,该功能也可能不包含任何带有输出的程序,因为我可以找到一种方法来索引程序可以提供的每个可能的输出。 再举一个例子,考虑一下数组的一般用法:我首先分配一个大小为N的数组,然后通过将值存储在索引n处并将n增加一个单位来向数组添加元素。然后,如果我想寻找一个元素,我不禁要对数组执行线性搜索。相反,如果我创建一个大小为Integer.MAXVALUE的数组来存储整数(用零初始化),则可以通过在其索引处放置1来存储整数。然后我可以在O(1)时间中搜索它在数组中的存在。如果我希望能够放置多个相同编号的设备怎么办?没问题,我只是增加存储在整数索引处的值。 排序会稍微复杂一些,但是仍然可以在O(1)时间内执行查找和加法。
12 algorithms 

3
多核SAT解算器
我正在尝试解决25k子句5k变量SAT问题。由于它已经运行了一个小时(precosat),因此我想在以后解决更大的问题,因此我正在寻找一种多核SAT-Solver。 由于似乎有许多SAT解算器,我很迷茫。 有人能指出我最适合我的情况吗? 如果有人可以给我大概的时间(如果可能的话),我也很高兴。

2
一棵树的线性时间标记算法?
我有一棵无向的树,我要标记其顶点。叶节点应标记为一个。然后,假设叶子被去除了。在剩下的树中,叶子应标记为两片。该过程将以显而易见的方式继续进行,直到所有顶点都具有标签为止。我这样做的原因是我想将顶点存储在队列中,并“先离开”浏览它们。有没有简单的方法可以执行此时间?O(n+m)O(n+m)O(n+m) 我可以通过在每个步骤上进行BFS来解决该问题。但是在最坏的情况下,在我经过每个顶点的每一步中,都精确地移去两片叶子并将它们排队。我相信这需要二次时间。 另一个想法是首先找到所有叶子,然后对每个叶子进行BFS。这没有给我想要的解决方案。例如,考虑下图所示的一种“皇冠图”。显示了所需的解决方案,但是从每个叶子启动BFS只会导致使用两个标签。 理想地,线性时间算法也将易于解释和实现。
12 algorithms  trees 

2
用正方形平铺正交多边形
给定一个正交多边形(一个边与轴平行的多边形),我想找到最小的一组内部不相交的正方形,其并集等于该多边形。 我发现了一些对稍有不同的问题的引用,例如: 用正方形覆盖正交多边形-与我的问题类似,但是允许覆盖正方形重叠。这个问题具有多项式解(Aupperle,Conn,Keil和O'Rourke,1988; Bar-Yehuda和Ben-Hanoch,1996)。 将正交多边形平铺/分解/分割为矩形。这个问题具有多项式解(Keil,2000;Eppstein,2009)。 用矩形覆盖一个正交多边形-这个问题被称为是NP完全的(Culberson和Reckhow,1988)。 我找了最小的算法平铺与广场。

3
NFA是否接受另一个NFA的子集,是否有有效的测试?
因此,我知道测试常规语言是否为常规语言的子集是可以确定的,因为我们可以将它们都转换为DFA,计算,然后测试该语言是否为空。小号ř ∩ ˉ 小号RRRSSSR∩S¯R∩S¯R \cap \bar{S} 但是,由于这需要转换为DFA,因此DFA以及测试算法可能就输入NFA中的状态数而言呈指数关系。 在多项式时间内有已知的方法吗?总的来说,该问题是否已被证明是Co-NP完整的? 请注意,问题出在Co-NP中,因为而不是接受的单词将是的多项式证明者。RRRSSSR⊈SR⊈SR \not \subseteq S 编辑:这是不正确的,因为不能保证这样的单词在状态数上将是多项式。

3
在一个非常大的文件中查找出现次数最多的元素
我听说这个面试问题问了很多,我希望就好的答案给出一些意见:您有一个大于10 GB的大文件,并且您想找出哪个元素出现得最多,什么是好的方法去做这个? 在地图上进行迭代并保持跟踪可能不是一个好主意,因为您会占用大量内存,并且在条目进入时保持跟踪并不是最好的选择,因为提出此问题时文件通常已经存在。 我想到的其他想法包括拆分要迭代的文件并由多个线程处理,然后将这些结果组合在一起,但是映射的内存问题仍然存在。

4
比较有理数
给定a,b,c,d∈Na,b,c,d∈Na,b,c,d \in \mathbb N和b,d∉{0}b,d∉{0}b,d \notin \{0\}, ab&lt;cd⟺ad&lt;cbab&lt;cd⟺ad&lt;cb \begin{eqnarray*} \frac a b < \frac c d &\iff& ad < cb \end{eqnarray*} 我的问题是: 给定a,b,c,da,b,c,da,b,c,d 假设我们可以决定x&lt;y∈Zx&lt;y∈Zx < y \in \mathbb Z在O(|x|+|y|)O(|x|+|y|)\mathcal{O}(|x| +|y|),是有决定的任何方式ad&lt;cbad&lt;cbad<cb,而无需预形成的乘法(或分割),a⋅da⋅da\cdot d和c⋅bc⋅bc \cdot b。还是有某种证明是不可能的。 有没有一种比分母相乘更快的方法来比较有理数。

2
具有双重权重参数的最小生成树
考虑图。每个边缘具有两个权重和。查找最小化乘积。该算法应相对于在多项式时间内运行 。ê 甲é 乙é (Σ ê ∈ Ť 甲ë)(Σ Ë ∈ Ť 乙ë) | V | ,| E |G(V,E)G(V,E)G(V,E)eeeAeAeA_eBeBeB_e(∑e∈TAe)(∑e∈TBe)(∑e∈TAe)(∑e∈TBe)\left(\sum_{e \in T}{A_e}\right)\left(\sum_{e \in T}{B_e}\right)|V|,|E||V|,|E||V|, |E| 我发现很难在生成树上适应任何传统算法(Kruskal,Prim,Edge-Deletion)。怎么解决呢?有什么提示吗?

2
从度分布重构图
给定度数分布,我们可以按照给定的度数分布构建图形的速度有多快?链接或算法草图会很好。如果无法构造任何图形,并且如果可以构造多个图形,则该算法应报告“ no”。

1
关于Codd的约简算法
Codd的算法将元组关系演算中的表达式转换为关系代数。 该算法有标准实现吗? 此算法可在任何地方使用吗?(似乎行业只需要SQL和变体,我不确定学术界的数据库理论家。) 减少的复杂性是什么? 这是一年多以前在SO上发布的,但是没有收到很好的答案。

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.