Questions tagged «algorithms»

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

2
如何有效地计算图形旋转?
我有一个通过字节矩阵(类似位图的矩阵)表示的图形。示例图显示在上Picture 1。 目的是找到给定图形的最佳旋转角度。当图形旋转最佳角度时,与X和Y轴平行并刻有图形的矩形的面积最小。 刻有图形的矩形在图片上显示为浅灰色。在中Picture 2,您可以看到图形的理想旋转方向为顺时针大约30度。 现在,我知道算法如何找到该角度,但是在我看来这是非常低效的。它是这样的: 循环从0到45度的角度。 对于当前角度,为每个图形点计算新的旋转位置 查找包含图形(最小和最大x,y)的矩形的边界,如果到目前为止最匹配,则对其进行注册 下一个角度 这是一种蛮力方法,对于小人物来说效果很好且相当快。但是,我需要处理包含多达1000万点的图形,并且算法变得缓慢。 什么是解决这个问题的好算法?

2
数据结构和算法之间是什么关系?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 我一直在寻找有关数据结构的好的在线课程,但发现Google还会返回算法课程的结果,其中包含以下内容: 在本课程中,您将学习算法设计的一些基本原理:分而治之方法,图形算法, 实用的数据结构(堆,哈希表,搜索树),随机算法等等。[资源] 和 在本课程结束时,您将了解为图形和其他重要数据结构设计新算法 并评估这些算法的效率所需的关键概念。[资源] 和 本课程介绍了计算问题的数学建模。它涵盖了用于解决这些问题的通用算法,算法范例和数据结构。[资源] 我的问题是:算法和数据结构是否紧密相连,这意味着它们必须被一起理解,或者一个主题比另一个主题更基础? 编辑:对于那些投票赞成关闭这个问题的人,您能告诉我为什么以及也许如何改善这个问题吗?学习提出正确的问题是教育过程的一部分。

3
在垃圾回收中使用哈希表是否可以解决标记和清除问题?
在mark-sweep-compact垃圾回收算法中,重新定位对象时必须停止工作,因为引用图变得不一致,并且必须替换指向该对象的所有引用的值。 但是,如果您有一个哈希表,其中对象ID为键,指针为值,并且引用将指向该ID而不是对象地址...那么固定引用将仅需要更改一个值,并且仅当对象时才需要暂停试图在复制期间写入... 我的思路有误吗?

6
找出可能要去买羊角面包的人,
想要改善这篇文章吗?提供此问题的详细答案,包括引文和为什么您的答案正确的解释。答案不够详细的答案可能会被编辑或删除。 一个团队决定每天早上有人应给每个人带羊角面包。每次都不应该是同一个人,因此应该有一个系统来确定下一个轮到谁。这个问题的目的是确定一种算法,以确定明天将把羊角面包带给谁。 约束,假设和目标: 谁来带羊角面包将在前一天下午确定。 在任何一天,都会有人不在。该算法必须选择当天要出席的人。假设所有缺勤都是提前一天知道的,因此可以在前一个下午确定新月形面包的购买者。 总体而言,大多数人都在大多数时间都在场。 为了公平起见,每个人都应该购买羊角面包,其次数应与其他人一样多。(基本上,假设每个团队成员都有相同数量的钱用于羊角面包。) 为了减轻花名册的无聊感,最好具有一些随机性或至少感知到的随机性。这不是一个硬性约束:它更多是一种审美判断。但是,同一个人不应连续两次被选中。 带羊角面包的人应该事先知道。因此,如果人P在D日带上羊角面包,那么应该在人P出现的前一天确定这一事实。例如,如果总是在前一天确定了羊角面包的携带者,那么应该是前一天在场的人之一。 团队成员的数量足够少,以至于存储和计算资源实际上是无限的。例如,该算法可以依靠过去曾带谁羊角面包的完整历史记录。每天在快速PC上进行几分钟的计算就可以了。 这是一个现实问题的模型,因此,如果您认为这些假设可以更好地模拟场景,则可以自由挑战或完善这些假设。 起源1:找出谁要购买 Florian Margaine 的羊角面包。 起源2:找出谁打算购买 Gilles 的羊角面包。 这个问题与Gilles的版本相同,已作为实验重新发布在Programmers上,以查看不同社区如何应对编程挑战。

6
所有编程问题都是算法问题吗?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 5年前关闭。 我喜欢Cormen等人的“算法简介”。传达知识。原因之一是,一切都与编程问题有关,而本书并未以任何特定的编程语言来实现。这种语言独立性使人们可以集中精力于总体思路。 所以我的问题是,正如标题中所说。通过以这种算法方式进行思考,是否可以解决所有可解决的编程问题。无论哪种语言,领域等等?如果是,请给参数,否则请给参数! 我还没有使用GUI,AI,图形等实现许多复杂的程序。但是,这些类型的问题是否也在考虑好的算法上?
13 algorithms 

3
在固定的固定时间内初始化数组-这个技巧叫什么?
有这种数据结构可以交换数组访问的性能,而不需要在清除数组时对其进行迭代。您需要为每个条目保留一个世代计数器,以及一个全局世代计数器。“清除”操作会增加生成计数器。在每次访问时,您都要比较本地生成计数器和全局生成计数器。如果它们不同,则将该值视为“干净”。 这是最近在Stack Overflow上的答案中提到的,但是我不记得这个技巧是否有正式名称。可以? 如果只需要放松节点的一小部分子集,并且必须重复进行一次,Dijkstra算法就是一个用例。

3
插值搜索与二进制搜索
什么时候应该使用插值搜索而不是二进制搜索? 例如,我有一个排序的数据集,在什么情况下我应使用二进制搜索在此数据集中查找项目,或者在什么情况下应使用插值搜索? 数据集的哪些属性将是决定因素?
13 algorithms 

4
数据库模糊搜索概念
我对此进行了思考,并且一直在尝试提出有关如何模糊搜索数据库的解决方案,例如,如果用户键入了拼写错误。这个逻辑背后有什么明显的问题吗?它会工作吗,并且以前做过吗? 我们希望搜索的表: **tblArticles** Body - Soundex_Body - CharacterCoded_Body 因此,我们存储原始文本正文以进行物理显示。其他两列用于通过以下方式预先计算的搜索: 声音 正文被分解成单词,然后翻译成其soundex版本。IE,生成的正文可能类似于: H252 B54 C23 E33... etc 因此,有人可能会输入“恐龙”,而本文的正文为“恐龙”,则两者均等于B26。然后,我们对搜索词的soundex值运行一个LIKE。 字符编码 给定一个将char映射到质数的字符映射,即IE: h = 2 e = 3 l = 5 o = 7 p = 11 c = 13 help = 2*3*5*11 = 330 hello = 2*3*5*5*7 = 1050 hell = 2*3*5*5 …

2
我应该考虑哪种k-best最短路径算法?
我正在解决图搜索优化问题。我需要通过有向加权图找到k个最佳非循环最短路径。 我知道有很多精确的和近似的k最佳算法,但是最近的大多数研究似乎都针对非常大,非常稀疏的关系图(例如道路路线和方向),而我的图都不是。 区分我的问题的方面: 该图包含大约160个顶点。 该图几乎完全连接(双向,所以〜160 ^ 2〜= 25k边) k会很小(可能小于10) 最大路径长度可能会有限制,并且也非常小(例如3-5条边) 我在上面说了“非循环”,但只是重申一下,解决方案不得包含循环。这不是1最佳最短路径的问题,但对于k最佳路径却成为问题-例如,考虑一条道路路线-从A到B的第二最短路径可能与1最佳路径相同,在某个地方的街区附近快速旅行。从数学上讲,这可能是最佳选择,但不是非常有用的解决方案。;-) 对于每个计算,我们可能需要即时重新加权边缘。边缘成本由几个因素的加权总和组成,最终要求(无论何时获得)都可以使用户指定自己对这些加权因子的优先级,从而改变边缘权重。这是一个相对较小的图(我们应该能够以几百KB表示它),因此将图克隆到内存中,应用重新加权,然后对克隆的图执行搜索可能是合理的。但是,如果有一种更有效的搜索方法,可以即时计算权重,那么我很感兴趣。 我正在研究Santos(K最短路径算法),Eppstein 1997(查找k最短路径)等中描述的算法。日元的算法很受关注,这主要是因为现有的Java 实现。我不害怕阅读研究论文,但是我认为值得抛开我的问题的细节,并要求提供指针以节省一些阅读时间。 而且,如果您有指向Java实现的指针,那就更好了。
13 java  algorithms 

2
摊销分析?(最坏情况下的性能保证)
什么是摊销分析?以及它如何帮助我在程序中实现最坏情况的性能保证? 我正在阅读以下技术可以帮助程序员获得最坏情况的性能保证(即,用我自己的话说:保证程序的运行时间不会超过最差转换的运行时间): 随机算法(例如,在最坏的情况下,快速排序算法是二次方的,但是对输入进行随机排序可以保证其运行时间是线性的概率) 操作顺序(我们的分析必须同时考虑数据和客户端执行的操作顺序) 摊销分析(提供绩效保证的另一种方法是通过跟踪所有工序的总成本除以工序数来摊销成本。在这种情况下,我们可以允许一些昂贵的工序,同时保持平均成本换句话讲,通过将一部分费用分配给大量廉价操作中的每一项,我们分散了一些昂贵操作的成本) 作者提到将调整数组数据结构的大小用于Stack作为如何实现摊销分析的一个示例,但我仍然不明白什么是摊销分析,以及如何实际实现(摊分分析?铸造性能保证


5
寻找最适合圈子的人
下面是一个示例图像,如果我在中间有一个白点,并且我想找到所有可能存在的红色圆圈,则该蓝色圆圈的位置可能最近(显然是我放置它的位置) 。如何找到该位置? 对我来说,性能并不是此应用程序的主要问题。

1
将Zoombinis安置在Cajun上尉的渡船上的算法?
我最近一直在玩《Zoombinis的逻辑之旅》的重发行,并尝试实现一些可以解决各种难题的计算机算法。我被卡在如何解决卡琼船长的渡船难题上。 对于那些不熟悉的人,Zoombini是一种具有4种属性的生物:头发,眼睛,鼻子和脚。这些属性中的每一个都有5个可能的值。例如,Zoombini的脚可以是轮子,溜冰鞋,运动鞋,弹簧或螺旋桨。这是Zoombini的例子,头发凌乱,眼镜,鼻子绿色和运动鞋凌乱: 在渡船难题中,任务是在渡船的16个座位上安排16个Zoombinis集合。该布置必须遵守以下规则:任何两个正交相邻的座椅必须由共享至少一个特征的Zoombinis占用。如果两个Zoombinis有不同的发型,不同的眼睛,不同的鼻子,和不同的脚从彼此,他们可能不会坐在旁边给对方。 座位的安排会随着级别的变化而变化;为了具体起见,让我们集中讨论“非常困难”级别,其中16个座位以4×4网格排列。这是合法放置15个Zoombinis的示例,但最终站在码头上的Zoombini不能放在最后一个空座位上,因为她不会与右侧的Zoombini分享任何功能: 有16个!≈21万亿可能的Zoombinis分配给座位。因此,简单地遍历所有可能的任务以查看其是否合法是不现实的。我可以采用哪些启发式方法明智地解决此问题?
12 algorithms 

1
灵活实施DIFF的启发式方法
我创建了一个DIFF实现,以比较工作中的文档修订。它基于O(ND)差分算法及其变体。 变得很重要的一件事是获取更改列表并将其解释为人类可读的文本。尽管当前算法非常有效,但它是如此之大,以至于难以扩展。 简短问题 我当时正在考虑尝试使用A *和一种启发式方法,该方法会增加“转弯”的惩罚。想法是消除不必要的“添加,删除,添加,删除,添加,删除”,以便更轻松地解析为人类可以阅读的内容。基本上,将我的最短路径问题变成最简单的路径问题。 当然,不要创建始终为“删除所有内容,添加所有内容 ”的输出 听起来合理吗? 在DIFF实现中使用启发式算法是否有优先权?什么是启发式? 问题: 如果删除了一个长句子,又删除了另一个长句子,但它们确实共享至少一个单词,请说“与”。不理会常见单词(不要同时添加和删除它)将创建最短路径。但是,这实际上只是使尝试混淆更改打印内容的人感到困惑。 当前DIFF的示例: 旧文本: 清洁:用力洗净并用车间空气吹干。 新文本: 清洁:用丙酮和无绒布擦拭。 变更单清单: 将“强力清洗并吹干”更改为“用丙酮擦拭” 将“商店空气”更改为“丙酮和无绒布” 注意:使用“更改”代替 “删除'购买空气',添加'丙酮'” 如您所见,第二个注释失去了所有上下文,并且在没有查看完整的旧文本和新文本集的情况下,您无法理解其含义。 关于标点符号的注意事项: 我将标点符号分隔为单独的“单词”,这样我就可以 添加“(” 代替 将“修复”更改为“((修复) 因为这令人讨厌。但是,这意味着如果两个文本中甚至有一个逗号(与前面示例中的单词“ with”相对),就会发生相同的情况。 可能的解决方案: 我认为我可以使用不同的路径查找算法,从而使我能够灵活地为可能对人更有意义的不同更改“路径”增加权重。也许,我什至可以使旅行到包含标点符号的节点的权重很小(不确定这将如何影响其他事情)。 然后,我可以得到前面的示例以列出以下内容: 变更单清单: 将“ Powerwash并用商店空气吹干”更改为“用丙酮和不起毛的布擦拭” 看到!更清晰! 我知道我会在性能上受到打击,并且可能必须对程序进行大刀阔斧的检修,但是获得所需的最终结果更为重要。 底线: 同样,在DIFF实现中使用启发式方法是否有优先次序,这是什么? 其他想法?合理的时间投入?还有其他想法吗?其他算法? 提前致谢! 编辑: 我试图澄清/巩固我的问题,并推广我的问题,以在我的算法中添加启发式方法,而不是使用A *。在这种情况下,基本上是相同的事情,但是我现在仍然认为更准确。 这篇文章很有见地。

2
功能编程和状态算法
我正在用Haskell学习函数式编程。同时,我正在研究自动机理论,由于两者看起来很融洽,所以我正在编写一个小型库来玩自动机。 这就是让我问的问题。在研究评估状态可达性的方法时,我想到了一个简单的递归算法效率不高,因为某些路径可能共享某些状态,而我可能最终不只一次评估它们。 例如,在这里,评估可达性的摹从一个,我必须排除˚F双方同时检查通过路径d和Ç: 因此,我的想法是,在多个路径上并行工作并更新排除状态的共享记录的算法可能很棒,但这对我来说太过分了。 我已经看到,在某些简单的递归情况下,可以将状态作为参数传递,这就是我在这里要做的,因为我向前传递了要避免循环的状态列表。但是是否有一种方法也可以向后传递该列表,例如将其与canReach函数的布尔结果一起返回到元组中?(尽管这有点强迫) 除了示例案例的有效性之外,还有哪些其他技术可用来解决此类问题?我觉得这些必须足够普遍,以至于必须有解决方案,例如fold*or 会发生什么map。 到目前为止,阅读learningyouahaskell.com并没有发现任何内容,但考虑到我还没有接触过monad。 (如果有兴趣,我将代码发布在codereview上)

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.