Questions tagged «algorithm»

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

18
圆形无锁缓冲器
我正在设计一个系统,该系统连接到一个或多个数据提要流,并根据触发结果对数据进行一些分析。在典型的多线程生产者/消费者设置中,我将有多个生产者线程将数据放入队列中,并且有多个消费者线程读取数据,并且消费者只对最新数据点加n个点感兴趣。如果慢速使用者无法跟上生产者线程,则生产者线程将不得不阻塞,当然,当没有未处理的更新时,使用者线程也会阻塞。使用具有读取器/写入器锁定的典型并发队列会很好地工作,但是数据输入的速率可能很大,因此我想减少我的锁定开销,特别是为生产者减少写入器锁定。我认为我需要一个循环无锁缓冲区。 现在有两个问题: 循环无锁缓冲区是否是答案? 如果是这样,在我提出自己的建议之前,您知道任何适合我需要的公共实施方式吗? 始终欢迎实现循环无锁缓冲区的任何指针。 顺便说一句,在Linux上的C ++中执行此操作。 一些其他信息: 响应时间对我的系统至关重要。理想情况下,使用者线程希望尽快看到任何更新,因为额外的1毫秒延迟可能会使系统一文不值,甚至少很多。 我倾向于的设计思想是一个无半锁的循环缓冲区,在此缓冲区中,生产者线程将数据尽可能快地放入缓冲区中,我们将其称为缓冲区A的头,除非缓冲区已满,否则不要阻塞A与缓冲区Z的末尾相遇。使用者线程将分别持有两个指向循环缓冲区的指针P和P n,其中P是线程的本地缓冲区头,而P n是P之后的第n个项目。每个使用者线程都将推进其P一旦完成当前P的处理,P n和P n就会以最慢的P n前进到缓冲区指针Z的末尾。当P赶上A,这意味着不再有新的更新要处理时,使用者旋转并忙于等待A再次前进。如果使用者线程旋转时间过长,则可以使其进入睡眠状态并等待条件变量,但是我可以接受使用者占用CPU周期等待更新,因为这不会增加我的延迟(我将拥有更多的CPU内核)比线程)。想象一下,您有一个循环的轨道,而生产者在一群消费者的面前运行,关键是调整系统,以便生产者通常比消费者领先几步,而其中大多数操作可以使用无锁技术完成。我知道正确实现实现的细节并不容易...好吧,非常艰苦,这就是为什么我想在别人做些自己的事情之前先从别人的错误中学习。

11
最大化直方图下的矩形区域
我有一个具有整数高度和恒定宽度1的直方图。我想最大化直方图下的矩形区域。例如: _ | | | |_ | | | |_ | | 使用col1和col2的答案将是6、3 * 2。 O(n ^ 2)蛮力对我很清楚,我想要一个O(n log n)算法。我正在尝试按照最大递增子序列O(n log n)算法的方式进行动态编程,但我没有前进。我应该使用分治法吗? PS:如果没有这样的解决方案,请信誉良好的人删除分而治之的标签。 经过mho的评论:我的意思是完全适合的最大矩形区域。(感谢j_random_hacker进行澄清:))。
72 algorithm 


7
惰性评估和时间复杂度
我一直在研究stackoverflow非临时性惰性评估,这使我想到了Keegan McAllister的演讲:为什么要学习Haskell。在幻灯片8中,他显示了最小功能,定义为: minimum = head . sort 并指出其复杂度为O(n)。我不明白,如果按替换排序为O(nlog n),为什么说复杂度是线性的。帖子中提到的排序不能是线性的,因为它不假设任何有关数据的信息,这是线性排序方法(例如计数排序)所要求的。 懒惰的评估在这里扮演着神秘的角色吗?如果是这样,其背后的解释是什么?

19
如何在经过改组的连续整数数组中找到重复的元素?
我最近在某个地方遇到了一个问题: 假设您有一个1001个整数的数组。整数按随机顺序排列,但是您知道每个整数都在1到1000(含)之间。此外,每个数字在数组中仅出现一次,但一个数字出现两次。假设您只能访问一次数组的每个元素。描述找到重复数字的算法。如果在算法中使用了辅助存储,是否可以找到不需要它的算法? 我有兴趣知道的是第二部分,即不使用辅助存储。你有什么主意吗?

10
可能的面试问题:如何找到所有重叠的间隔
想要改善此职位?提供有关此问题的详细答案,包括引文和为什么您的答案正确的解释。答案不够详细的答案可能会被编辑或删除。 正如我在项目中遇到的那样,这本身不是一个采访问题,但我认为这可能是一个不错的干预问题。 您有N对间隔,例如整数。您需要确定在O(N)时间内彼此重叠的所有间隔。例如,如果您有 {1,3} {12,14} {2,4} {13,15} {5,10} 答案是{1,3},{12,14},{2,4},{13,15}。请注意,您无需对其进行分组,因此结果可以按示例中的任何顺序排列。 我只花O(N)的时间,因为KMP算法将O(N)用于字符串搜索。:D 我想到的最好的东西是我现在在项目中使用的是O(N ^ 2)。是的,蛮力很可悲,但是没有人抱怨,所以我不会重构它。:P不过,我很好奇,如果一个更大的头脑有一个更优雅的解决方案。
72 algorithm 

14
数组中的加权随机选择
我想从数组中随机选择一个元素,但是每个元素都有一个已知的选择概率。 (在数组中)所有机会的总和为1。 您会建议哪种算法最快,最适合进行大量计算? 例: id => chance array[ 0 => 0.8 1 => 0.2 ] 对于此伪代码,所讨论的算法应在多个调用上统计地返回id上的四个元素,以id上0的一个元素1。


6
简化数学表达式的策略
我有一棵结构良好的树,代表数学表达式。例如,给定字符串:"1+2-3*4/5",它将解析为: subtract(add(1,2),divide(multiply(3,4),5)) 表示为这棵树: 我想做的就是拿这棵树并尽可能减少它。在上述情况下,这非常简单,因为所有数字都是常量。但是,一旦我允许未知数(以一个$后跟一个标识符表示),事情就会变得更加棘手: "3*$a/$a" 变成 divide(multiply(3,$a), $a) 这应该简化为3,因为这些$a条款应该相互抵消。问题是,“我该如何以一种通用的方式来认识这一点?” 我怎么知道那min(3, sin($x))将永远是sin($x)?我怎么知道那sqrt(pow($a, 2))是abs($a)?我如何识别nthroot(pow(42, $a), $a)(第a次方为42的a次方)是42? 我知道这个问题涉及面很广,但是我已经对此提出质疑了很长时间,而且还没有提出令人满意的建议。


5
哈希表运行时复杂度(插入,搜索和删除)
为什么我在哈希表上仍然看到这些函数的不同运行时复杂性? 在Wiki上,搜索和删除均为O(n)(我认为哈希表的要点是具有恒定的查找,因此,如果搜索为O(n)的意义是什么)。 在不久前的一些课程笔记中,我看到了许多复杂的情况,具体取决于某些细节,包括一个包含所有O(1)的细节。如果我可以全部获得O(1),为什么还要使用其他实现? 如果我以C ++或Java之类的语言使用标准哈希表,那么我期望的时间复杂度是多少?

12
查看ArrayList是否包含Java中对象的最有效方法
我在Java中有一个ArrayList对象。这些对象有四个字段,我将其中两个用于考虑该对象与另一个字段相等。给定这两个字段,我正在寻找最有效的方法,以查看数组是否包含该对象。 棘手的是,这些类是基于XSD对象生成的,因此我无法修改这些类本身以覆盖.equals。 有没有比遍历并手动比较每个对象的两个字段然后在找到时中断的更好的方法了?寻找更好的方法,这看起来太混乱了。 编辑: ArrayList来自未编组到对象中的SOAP响应。


10
Manacher算法(在线性时间内找到最长回文子串的算法)
在花了大约6到8个小时尝试消化Manacher的算法后,我准备投入工作。但是在我这样做之前,这是黑暗中的最后一枪:有人能解释吗?我不在乎代码。我希望有人来解释该算法。 这似乎是其他人似乎喜欢解释该算法的地方:http : //www.leetcode.com/2011/11/longest-palindromic-substring-part-ii.html 我知道您为什么要将字符串转换为“ abba”到#a#b#b#a#,然后我迷路了。例如,前面提到的网站的作者说,算法的关键部分是: if P[ i' ] ≤ R – i, then P[ i ] ← P[ i' ] else P[ i ] ≥ P[ i' ]. (Which we have to expand past the right edge (R) to find P[ i ]) 这似乎是错误的,因为他/她曾说过,当P [i'] = 7且P [i]不小于或等于R-i时,P …

2
结合陀螺仪和加速度计数据
我正在使用Lego Mindstorm的NXT系统构建平衡机器人。我正在使用HiTechnic的两个传感器,第一个是加速度计,第二个是陀螺仪。我已经成功滤除了两个传感器的噪声以及在-90到90度之间的两个角度中的派生角度,其中0度是完美平衡的。 我的下一个挑战是将两个传感器值结合起来以校正陀螺仪随时间的漂移。下面是我根据实际数据创建的示例图,以演示陀螺仪的漂移: 我见过的使这些传感器坚如磐石的最常用方法是使用卡尔曼滤波器。但是,我不是微积分专家,我真的不懂数学符号,但是我确实懂源代码中的数学。 我使用的是RobotC(与其他C派生类一样),如果有人可以给我有关如何在C中实现此功能的示例,我将不胜感激。 感谢您的帮助! 解决方案结果: 好的,kersny通过向我介绍互补过滤器解决了我的问题。这是说明我的结果的图表: 结果1 结果#2 如您所见,该滤波器可校正陀螺仪的漂移,并将两个信号合并为一个平滑信号。 编辑:由于我还是要修复损坏的图像,所以我认为显示用于生成此数据的装备会很有趣:

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.