Questions tagged «algorithm»

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


26
检查列表中的所有元素是否相同
我需要以下功能: 输入:alist 输出: True 如果输入列表中的所有元素使用标准相等运算符求值彼此相等; False 除此以外。 性能:当然,我不希望产生任何不必要的开销。 我认为最好: 遍历列表 比较相邻元素 和AND所有结果布尔值 但是我不确定最Pythonic的方法是什么。 缺少短路功能只会损害早期输入不相等的长输入(超过50个元素)。如果这种情况经常发生(频率取决于列表的长度),则需要短路。最好的短路算法似乎是@KennyTM checkEqual1。但是,它为此付出了巨大的代价: 性能几乎是同类产品的20倍 短名单上的性能提高了2.5倍 如果没有出现早期输入不相等的长输入(或发生的次数很少),则不需要短路。然后,到目前为止最快的是@Ivo van der Wijk解决方案。

30
如何从字母矩阵中找到可能的单词列表[Boggle Solver]
最近,我一直在iPhone上玩一个名为Scramble的游戏。你们中有些人可能将此游戏称为Boggle。本质上,当游戏开始时,您会得到一个字母矩阵,如下所示: F X I E A M L O E W B X A S T U 游戏的目标是找到尽可能多的单词,这些单词可以通过将字母链接在一起来形成。您可以从任何字母开始,并且包围它的所有字母都是公平的游戏,然后转到下一个字母时,包围该字母的所有字母都是公平的游戏,除了任何以前使用的字母。因此在上面的网格,例如,我能想出的话LOB,TUX,SEA,FAME,等词必须至少有3个字符,并且不超过N×N个字符,这将是本场比赛16,但可以在一些实现改变。尽管这款游戏既有趣又令人上瘾,但我显然并不擅长于此,我想通过编写一个程序来欺骗我一点,该程序可以给我最好的单词(单词越长,您获得的积分就越多)。 (来源:boggled.org) 不幸的是,我对算法或其效率等不是很好。我的第一次尝试是使用诸如此类的字典(〜2.3MB),并进行线性搜索以尝试将组合与字典条目匹配。这需要非常长时间才能找到可能的单词,并且由于您每轮只有2分钟的时间,因此这根本不够用。 我很想看看是否有任何Stackoverflowers可以提出更有效的解决方案。我主要在寻找使用Big 3 P的解决方案:Python,PHP和Perl,尽管Java或C ++的任何功能也很酷,因为速度是必不可少的。 当前解决方案: 亚当·罗森菲尔德(Adam Rosenfield),Python,约20秒 John Fouhy,Python,大约3秒 Kent Fredric,Perl,〜1秒 Darius Bacon,Python,〜1秒 rvarcher,VB.NET (实时链接), Paolo Bergantino,PHP (实时链接),〜5s(本地〜2s)
376 algorithm  puzzle  boggle 


4
PHP的Big-O列表
在使用PHP一段时间之后,我注意到并不是所有内置的PHP函数都能达到预期的速度。考虑函数的这两种可能的实现,该函数使用缓存的素数数组查找数字是否为素数。 //very slow for large $prime_array $prime_array = array( 2, 3, 5, 7, 11, 13, .... 104729, ... ); $result_array = array(); foreach( $prime_array => $number ) { $result_array[$number] = in_array( $number, $large_prime_array ); } //speed is much less dependent on size of $prime_array, and runs much faster. $prime_array => …

16
什么时候使用深度优先搜索(DFS)和广度优先搜索(BFS)?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 8天前关闭。 我了解DFS和BFS之间的区别,但是我想知道什么时候使用另一种比较实用? 任何人都可以举例说明DFS将如何胜过BFS,反之亦然?

22
确定两个矩形是否相互重叠?
我正在尝试编写一个C ++程序,该程序需要用户输入以下内容以构造矩形(2到5之间):高度,宽度,x-pos,y-pos。所有这些矩形将平行于x和y轴存在,也就是说,它们的所有边缘的斜率均为0或无穷大。 我试图实现在此提到的内容问题中但运气并不好。 我当前的实现执行以下操作: // Gets all the vertices for Rectangle 1 and stores them in an array -> arrRect1 // point 1 x: arrRect1[0], point 1 y: arrRect1[1] and so on... // Gets all the vertices for Rectangle 2 and stores them in an array -> arrRect2 // rotated …

2
如何在现代C ++中实现经典的排序算法?
在大多数实现中,C ++标准库中的std::sort算法(及其表亲std::partial_sort和std::nth_element)是更多基本排序算法(例如选择排序,插入排序,快速排序,合并排序或堆排序)的复杂混合混合。 在这里以及在姐妹网站(例如https://codereview.stackexchange.com/)上,存在许多与这些经典排序算法的错误,复杂性和实现的其他方面有关的问题。提供的大多数实现都是由原始循环,使用索引操作和具体类型组成的,并且从正确性和效率方面来说,通常都是不平凡的分析。 问题:如何使用现代C ++实现上述经典排序算法? 没有原始循环,但结合了标准库的算法构建块<algorithm> 迭代器接口和模板的使用,而不是索引操作和具体类型的使用 C ++ 14样式,包括完整的标准库以及语法降噪器,例如auto,模板别名,透明比较器和多态lambda。 注意事项: 有关排序算法实现的更多参考,请参见Wikipedia,Rosetta Code或http://www.sorting-algorithms.com/ 根据Sean Parent的约定(幻灯片39),原始循环是-循环,for比使用运算符将​​两个函数组成更长。So f(g(x));or f(x); g(x);or f(x) + g(x);不是原始循环,也不是内部selection_sort和insertion_sort下面的循环。 我遵循Scott Meyers的术语将当前的C ++ 1y表示为C ++ 14,并将C ++ 98和C ++ 03都表示为C ++ 98,所以不要为此而烦恼。 正如@Mehrdad的评论中所建议的那样,我在答案的末尾提供了四个作为实时示例的实现:C ++ 14,C ++ 11,C ++ 98和Boost和C ++ 98。 答案本身仅用C ++ 14表示。在相关的地方,我表示的是各种语言版本不同的语法和库差异。


1
训练神经网络中出现极小的NaN值
我正在尝试在Haskell中实现神经网络架构,并在MNIST上使用它。 我正在使用hmatrix线性代数软件包。我的培训框架是使用pipes软件包构建的。 我的代码可以编译,并且不会崩溃。但是问题是,层大小(例如1000),最小批大小和学习率的某些组合会导致NaN计算中的值。经过一番检查,我发现极小的值(的顺序1e-100)最终出现在激活中。但是,即使这种情况没有发生,培训仍然无法进行。它的损失或准确性没有任何改善。 我检查并重新检查了我的代码,但对于问题的根源,我一无所知。 这是反向传播训练,它计算每一层的增量: backward lf n (out,tar) das = do let δout = tr (derivate lf (tar, out)) -- dE/dy deltas = scanr (\(l, a') δ -> let w = weights l in (tr a') * (w <> δ)) δout (zip (tail $ toList n) das) return (deltas) …

22
获得π值的最快方法是什么?
我正在寻找获得π值的最快方法,这是个人的挑战。更具体地说,我使用的方式不涉及使用#define诸如的常数,也不用M_PI硬编码数字。 下面的程序测试了我所知道的各种方式。理论上,内联汇编版本是最快的选择,尽管显然不是便携式的。我将其作为与其他版本进行比较的基准。在我的测试中,使用内置功能,该4 * atan(1)版本在GCC 4.2上运行速度最快,因为它可以将折叠atan(1)为常数。使用-fno-builtin指定的atan2(0, -1)版本是最快的。 这是主要的测试程序(pitimes.c): #include <math.h> #include <stdio.h> #include <time.h> #define ITERS 10000000 #define TESTWITH(x) { \ diff = 0.0; \ time1 = clock(); \ for (i = 0; i < ITERS; ++i) \ diff += (x) - M_PI; \ time2 = clock(); \ printf("%s\t=> %e, time …

30
用Java构建带分隔符的字符串的最佳方法是什么?
在Java应用程序中工作时,最近我需要组装一个用逗号分隔的值列表,以传递到另一个Web服务,而无需事先知道会有多少个元素。我能想到的最好的办法是这样的: public String appendWithDelimiter( String original, String addition, String delimiter ) { if ( original.equals( "" ) ) { return addition; } else { return original + delimiter + addition; } } String parameterString = ""; if ( condition ) parameterString = appendWithDelimiter( parameterString, "elementName", "," ); if ( anotherCondition …
317 java  string  algorithm 


3
Redis的底层数据结构是什么?
我试图在一个明确的列表中回答两个问题: Redis的底层数据结构是什么? 每种类型的主要优点/缺点/用例是什么? 因此,我读过Redis列表实际上是用链接列表实现的。但是对于其他类型,我无法提取任何信息。同样,如果有人偶然发现了这个问题,而又对修改或访问不同数据结构的优缺点没有一个高层次的总结,那么他们将有完整的清单,列出何时可以最佳地使用特定类型进行引用。 具体来说,我希望概述所有类型:字符串,列表,集合,zset和哈希。 到目前为止,我已经看过这些文章,其中包括: http://redis.io/topics/data-types http://redis.io/topics/data-types-intro http://redis.io/topics/faq

30
如何旋转二维数组?
受雷蒙德·陈(Raymond Chen)的启发,假设您有一个4x4二维数组,请编写一个将其旋转90度的函数。雷蒙德(Raymond)链接到伪代码的解决方案,但我希望看到一些实际的东西。 [1][2][3][4] [5][6][7][8] [9][0][1][2] [3][4][5][6] 成为: [3][9][5][1] [4][0][6][2] [5][1][7][3] [6][2][8][4] 更新:尼克的答案是最直接的,但是有没有办法比n ^ 2更好呢?如果矩阵是10000x10000,该怎么办?

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.