Questions tagged «algorithm»

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

4
这种混洗算法有什么问题(如果有的话),我怎么知道?
就像背景一样,我知道Fisher-Yates完美的随机播放。它的O(n)复杂度和保证的均匀性是一个很好的改组,如果在允许就地更新数组的环境中使用它,我真是个傻瓜(所以在大多数情况下,如果不是全部,命令式编程环境)。 遗憾的是,函数式编程世界无法让您访问可变状态。 但是,由于Fisher-Yates的缘故,我没有太多关于如何设计改组算法的文献。在解决这个问题的几个地方都做了简短的说明,然后才说“实际上是Fisher-Yates,这是您需要知道的所有内容”。最后,我必须提出自己的解决方案。 我想出的解决方案是这样的,它可以随机排列任何数据列表: 如果列表为空,则返回空集。 如果列表中有单个项目,则返回该单个项目。 如果列表非空,请使用随机数生成器对列表进行分区,然后将算法递归应用于每个分区,以组合结果。 在Erlang代码中,它看起来像这样: shuffle([]) -> []; shuffle([L]) -> [L]; shuffle(L) -> {Left, Right} = lists:partition(fun(_) -> random:uniform() < 0.5 end, L), shuffle(Left) ++ shuffle(Right). (如果对您来说,这看起来像是一种疯狂的快速排序,那么基本上就是这样。) 因此,这就是我的问题:使得费舍尔-耶茨(Fisher-Yates)很难找到改组算法的情况使寻找工具来分析改组算法同样困难。在分析PRNG的均匀性,周期性等方面,我可以找到很多文献,但是关于如何分析混洗的信息却很少。(实际上,我发现的有关分析混洗的一些信息完全是错误的,很容易通过简单的技术来欺骗。) 所以我的问题是:我该如何分析我的改组算法(假设random:uniform()调用是由生成具有良好特征的适当随机数的任务决定的)?我可以使用哪些数学工具来判断,例如,在1..100范围内的整数范围内的100,000次混洗运行是否给了我很好的混洗结果?我已经进行了一些测试(例如,将随机播放中的增量与减量进行比较),但是我想知道更多一些内容。 并且,如果对这种随机播放算法本身有任何见解,也将不胜感激。

21
以二进制表示形式计数1
如果您有足够的内存可玩,一种有效的方法可以对O(1)中数字的二进制表示形式中的1进行计数。这是我在在线论坛上发现的面试问题,但没有答案。有人可以提出建议吗,我想不出一种在O(1)时间内做到的方式?
77 algorithm  binary 


5
矩阵乘法:矩阵大小差异小,时序差异大
我有一个矩阵乘法代码,如下所示: for(i = 0; i < dimension; i++) for(j = 0; j < dimension; j++) for(k = 0; k < dimension; k++) C[dimension*i+j] += A[dimension*i+k] * B[dimension*k+j]; 在此,矩阵的大小由表示dimension。现在,如果矩阵的大小为2000,则运行此代码需要147秒,而如果矩阵的大小为2048,则需要447秒。所以虽然没有区别。的乘积为(2048 * 2048 * 2048)/(2000 * 2000 * 2000)= 1.073,时间差为447/147 =3。有人可以解释为什么会这样吗?我希望它可以线性扩展,但不会发生。我不是在尝试制作最快的矩阵乘法代码,只是在试图理解为什么会这样。 规格:AMD Opteron双核节点(2.2GHz),2G RAM,gcc v 4.5.0 程序编译为 gcc -O3 simple.c 我也在英特尔的icc编译器上运行了此命令,并且看到了类似的结果。 编辑: 正如评论/答案中所建议的那样,我运行的维度为2060的代码需要145秒。 …

12
实现一个队列,其中push_rear(),pop_front()和get_min()都是恒定时间操作
我遇到了这个问题: 实现一个队列,其中push_rear(),pop_front()和get_min()都是恒定时间操作。 我最初想到的是,使用最小堆数据结构对get_min()具有O(1)复杂度。但是push_rear()和pop_front()将为O(log(n))。 有谁知道实现具有O(1)push(),pop()和min()的队列的最佳方法是什么? 我对此进行了搜索,并想指出这个Algorithm Geeks线程。但是似乎所有解决方案都没有一个遵循恒定时间规则,这三个方法分别是push(),pop()和min()。 感谢所有的建议。

10
最长等距子序列
我有一百万个按排序顺序排列的整数,我想找到连续对之间的差相等的最长子序列。例如 1, 4, 5, 7, 8, 12 有一个子序列 4, 8, 12 我的幼稚方法是贪婪的,只检查从每个点可以扩展子序列多远。这O(n²)似乎需要花费一点时间。 有没有更快的方法来解决这个问题? 更新。我将尽快测试答案中给出的代码(谢谢)。但是,很显然,使用n ^ 2内存将不起作用。到目前为止,还没有代码以输入结尾的代码[random.randint(0,100000) for r in xrange(200000)]。 时机。 我在32位系统上使用以下输入数据进行了测试。 a= [random.randint(0,10000) for r in xrange(20000)] a.sort() ZelluX的动态编程方法使用1.6G RAM,耗时2分14秒。使用pypy只需9秒!但是,由于大输入而导致的内存错误导致崩溃。 Armin的O(nd)时间方法使用pypy花费了9秒,但只有20MB的RAM。当然,如果范围更大的话,情况会更糟。低内存使用率意味着我还可以使用a = [xrange(200000)中r的random.randint(0,100000)进行测试],但是在我给pypy提供的几分钟内,它并没有完成。 为了能够测试Kluev的方法,我重试了 a= [random.randint(0,40000) for r in xrange(28000)] a = list(set(a)) a.sort() 大致列出长度20000。pypy的所有时间 ZelluX,9秒 克鲁夫20秒 阿明52秒 看来,如果ZelluX方法可以做成线性空间,那将是明显的赢家。
76 python  algorithm 

9
为什么斐波那契数在计算机科学中很重要?
斐波那契数已成为计算机科学学生进行递归的热门介绍,并且有一个强有力的论据认为它们在自然界中会持久存在。由于这些原因,我们许多人都熟悉它们。 它们也存在于其他地方的计算机科学中。基于序列的令人惊讶的高效数据结构和算法。 我想到了两个主要示例: 斐波那契堆比二项式堆具有更好的摊销运行时间。 斐波那契搜索与有序数组上的二进制搜索共享O(log N)运行时间。 这些数字是否具有某些特殊性质,使其比其他数字序列具有优势?是空间品质吗?他们还有什么其他可能的应用程序? 对我来说,这很奇怪,因为在其他递归问题中还有很多自然数序列,但是我从未见过加泰罗尼亚语堆。

8
“猜数字”游戏中是否存在任意有理数?
我曾经有以下问题作为面试问题: 我正在考虑一个正整数n。提出一种可以在O(lg n)查询中进行猜测的算法。每个查询都是您选择的数字,我将回答“较低”,“较高”或“正确”。 此问题可以通过修改后的二进制搜索来解决,在该搜索中,您列出了2的幂,直到找到一个超过n的幂,然后在该范围内运行标准的二进制搜索。我认为这很酷,因为您可以比暴力破解更快地搜索无限数量的特定数字。 不过,我的问题是对此问题进行了轻微的修改。假设不选择一个正整数,而是选择一个介于零和一之间的任意有理数。我的问题是:您可以使用哪种算法最有效地确定我选择了哪个有理数? 现在,我拥有的最佳解决方案可以在最多O(q)的时间内隐式遍历所有有理数的二叉搜索树Stern-Brocot树,从而找到p / q 。但是,我希望使运行时更接近整数情况下的运行时,例如O(lg(p + q))或O(lg pq)。有人知道获得这种运行时的方法吗? 我最初考虑使用间隔[0,1]的标准二进制搜索,但这只会找到具有非重复二进制表示形式的有理数,而这几乎错过了所有有理数。我还考虑过使用其他方式来列举有理数,但是仅凭比较大/相等/少的比较,我似乎找不到找到这种空间的方法。

14
在哪里可以找到Java中基于Trie的标准地图实现?[关闭]
关闭。此问题不符合堆栈溢出准则。它当前不接受答案。 想改善这个问题吗?更新问题,使其成为Stack Overflow的主题。 2天前关闭。 改善这个问题 我有一个Java程序,它存储了很多从字符串到各种对象的映射。 现在,我的选择是依靠散列(通过HashMap)或二进制搜索(通过TreeMap)。我想知道在流行且优质的收藏库中是否有一种有效且基于标准的基于trie的地图实现? 我过去写过自己的书,但是我愿意使用一些标准的东西(如果有的话)。 快速澄清:虽然我的问题很笼统,但在当前项目中,我正在处理大量数据,这些数据已通过完全合格的类名或方法签名进行了索引。因此,存在许多共享前缀。


13
“ For”循环第一次迭代
我想询问在第一次循环迭代中是否存在一种优雅的pythonic方式来执行某些功能。我能想到的唯一可能性是: first = True for member in something.get(): if first: root.copy(member) first = False else: somewhereElse.copy(member) foo(member)

10
如何按依赖性对依赖对象进行排序
我有一个收藏: List<VPair<Item, List<Item>> dependencyHierarchy; 成对的第一个项目是某个对象(项目),第二个项目是第一个项目所依赖的相同类型对象的集合。我想获得一个List<Item>依序排列的依存关系,因此没有依赖于第一个元素的项目,依此类推(没有循环依存关系!)。 输入: Item4取决于Item3和Item5 Item3取决于Item1 Item1不依赖任何一个 Item2取决于Item4 Item5不依赖于任何一个 结果: 项目1 项目5 项目3 项目4 项目2 谢谢。 解: 拓扑排序(感谢LoïcFévrier的想法) 和 例如在C#中,例如Java的 (感谢xcud伟大的例子)


8
在N×N二进制矩阵中查找仅包含零的最大矩形
给定一个NxN二进制矩阵(仅包含0或1),我们如何才能找到包含全0的最大矩形? 例: I 0 0 0 0 1 0 0 0 1 0 0 1 II->0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 <--IV 0 0 1 0 0 0 IV 对于上面的示例,它是一个6×6二进制矩阵。在这种情况下,返回值将为Cell 1:(2,1)和Cell 2:(4,4)。生成的子矩阵可以是正方形或矩形。返回值也可以是所有0的最大子矩阵的大小,在此示例中为3×4。
75 algorithm  arrays 


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.