Questions tagged «algorithms»

在数学和计算机科学中,算法是一种有效方法,表示为用于计算函数的定义明确的指令的有限列表。算法用于计算,数据处理和自动推理。

5
您如何识别算法的“边缘”情况?
此问题是从Stack Overflow 迁移而来的,因为可以在Software Engineering Stack Exchange上回答。 迁移 8年前。 基本上,您如何找出最坏的情况或最好的情况,以及在遇到其他情况之前可能遇到的其他“边缘”情况,因此,如何为它们准备代码?

2
合并具有最少比较数的两个排序数组的算法
给定两个大小为n和m的类型为T的排序数组a,b。我正在寻找一种将两个数组合并为一个新数组(最大大小为n + m)的算法。 如果比较便宜的话,这很简单。只需从具有最低第一个元素的数组中取出,直到完全遍历一个或两个数组,然后添加其余元素即可。像这样的东西/programming/5958169/how-to-merge-two-sorted-arrays-into-a-sorted-array 但是,当比较两个元素时,情况的改变要比将元素从源数组复制到目标数组要贵得多。例如,您可能具有大的任意精度整数或字符串组成的数组,其中比较可能会非常昂贵。只需假设创建数组和复制元素是免费的,而唯一花​​费的就是比较元素。 在这种情况下,您希望使用最少数量的元素比较合并两个数组。这里有一些示例,您应该可以比简单的合并算法做得更好: a = [1,2,3,4, ... 1000] b = [1001,1002,1003,1004, ... 2000] 要么 a = [1,2,3,4, ... 1000] b = [0,100,200, ... 1000] 在某些情况下,简单合并算法将是最佳选择,例如 a = [1,3,5,7,9,....,999] b = [2,4,6,8,10,....,1000] 因此,理想情况下,算法应该适当地降级并在阵列交错或至少不会明显恶化的情况下执行最多n + m-1个比较。 对于大小差异较大的列表,应该做得很好的一件事是使用二进制搜索将较小数组的元素插入较大数组。但是,如果两个列表的大小相同且交织在一起,则不会优雅地降低性能。 元素唯一可用的是(总计)排序功能,因此任何使比较便宜的方案都是不可能的。 有任何想法吗? 我在Scala中提出了这一点。我认为比较次数是最佳的,但是我无法证明这一点。至少它比我在文献中发现的要简单得多。 而且自原始帖子以来,我写了一篇有关其工作原理的博客文章。

3
日历/计划算法
我面临一个不确定的方法。我必须为员工生成日历,每个员工都有特定的工作限制(有些是个人的,有些是普通的) 我正在使用的是: 我有医生 每个医生每周必须工作5天。 每个医生每周必须工作1晚 与其他医生相比,每位医生必须工作等量的夜晚(或尽可能接近) 每个医生在周四晚上和周日晚上的工作量必须与其他医生相同(或尽可能接近) 有些医生不能在某些白天/夜晚工作(由用户输入) 一些医生想在某些白天/夜晚工作(由用户输入) 一些医生希望某些天/夜不工作(由用户输入) 有问题的用户是处理日历的人,我正在尝试构建一个解决方案,该解决方案将自动生成一个遵循所有约束的日历。解决的方法是对每个医生进行大设置输入“添加医生”和“添加约束”,然后输入“生成日历”按钮。对于用户而言,这确实是基本的。 我的问题 : 我不确定如何生成实际计划,我一直在阅读有关神经网络,遗传算法等的信息,它们似乎都是正确的解决方案,但实际上并非如此。 当我查看GA时,要让他们找到具有给定总体的解决方案(我的问题),但是起始总体必须已经服从给定的一组约束,然后可以对其进行优化。在那种情况下,我的起始人口已经是解决方案。我不需要对其进行“优化”。没关系,一个人连续工作3个星期一晚上,只要实际上是正确的,而其他人也工作相同的数量,就意味着其他人也将在某个时间点工作3个星期一晚上,这很好。这让我觉得GA的功能对我来说太“先进”了,因为我的问题已经从GA的起点解决了。 但是话又说回来,GA真的真的像是为此而生的,所以我可能无法正确理解它? 无论如何,因为我从未使用过GA(或神经网络,或任何种类的东西),所以我想确保在从事像这样的学习过程之前,我会选择正确的方法。 我的问题 : 对于像我这样的问题,您认为什么是好的方法/算法/技术?加油站?神经网络?还有其他完全不同的东西吗? 我全神贯注,并在需要时提供更多详细信息,但我想我已经很清楚了:)

3
用于物品运输的3d包装算法
我收到了一个建立运输估计量的任务,该估计量建议在尽可能少的盒子上最好地容纳商品: 有一组已知的矩形框大小 盒子里有很多随意的矩形物品要包装 最好使用的盒子越少越好。因为运送两个盒子1x1x1比一个盒子1x2x1贵得多。这应该是这里的优先事项。 还应该对其进行优化,以尽可能使用较小的盒子作为第二优先级。(例如:如果在一个较大的框与两个较小的框之间进行选择,则应选择较大的框) 物品可以旋转以适合盒子,但是旋转必须至少限制为45°的增量(在我的研究中,似乎有些配置允许45度旋转才能更好地将矩形盒子容纳在更大的矩形盒子中) ,以90°旋转为标准。 盒子有重量限制,物品具有任意重量(例如:大小为1x1x1的物品可能比其他2x2x2物品重) 我进行了一些研究,找到了一些关于装箱和背包问题的抽象算法,并带有以下一些蛮力变化,类似于最佳拟合算法: 在“要包装的物品”列表上按递减的顺序对物品进行排序(从大到大) 对于此列表中的每个项目: 选择“二手箱”列表上的较小箱子,该箱子有足够的剩余体积和重量限制以适合该物品(我在这里使用“适合”表示适合尺寸和重量) 如果没有这样的盒子,请从已知的可能的盒子尺寸中创建一个新的盒子,该盒子是可以容纳物品尺寸和重量的最小尺寸,并将其添加到“二手盒子”列表中。 如果一个盒子适合该物品(使用下面的拟合功能),则将其添加到“此盒子的物品”列表中,并将其从“适合盒子的物品”列表中删除,在盒子内标记其相对3d位置。 从2.1开始重复,直到“要包装的物品”列表上没有适合的物品。 上面步骤2中使用的拟合检查功能: 检查包装箱的剩余容量是否适合项目的容量。如果不是,则返回false。 检查“盒子物品”重量加上当前物品重量的总和是否小于或等于盒子重量限制。如果不是,则返回false。 检查“框的项目”列表,以选择第一个具有最小Y分量并且具有足够空间用于该项目的宽度,深度和高度的框坐标,同时将其他项目视为不可用的空间。 如果该项目不适合其当前方向,请以6种可能的旋转方式之一进行旋转,为简单起见,不假设旋转45度。(旋转会导致尺寸已被测试的尺寸可以跳过。例如:将盒子旋转180°会得到与原始位置相同的尺寸,因为所有盒子和物品的相对面尺寸都相同,因此可以忽略。) 如果没有将商品以所有可能的方式旋转回其原始方向,请从步骤3重新尝试。 如果尝试了所有旋转但没有找到合适的旋转,则将当前坐标视为不可用的空间。 如果没有可用空间检查,则返回false。否则,请从步骤3再试一次。 我想知道在给定的限制条件下是否可以找到解决我问题的最佳方法。 这似乎在理论上可行,但我还没有在代码上尝试过。我想知道我是朝着正确的方向走,还是有更好,更高效的方法来做到这一点。 参考会很棒。 编辑: 我发现一些有趣的第三方API可以满足我的要求,但是必须断开连接,因此我将无法访问它们。 一些例子是: http://v2.3dbinpacking.com/demo/main http://www.packit4me.com/api 编辑2: 一个实际的要解决的问题的示例是: 我有4个尺寸为WxHxD的盒子:10x12x18、12x16x24、16x20x30、24x32x40 我有4个项目的订单,分别是大小为6x8x10、2x 22x14x30和1x 22x4x20的1个项目 如何使用尽可能少的盒子,尽可能小的盒子和尽可能少的可用空间将这些物品装入一个或多个大小的盒子中?


3
双向同步的冲突解决
假设连接并不总是可用的,您如何管理“主”数据库服务器和许多“辅助”服务器之间的双向同步,特别是解决冲突? 例如,我有一个移动应用程序,该应用程序使用CoreData作为iOS上的“数据库”,并且我希望允许用户在没有Internet连接的情况下编辑内容。同时,此信息可在设备将连接到的网站上找到。如果/当两个数据库服务器上的数据发生冲突时,该怎么办? (尽管我知道CoreData有点不同,但我将其称为DB服务器。) 是否有处理此类问题的一般策略?这些是我可以想到的选项: 1.始终将客户端数据用作更高优先级 2.与服务器端相同 。3.尝试通过标记每个字段的编辑时间戳并进行最新编辑来解决冲突。 尽管我敢肯定,第三个选项会为破坏性的数据破坏打开空间。 我知道CAP定理与此有关,但是我只想最终保持一致,所以不能完全排除它,对吗? 相关问题:双向数据同步的最佳实践模式。对这个问题的第二个回答说,这可能无法完成。

4
开发人员应该完全了解哪些算法和数据结构?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 4年前关闭。 我想成为一名成功的企业Java开发人员。我应该精通哪些算法和数据结构?您会推荐什么书给我? 要成为一名成功的Java开发人员,我是否需要了解所有高级算法,例如CLRS中给出的算法? 您可以按优先级从高到低的顺序列出我应该学习的主题吗? 我必须知道: 正在搜寻? 排序? 图/树? 等等?

5
一个字符有什么好的搜索算法吗?
我知道几种基本的字符串匹配算法,例如KMP或Boyer-Moore,但是所有这些算法都在搜索之前就对模式进行了分析,但是,如果有一个字符,就没有太多要分析的了。那么,有什么比天真搜索更好的算法来比较文本的每个字符呢?

8
确保函数永远不会两次返回相同的值[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 5年前关闭。 这是我在求职面试中被问到的一个问题,我无法弄清楚他们正在寻找的答案,所以我希望这里的人可能有一些想法。目的是编写一个保证永远不会两次返回相同值的函数。假设该功能将被多台机器同时访问。 我的想法是为每台机器分配一个唯一的ID,并将该值传递到唯一的值生成器函数中: var i = 0; function uniq(process_id, machine_id) { return (i += 1).toString() + machine_id + "-" + process_id; } 这将避免竞争条件带来的影响,因为即使两个或多个进程读取的相同值i,每个返回值都被标记为进程ID和计算机ID的唯一组合。但是,我的面试官不喜欢这个答案,因为使另一台计算机联机需要为其分配ID。 因此,有人能想到另一种解决此问题的方法,而不涉及将每台机器配置为具有唯一的ID吗?如果这个问题再次出现,我想得到一个答案。谢谢。

7
您最好使用哪种算法来实现字符串相似性?
我正在设计一个插件,用于根据地址唯一标识各种网页上的内容。 所以我可能有一个看起来像的地址: 1 someawesome street, anytown, F100 211 稍后我可能会发现此地址的格式略有不同。 1 someawesome street, F100 211, 或像 someawesome street F100 这些在技术上是相同的地址,但是具有相似的水平。我想a)为每个地址生成一个唯一的标识符以执行查找,b)找出何时出现非常相似的地址。 我应该查看哪些算法/技术/字符串指标?Levenshtein距离似乎是一个显而易见的选择,但对是否还有其他方法可以在这里使用感到好奇。

2
将循环(while / for)转换为递归或从递归转换为循环的一般方法?
这个问题主要集中在算法上,也许是抽象的并且更学术化。 这个例子提供了一个想法,我想用一种通用的方式,所以例子仅用于使我们更清楚地了解您的想法。 一般来说,循环可以转换为递归的。 例如: for(int i=1;i<=100;++i){sum+=i;} 其相关的递归为: int GetTotal(int number) { if (number==1) return 1; //The end number return number+GetTotal(number-1); //The inner recursive } 最后,为了简化此过程,需要执行尾递归: int GetTotal (int number, int sum) { if(number==1) return sum; return GetTotal(number-1,sum+number); } 但是,大多数情况下都不容易回答和分析。我想知道的是: 1)我们能否获得一种“通用方式”将循环(for / while……)转换为递归?在进行转换时,我们应该注意哪些事情?最好写一些示例的详细信息以及您的persudo理论以及转换过程。 2)“递归”具有两种形式:线性递归和尾递归。那么哪个转换更好呢?我们应该掌握什么“规则”? 3)有时我们需要保留递归的“历史”,这很容易在循环语句中完成: 例如: List<string> history = new List<string>(); …



3
如何实施加权洗牌
我最近写了一些我认为效率很低的代码,但是由于它只包含几个值,所以我接受了它。但是,我仍然对以下方面的更好算法感兴趣: X个对象的列表,每个对象都分配有一个“权重” 权重总和 生成一个从0到总和的随机数 遍历对象,从总和中减去它们的权重,直到总和为非正数 从列表中删除该对象,然后将其添加到新列表的末尾 项目2,4和5都需要n时间,因此这是一种O(n^2)算法。 这可以改善吗? 作为加权随机播放的示例,元素具有更大的重量,位于前部的机会更大。 示例(我将生成随机数以使其真实): 6个权重为6,5,4,3,2,1的对象; 总和是21 我选择了19 19-6-5-4-3-2 = -1:,因此2进入了第一位置,权重现在为6,5,4,3,1; 总和是19 我选择了16 16-6-5-4-3 = -2:,因此3进入第二位置,权重现在为6,5,4,1; 总和是16 我选择了3 3-6 = -3,因此6排在第三位,权重现在为5,4,1;总和是10 我选择8:,8-5-4 = -1因此4排在第四位,权重现在为5,1;总和是6 我选择5:,5-5=0因此5排在第五位,权重现在为1;总和是1 我选择了1 :1-1=0,因此1移到最后一个位置,我没有重量了,我完成了
22 algorithms 

12
如何编写命令解释器/解析器?
此问题是从Stack Overflow 迁移而来的,因为可以在Software Engineering Stack Exchange上回答。 迁移 7年前。 问题:以字符串形式运行命令。 命令示例: /user/files/ list all; 相当于: /user/files/ ls -la; 另一个: post tw fb "HOW DO YOU STOP THE TICKLE MONSTER?;" 相当于: post -tf "HOW DO YOU STOP THE TICKLE MONSTER?;" 当前解决方案: tokenize string(string, array); switch(first item in array) { case "command": if …

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.