Questions tagged «algorithm»

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


30
C ++:四舍五入到数字的最接近倍数
好的-我几乎不好意思在这里发布此内容(如果有人投票关闭,我会删除),因为这似乎是一个基本问题。 这是在C ++中舍入到整数倍的正确方法吗? 我知道还有与此相关的其他问题,但是我特别想知道在C ++中执行此操作的最佳方法是什么: int roundUp(int numToRound, int multiple) { if(multiple == 0) { return numToRound; } int roundDown = ( (int) (numToRound) / multiple) * multiple; int roundUp = roundDown + multiple; int roundCalc = roundUp; return (roundCalc); } 更新:抱歉,我可能没有明确意图。这里有些例子: roundUp(7, 100) //return 100 roundUp(117, 100) //return 200 …
168 c++  algorithm  rounding 

18
什么是最快的子串搜索算法?
好的,所以我听起来不像个白痴,我将更明确地说明问题/要求: 针(模式)和干草堆(要搜索的文本)都是C样式的以null终止的字符串。没有提供长度信息;如果需要,必须对其进行计算。 函数应该返回指向第一个匹配项的指针,或者NULL如果找不到匹配项。 失败案例是不允许的。这意味着具有非恒定(或大常数)存储要求的任何算法都将需要具有备用失败分配的备用情况(备用备用的性能因此会导致最差情况的性能)。 尽管也可以很好地描述不带代码的算法(或指向该算法的链接),但是实现应使用C语言。 ...以及“最快”的意思: 确定性O(n)其中n=干草堆长度。(但是,O(nm)如果将它们与更鲁棒的算法结合使用以给出确定性的O(n)结果,则可以使用通常是正常的算法(例如滚动哈希)中的思想)。 永远不要表现出if (!needle[1])比朴素的蛮力算法更糟的性能(可测量;几个时钟等等都可以),特别是在很短的针上,这可能是最常见的情况。(无条件的大量预处理开销是不好的,因为试图以可能的针头为代价来提高病理性针头的线性系数)。 与任意其他广泛使用的算法相比,给定任意的针头和干草堆,其性能可比或更高(搜索时间长于50%以上)。 除了这些条件,我将保留“最快”开放式的定义。一个好的答案应该可以解释为什么您考虑您建议的“最快”方法。 我的当前实现比glibc的双向实现大约慢10%至快8倍(取决于输入)。 更新:我当前的最佳算法如下: 对于长度为1的针,请使用strchr。 对于长度为2-4的针,请使用机器字一次比较2-4个字节,如下所示:将针以16位或32位整数进行预加载并进行位移位,并在每次迭代时从干草堆中循环出旧字节/新字节。干草堆的每个字节仅被读取一次,并检查0(字符串末尾)和一个16位或32位比较。 对于长度> 4的针,请使用双向算法以及一个错误的移位表(例如Boyer-Moore),该表仅应用于窗口的最后一个字节。为了避免初始化1kb表的开销(这对于许多中等长度的针头来说都是净损失),我保留了一个位数组(32字节)来标记移位表中的哪些条目已初始化。未设置的位对应于从未出现在机针中的字节值,因此可能会发生全针长移位。 我想到的主要问题是: 有没有一种方法可以更好地利用不良转移表?Boyer-Moore通过向后扫描(从右到左)来最好地利用它,但是双向方法需要从左到右扫描。 对于一般情况(没有内存不足或二次性能条件),我发现的仅有的两种可行的候选算法是有序字母表上的双向匹配和字符串匹配。但是是否存在容易检测到的情况,其中不同的算法将是最佳选择?当然,空间算法中的许多O(m)(m针长在哪里)都可以使用m<100。如果对可证明只需要线性时间的针进行简单的测试,也可以使用最坏情况的二次方算法。 奖励积分: 您可以假设针和干草堆都是格式正确的UTF-8来提高性能吗?(具有变化的字节长度的字符,良好的格式会在针和干草堆之间提出一些字符串对齐要求,并在遇到不匹配的头字节时允许自动2-4字节移位。但是这些约束是否可以为您带来很多/其他好处?最大的后缀计算,良好的后缀移位等已经为您提供了各种算法?) 注意:我很清楚那里的大多数算法,只是他们在实践中表现不佳。这是一个很好的参考,所以人们不会一直给我关于算法的参考作为评论/答案:http : //www-igm.univ-mlv.fr/~lecroq/string/index.html
165 c  algorithm  string  substring 

5
差异算法?[关闭]
从目前的情况来看,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 我一直在疯狂地解释有效且高效的diff算法。 我得到的最接近的链接是RFC 3284(来自Eric Sink的几篇博客文章),该链接以完全易于理解的术语描述了差异结果存储的数据格式。但是,它没有提及程序在进行比较时如何达到这些结果。 我试图出于个人好奇心进行研究,因为我敢肯定在实施diff算法时必须权衡取舍,当您查看diff并想知道“为什么diff程序为什么选择此作为更改时,这很清楚而不是那个?” ... 在哪里可以找到最终输出VCDIFF的有效算法的描述? 顺便说一句,如果您偶然发现SourceGear的DiffMerge使用的实际算法的描述,那就更好了。 注意:最长的公共子序列似乎不是VCDIFF所使用的算法,在给定使用的数据格式的情况下,它们似乎在做些更聪明的事情。
164 algorithm  diff  vcdiff 

21
迪士尼的FastPass是否有效和/或有用的排队论
在迪士尼世界,他们使用称为Fastpass的系统为热门游乐设施创建第二条较短的路线。这个想法是,您可以在标准行中等待,通常需要等待一个小时以上,或者您可以获取FastPass,它允许您在指定的时间段(通常是几个小时后)返回,仅等待10分钟以内。使用FastPass一次只能“等待”一次乘车。 我一直在试图弄清这个概念背后的排队理论,但是我发现的唯一解释是,它旨在使人们脱颖而出并做一些可以带来额外收入(购物,饮食等)的事情。 这是为什么要实施FastPass,还是要解决一个真正的访客效率问题?是否有应用了类似逻辑的软件应用程序?是否有应采用类似逻辑的软件应用程序? 我看到在软件中实现类似功能的部分问题是它基于用户选择队列。为了使软件中的等待周期更快,我认为,如果要很好地应用此理论,就需要应用程序足够聪明,才能根据需要将人们放置在哪些队列中,而无需最终用户选择。

12
使用Random和OrderBy是一种很好的随机播放算法吗?
我在Coding Horror上阅读了一篇有关各种随机播放算法的文章。我已经看到有人在这样做的地方随机排列列表: var r = new Random(); var shuffled = ordered.OrderBy(x => r.Next()); 这是一个很好的随机播放算法吗?究竟如何运作?这是可以接受的方式吗?
164 c#  algorithm  shuffle 

14
高维数据中的最近邻居?
几天前,我已经问了一个问题,该问题是如何找到给定向量的最近邻居。我的向量现在是21维,在继续下一步之前,因为我既不是机器学习也不是数学领域的专家,所以我开始问自己一些基本问题: 欧几里得距离是一个很好的度量标准,可以用来首先找到最近的邻居?如果没有,我有什么选择? 另外,如何确定用于确定k个邻居的正确阈值?是否可以进行一些分析以找出该值? 以前,有人建议我使用kd-Trees,但Wikipedia页面上明确指出,对于高维,kd-Tree几乎等同于蛮力搜索。在那种情况下,有效地找到一百万个点数据集中的最近邻居的最佳方法是什么? 有人可以澄清上面的一些(或全部)问题吗?

2
161803398是“特殊”号码吗?在Math.Random()内部
我怀疑答案是“ 因为数学 ”,但是我希望有人可以在基本层面上提供更多的见解... 今天,我在研究BCL源代码,看看我以前使用的某些类是如何实现的。之前我从未考虑过如何生成(伪)随机数,所以我决定看看它是如何完成的。 此处的完整源代码:http : //referencesource.microsoft.com/#mscorlib/system/random.cs#29 private const int MSEED = 161803398; 每次植入Random()类时都使用此MSEED值。 无论如何,我看到了这个“魔术数字”-161803398-我对为什么选择该数字没有最模糊的主意。它不是素数或2的幂,不是看似重要的数字的“一半”。我用二进制和十六进制格式查看了它,对我来说,它就像是一个数字。 我尝试在Google中搜索该号码,但未找到任何内容。
162 c#  .net  algorithm  random 

9
有没有一种方法可以衡量列表的排序方式?
有没有一种方法可以衡量列表的排序方式? 我的意思是,这不是要知道列表是否已排序(布尔值),而是诸如“排序”之比,诸如统计中的相关系数之类的东西。 例如, 如果列表中的项目按升序排列,则其比率为1.0 如果列表降序排列,则其速率将为-1.0 如果list几乎升序排列,则其比率将是0.9或接近1的某个值。 如果列表根本不排序(随机),则其速率将接近0 我正在Scala中编写一个小型图书馆进行练习。我认为排序速率会很有用,但我找不到有关此类信息的任何信息。也许我不知道这个概念的适当术语。




30
如何将两个排序数组合并为一个排序数组?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 2年前关闭。 改善这个问题 这是在采访中问我的,这是我提供的解决方案: public static int[] merge(int[] a, int[] b) { int[] answer = new int[a.length + b.length]; int i = 0, j = 0, k = 0; while (i < a.length && j < b.length) { if (a[i] < b[j]) { answer[k] = a[i]; i++; } else …

12
扁平化/非扁平化嵌套JSON对象的最快方法
我将一些代码放在一起,以拼合和取消拼合复杂/嵌套的JSON对象。它可以工作,但是有点慢(触发“长脚本”警告)。 对于扁平化的名称,我想要“。” 作为数组的定界符和[INDEX]。 例子: un-flattened | flattened --------------------------- {foo:{bar:false}} => {"foo.bar":false} {a:[{b:["c","d"]}]} => {"a[0].b[0]":"c","a[0].b[1]":"d"} [1,[2,[3,4],5],6] => {"[0]":1,"[1].[0]":2,"[1].[1].[0]":3,"[1].[1].[1]":4,"[1].[2]":5,"[2]":6} 我创建了一个基准来模拟我的用例http://jsfiddle.net/WSzec/ 获取一个嵌套的JSON对象 展平 浏览并可能在展平时对其进行修改 将其展开为原始的嵌套格式以将其运走 我想要更快的代码:为澄清起见,在IE 9 +,FF 24+和Chrome 29中,完成JSFiddle基准测试(http://jsfiddle.net/WSzec/)的代码明显更快(〜20 %+会更好)。 +。 以下是相关的JavaScript代码:当前最快:http : //jsfiddle.net/WSzec/6/ JSON.unflatten = function(data) { "use strict"; if (Object(data) !== data || Array.isArray(data)) return data; var result = {}, …

28
列出字符串/整数的所有排列
对采访进行编程的一个常见任务(尽管不是我的采访经验)是获取一个字符串或整数并列出所有可能的排列。 是否有一个示例,说明了如何完成此操作以及解决此问题的逻辑? 我已经看到了一些代码片段,但是它们没有得到很好的注释/解释,因此很难遵循。

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.