Questions tagged «algorithms»

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

3
为什么迭代版本需要更长的时间?
我查看了http://programming.lispdream.com/blog/2011/06/recursion-vs-iteration/,发现在他执行阶乘函数的递归和迭代实现时,迭代实际上需要更长的时间给定n = 1,000。我不知道为什么(他没有解释,而是说这是对读者的练习)。对不起,我很陌生。

1
算法:寻找最佳赌桌(赌徒问题)
前言 这不是代码高尔夫球。我正在寻找一个有趣的问题,希望能征询同行的意见和建议。这个问题不是(唯一地)关于纸牌计数,而是关于根据观察结果确定最适合的牌桌。假设您是否会进行某种大脑植入,使最坏情况下的时间/空间复杂性(在任何给定的体系结构上)都可以被人脑移植。是的,这是相当主观的。假设法国甲板上没有使用通配符。 背景 我最近去了一家赌场,看到每桌的旁观者多于旁观者,并想知道考虑到大多数旁观者都有钱可玩,因此选择过程将旁观者变成了下注者。 情境 您进入赌场。您会看到n个牌桌在玩二十一点的变种,其中有y个在玩浮桥。每张桌子上都有不确定数量的纸牌,以掩盖房屋的优势。 每张赌桌都有不同的最低赌注。您的个人身上有Z货币。您要在以下位置找到表: 使用最少的纸牌 最低下注高于使用更多副牌的赌桌,但您想最大化Z可以玩的游戏数量。 每位玩家的净损失是最低的(我意识到,在大多数答案中,这被认为是偶然的噪音,但这可能说明混响器损坏了) 问题 您可以神奇地观察每张桌子。为了进行决策,您需要进行X轮抽样。为此,每个玩家花费的时间不超过30秒。 您将使用哪种算法来解决此问题,最坏情况的复杂度是什么?你呢: 玩浮桥还是二十一点? 您选择什么表? 考虑到娱乐场最多只能使用八副牌,您需要观察几轮(X的值是多少)?每张桌子有2至6位玩家。 你在找桌子的时候站了多久? 我称其为“ 长期赌徒问题 ”是因为缺乏更好的术语。请随时对其进行完善。 额外 如果不在赌场,这在哪里有用? 最后 我不是在寻找神奇的赌博子弹。我只是注意到一个变成骨头的问题,我的大脑根本不会停止咀嚼。除了访问赌场之外,我对应用程序方式特别感兴趣。
11 algorithms 

4
重新排序项目时生成排序键
我们有许多项目,最终用户将可以将它们组织成所需的顺序。项目集是无序的,但是每个项目都包含一个可以修改的排序键。 我们正在寻找一种算法,该算法将允许为添加或移动为第一项,最后一项或任何两个项目之间的项目生成新的排序键。我们希望只需要修改要移动的项目的排序键。 一个示例算法是使每个排序键为浮点数,并且在将一项放置在两个项之间时,将排序键设置为其平均值。第一个或最后一个放置项将采用最外层的值+/- 1。 这里的问题是浮点精度可能会导致排序失败。类似地,使用两个整数表示小数可能会使数字变得很大,以致于无法以常规数值类型(例如,当以JSON格式传输时)准确地表示它们。我们不想使用BigInts。 是否有合适的算法对此起作用,例如使用字符串,而不会受到这些缺点的影响? 我们不希望支持大量的移动,但是上述算法可能会在大约50个移动后出现在双精度浮点数上而失败。
11 algorithms 

1
算法/数据结构来回答“我可以用这套配料制作什么食谱?”
形式上,令s(U,Q)= { V | V ∈ ù和V ⊆ Q },其中ü,Q,和V都表示集,和ü,更具体而言,代表一组套。举例来说,U可能是食谱中各种配方所需的一组(一组)配料,其中Q代表一组配料,我有V表示我可以用这些配料制作的配方。查询s(U,Q)对应于“这些成分我能做什么?”的问题 我正在寻找的是一个数据表示该指标ü以这样一种方式,它支持高效的查询小号(ü,Q),其中Q和全体成员ü一般会比较小到所有成员的工会ü。另外,我希望它能够有效地更新U(例如,添加或删除配方)。 我忍不住想必须很好地理解这个问题,但是我找不到它的名称或参考。有谁知道有效解决此问题的策略,或者我可以在此获得更多了解的地方? 就考虑解决方案而言,我曾想过要为集合U建立决策树。在树的每个节点上,问题“您的成分表中是否包含x?” 将要求选择x来最大化被答案消除的U成员的数量。随着U的更新,将需要重新平衡决策树以最小化找到正确结果所需的问题数量。另一个想法是用一个n维布尔“八叉树”(其中n是唯一成分的数量)表示U。 我相信“用这些成分可以制成哪些食谱?” 可以通过以下方法得到答案:将食谱中的食谱(所需的成分集)的笛卡尔乘积与一个成分具有的幂集相乘,然后对两个元素均相等的对进行过滤以得到有序对,但是这不是一个有效的解决方案,我要问的是如何优化这种操作;如何在SQL中将其组合为有效的?SQL怎么做才能使其高效? 尽管我使用的是食谱和一组配料的食谱,但我预计尽管配料的数量很多,但“食谱”和“配料”的数量将非常大(每种多达数十万)在给定的配方中,给定的配料集中的配料数量将相对较小(典型的“食谱”大约为10-50,典型的“配料”大约为100)。另外,最常见的操作将是查询s(U,Q),因此它应该是最佳的。这也意味着,需要检查每个配方或对每种成分进行操作的蛮力算法本身会很不理想。通过巧妙的缓存,

6
用于显示X个百分比滑块的UI的算法,这些滑块的链接值始终总计为100%
我正在构建的系统包括一组UI滑块(数量有所不同),每个滑块的比例为0-100。滑块是指一个用户界面,您可以在其中抓取一个元素并将其上下拖动,就像音量控件一样。它们通过一种算法进行连接,以确保它们始终总为100。因此,当一个滑块向上移动时,其他所有滑块都向下移动,最终变为零。当一个向下移动时,其他向上移动。在任何时候,总数必须为100。因此,此处的滑块具有不同的值,但总计为100%: ----O------ 40 O---------- 0 --O-------- 20 --O-------- 20 --O-------- 20 如果第一个滑块然后从40向上移动到70,则其他滑块的值必须向下移动(拖动滑块时)。请注意,三个滑块从20更改为10,一个滑块保持在零,因为它不能降低。 -------O--- 70 O---------- 0 -O--------- 10 -O--------- 10 -O--------- 10 当然,当任何滑块达到0或100时,它都无法进一步移动,这就是我的头部开始真正受伤的地方。因此,如果滑块向高处移动,则其他滑块向低处移动,但是当其中任何一个达到零时,只有尚未达到零的其余滑块才能向低处移动。 我在这里问这个问题,因为这个问题特定于算法而不是实现。FWIW该平台是Android Java,但这并不特别相关。 我第一次刺中的方法是计算移动的滑块的百分比变化。然后,我拆分该更改并将其(沿另一个方向)应用于其他滑块值。但是,问题在于,如果使用百分比乘以,如果任何滑块滑到零,就永远不会再从零开始增加-最终结果是各个滑块卡在零上。为了避免舍入问题,我使用了范围为0-1,000,000的滑块,这似乎很有用,但是我还没有创建一种能够很好地处理所有情况的算法。
11 algorithms  gui  ui 

3
什么是哈希圣经?
在哈希表和哈希表上是否有类似Cormen的参考书?由于某种原因,这种特殊的结构在我的CS教育中很少受到关注,但是我想学习更多,因为它们似乎无处不在。我知道Cormen会介绍它,但我正在寻找更专业,更深入的内容。

4
确定是否可以使用递归解决问题的考虑因素是什么?
有时在面试中,我可能会使用递归来解决问题(例如,添加1到无限精度整数),或者当问题本身适合使用递归时。有时,可能是由于大量使用递归来解决问题,因此,不用考虑太多,就使用递归来解决问题。 但是,在决定使用递归解决问题之前,应考虑哪些因素? 我有一些想法: 如果我们对每次都减半的数据使用递归,那么使用递归似乎没有问题,因为所有可以容纳16GB RAM甚至8TB硬盘的数据都可以通过深度仅为42层的递归进行处理。(因此不会出现堆栈溢出(我认为在某些环境中,堆栈的深度可以达到4000层,远超过42级,但是同时,这还取决于您拥有多少局部变量,因为每个调用堆栈占用的内存更多)如果有很多局部变量,则是确定堆栈溢出的是内存大小而不是级别)。 如果您使用纯递归来计算斐波那契数,那么您真的要担心时间复杂性,除非您缓存中间结果。 以及如何添加1到无限精度整数?也许这是有争议的,例如,您将使用长度为3000位数或4000位数的数字,以至于它会导致堆栈溢出吗?我没想到,但是答案可能不是,我们不应该使用递归,而应该使用普通循环,因为如果在某些应用程序中,该数字确实需要4000位数长,以检查某些数字,该怎么办?数字的属性,例如数字是否为质数。 最终的问题是:在决定使用递归解决问题之前,有哪些注意事项?

8
哪种算法需要一套?
在我的第一门编程课程中,我被告知我每当需要执行某些操作(例如删除某些重复项)时都应该使用一组。例如:要从向量中删除所有重复项,请遍历所述向量并将每个元素添加到集合中,然后剩下唯一的情况。但是,我也可以通过将每个elemento添加到另一个向量并检查该元素是否已经存在来做到这一点。我假设根据所使用的语言,性能可能有所不同。但是,除了其他原因,还有其他理由使用吗? 基本上:哪种算法需要一个集合,而其他任何容器类型都不应该完成?

3
类似于TDD的算法问题解决方法
我在Codility的一次算法测试中失败了,因为我试图找到一种更好的解决方案,最后我一无所有。 因此,这让我开始思考是否可以使用类似于TDD的方法?即我是否通常可以以类似的方式逐步开发解决方案? 如果我正在编写排序算法,则可以从标准Bubblesort转换为2-way Bubbleort,但是诸如Quicksort之类的更高级的东西将是“量子飞跃”,但至少我拥有可以轻松验证的测试数据。 有关此类测试的其他提示?下次我要做的一件事是使用比内部循环更多的方法/函数。例如,在排序中,您通常需要交换。如果是一种方法,我只需要修改调用代码。我什至可以拥有更高级的解决方案作为派生类。 对于“算法”与“常规”问题,我指的是时间复杂性很重要的问题。因此,您不必像在TDD中那样通过更多的测试,而应使其“表现得更好”。 “类似于TDD”是指: 编写相对自动的测试以节省手动测试pr增量的时间。 增量发展。 回归测试,能够检测代码是否中断或至少在两次增量之间功能是否发生了变化。 如果您比较一下,我认为这应该很容易理解 直接编写shell排序 从Bubblesort跳到quicksort(完全重写) 从单向冒泡排序逐步转换为外壳排序(如果可能)。

2
覆盖率-算法中的缺陷-如何摆脱它的使用?
介绍 许多主线矢量图形渲染引擎都存在算法缺陷。它们分别渲染每个形状,并通过计算像素覆盖率来消除锯齿,然后将它们彼此叠加在一起。是的,它很简单,但是正确的解决方案甚至更简单。 这就导致了合并问题,因为它通过透明性扩大了覆盖范围。Alpha混合遵循的规则不能准确表示情况,例如,以50%覆盖的像素与50%互补覆盖的像素相邻的像素,其覆盖率最终不会达到100%,而覆盖率最终达到75% 。它的外观取决于算法的调整方式和其他细节,但从本质上讲这是一个已知的错误。甚至有人在记录不同的引擎错误以及写一篇论文说明如何更好地解决问题方面费了很多力气。 图像1:完全不具有代表性的示例,呈现的形状是由三角形组成,在顶部显示放大的误差。SVG来源 这个问题有一个简单的天真解决方案*,只是超级样本,没有覆盖率计算,并且将图像过滤掉。作为奖励,您可以使用比框滤波更好的图像重建算法(请参阅像素不是正方形3)。甚至有些解决方案的速度可以与当前解决方案相提并论,并且这些解决方案在硬件光栅化管道中更容易实现(并且您在GPU上很少看到此错误,因为它是为避免这个问题而构建的)。 这也不是没有成本的问题。有许多从事图形设计工作的人花费大量时间来尝试手动解决此问题,方法是确保此处没有重叠,而那里没有重叠以解决计算机应为他们解决的问题。而且在很多情况下都会失败。但是他们的客户不在乎为什么必须在那里解决错误。 题 错误如何传播?由于它们都在执行相同的错误,因此可以得出结论,他们对算法使用相同的源。是什么导致设计人员选择此算法?为什么只有3D程序员会识别此错误,甚至将其错误编入其API和教学中,而2D程序员却没有呢? 如何确保此错误不再继续传播? 附录(但我不是在问这个) *显然,我声称超级采样无缺陷的工作是非凡的,并且需要非凡的证明。好的,所以超级采样工作的关键是超级采样不进行覆盖处理。本质上,超级采样器将每个样本视为点样本。由于点样本不假设基础区域,因此不会在没有发生的情况下进行alpha比较。 为了使其始终如一地工作,如答案之一所述。为了一致性,我们需要使用整数采样来处理样本。这可以确保每个点一旦转换为屏幕空间,对于相同的坐标都将获得完全相同的解决方案,并且没有任何样本被像素边界遮挡2次。要做到这一点,一个样本可能不会触发一个像素,如果它是例如左侧底部样本,则它可能不会完全打开(因此我们制定了一条规则,即在> vs <=中处理确切的边缘)。除一个控制台图形卡外,其他所有图形卡都按此方式工作。它确保不需要缓存额外的数据,也不需要进行额外的附近测试。与基于覆盖的解决方案相比,该解决方案更稳定,更通用,更一致。 该算法与原始算法完全相同,但代码更少,样本更多。因此,与基于覆盖的算法相比,它甚至是一致的。我们之所以知道这一点,是因为我们几乎在其他任何信号处理领域以及图形卡中都使用了这种方法。 那么这种方法有缺点吗?好吧,如果您只是天真的假设,那就慢了一点。从理论上讲,它比覆盖范围栅格化器具有更快的渐近行为,有点像光线跟踪器,它在典型场景中仍仅处于同等水平。同样,这可能会使基于卷积的效果的使用更加难以实现。

3
在对称下唯一生成nxnxn立方晶格中所有m个点的集合的算法
我正在实现一个算法,该算法将在计算上非常复杂,并且想要尝试确保我没有做不必要的工作。 有一个nxnxn立方晶格,例如,如果n = 2,则由(0,0,0),(0,1,0),(1,0,0),(1,1,0),(0, 1,1),(0,0,1),(1,0,1),(1,1,1)。 从这个格子中,我将递归地生成所有m点的集合,例如: solve(set_of_points) { if set_of_points.size = m, finish do some useful computation here for each point in lattice not in set_of_points: solve(set_of_points + new_point); } 然后可以从一个空的set_of_points开始调用。 问题的本质是,我实际上不需要m个点的所有排列,而只需要在立方体自然对称下唯一的那些点。 例如,拿一个2x2x2的多维数据集,并假设我们希望所有1点的集合。在以上基本算法下,有8个不同的1点集。 但是,使用立方体的对称性,我们可以将其减少到1个唯一的1点集,因为在立方体的对称性下所有原始的8个点都是等效的(在这种情况下,它们都是“角”)。 如果立方体是2x2x2且m = 2,则基本算法中有28个集合,但是在对称情况下,该集合减少为3个(例如{(0,0,0),(1,0,0)},{(0 ,0,0),(1,1,0)},{(0,0,0),(1,1,1)}) 显然,对3个点集进行计算要比28个点好得多,所以我的问题是如何不生成与已经生成的点对称对称的点集?或者,如果这不可能,那么我如何至少减少套数。 (请注意-如果m = 1,这相对容易-只需选择比其他任何一个顶点更接近(0,0,0)的点,并且边界处会有一点毛刺。这是因为m> 1成为一个真正的问题)

2
是什么造成快速分类的坏情况?
我正在学习quicksort,并想说明quicksort很难解决的各种数组。我想到的快速排序没有初始随机改组,没有2分区,并且不计算中位数。 到目前为止,我想到了三个示例: [1,2,3,4,5,6,7,8,9,10] - when the array is sorted [10,9,8,7,6,5,4,3,2,1] - when the array is reversed [1,1,1,1,1,1,1,1,1,1] - when the array is the same values [1,1,1,2,2,2,3,3,3,3] - when there are few and unique keys 例如,我对此不太确定: [1,3,5,7,9,10,8,6,4,2] 那么,为什么快速排序的阵列与(几乎)理想的阵列相比有什么困难呢?

5
打印2 ^ i * 5 ^ j中的下一个最小值,其中i,j> = 0
最近在一次技术电话筛选中有人问我这个问题,但做得不好。问题包括在下面的逐字记录中。 生成{2^i * 5^j | i,j >= 0}排序的集合。连续打印下一个最小值。 例: { 1, 2, 4, 5, 8, 10...} “下一个最小的”使我认为涉及到最小的堆,但是我真的不知道从那里去哪里,面试官也没有提供任何帮助。 有人对如何解决此类问题有建议吗?
10 algorithms 

2
倒计时数字回合问题的名称-算法解决方案?
对于非英国观众,在白天的游戏节目中有一部分,参赛者有一组6个数字和一个随机生成的目标数字。他们必须仅使用算术运算符使用6个数字中的任何一个(但不一定是全部)达到目标数字。所有计算必须得出正整数。 例如:Youtube:倒计时-有史以来最非凡的数字游戏? 有关详细说明,请参见Wikipedia:Countdown(游戏节目) 例如: 竞争者选择6个数字-两个大数字(可能包括25、50、75、100)和四个小数字(数字1 ..10,每个数字在池中包含两次)。 挑号码75,50,2,3,8,7则列出的目标数量812。 一次尝试是(75 + 50-8)* 7-(3 * 2)= 813(这在目标5内的解决方案中得到7分) 准确的答案是(50 + 8)* 7 * 2 = 812(这将获得与目标完全匹配的10分)。 显然,这个问题在电视问世之前就已经存在,但是Wikipedia文章并没有给它起一个名字。我还曾在我上过的一所小学里看过这款游戏,当时该游戏被称为“加密”游戏,属于班际竞赛-但是现在搜索它并没有发现任何问题。 我参加了几次,我的父亲写了一个Excel电子表格企图蛮力的问题,我不记得它是如何工作(只是它没有工作,有什么用Excel的65535行限制),但当然,必须有一个针对该问题的算法解决方案。也许有一种解决方案可以像人类认知一样工作(例如,并行查找“足够接近”的数字,然后选择候选人并执行“较小”的操作)。

1
匹配两个字符串,但允许一定程度的错误
如何匹配两个字符串,但同时允许X个字符在匹配中不正确。错误数量应该是一个可控制的变量。 虽然字符串中X个字符的数量不匹配,但是应该限制序列中有多少个字符。给定两个字符串,我可能允许5个字符不同,但不能连续超过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.