Questions tagged «algorithm»

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

5
LINQ方法的运行时复杂度(Big-O)有什么保证?
我最近已经开始使用LINQ了很多,而且我还没有真正看到任何有关LINQ方法的运行时复杂性的信息。显然,这里有许多因素在起作用,因此让我们将讨论范围限制在普通的IEnumerableLINQ-to-Objects提供程序上。此外,让我们假设任何Func以选择器/增幅器/等形式传入的都是廉价的O(1)操作。 它似乎很明显,所有的单次操作(Select,Where,Count,Take/Skip,Any/All,等)将是O(n)的,因为他们只需要步行的顺序一次; 尽管即使这样也会受到懒惰的影响。 对于更复杂的操作,事情变得更加模糊。集合类运算符(Union,Distinct,Except等)使用工作GetHashCode在默认情况下(据我所知),所以它似乎是合理的假设他们使用一个哈希表内,使这些操作为O(n)为好,一般。那使用的版本IEqualityComparer呢? OrderBy需要排序,因此最有可能我们正在查看O(n log n)。如果已经排序怎么办?如果我说怎么样OrderBy().ThenBy()并为两者提供相同的密钥怎么办? 我可以使用排序或哈希查看GroupBy(和Join)。哪有 Contains在a上为O(n)List,但在a上为O(1)HashSet -LINQ是否检查基础容器以查看其是否可以加快速度? 真正的问题-到目前为止,我一直坚信作业是高效的。但是,我可以依靠吗?例如,STL容器清楚地指定了每个操作的复杂性。.NET库规范中是否对LINQ性能有任何类似的保证? 更多问题(针对评论):并 没有真正考虑开销,但是我没想到简单的Linq-to-Objects会有很多。CodingHorror帖子谈论的是Linq-to-SQL,在这里我可以理解解析查询并使SQL增加成本-对象提供程序是否也有类似成本?如果是这样,使用声明性或函数语法有什么不同?

16
如何在多列上对数组排序?
我有一个多维数组。主数组是一个数组 [publicationID][publication_name][ownderID][owner_name] 我想做的是先对数组进行排序owner_name,然后再对进行排序publication_name。我知道在JavaScript中有Array.sort(),您可以在其中放入自定义函数,以我为例: function mysortfunction(a, b) { var x = a[3].toLowerCase(); var y = b[3].toLowerCase(); return ((x < y) ? -1 : ((x > y) ? 1 : 0)); } 这是刚刚排序的一列,即OWNER_NAME很好,但我怎样修改它进行排序owner_name,然后publication_name?

30
生成列表的所有可能排列的算法?
说我有n个元素的列表,我知道有n个!订购这些元素的可能方法。生成此列表所有可能排序的算法是什么?例如,我有列表[a,b,c]。该算法将返回[[a,b,c],[a,c,b,],[b,a,c],[b,c,a],[c,a,b],[c,b , 一个]]。 我在这里阅读 http://en.wikipedia.org/wiki/Permutation#Algorithms_to_generate_permutations 但是维基百科从来都不擅长于解释。我不太了解。

27
查找C中整数的最高设置位(msb)的最快/最有效方法是什么?
如果我有一些整数n,并且我想知道最高有效位的位置(也就是说,如果最低有效位在右边,那么我想知道最远的左位为1),找出最快/最有效的方法是什么? 我知道POSIX ffs()在strings.h中支持一种方法来查找第一个设置位,但是似乎没有相应的fls()方法。 是否有一些我确实不知道的真正明显的方法? 如果无法使用POSIX函数进行可移植性该怎么办? 编辑:在32位和64位体系结构上均可使用的解决方案怎么样(许多代码清单似乎只在32位int上运行)。


6
使用纬度/经度和公里距离的简单计算?
我可以做一个简单的计算,将km转换为一个值,将该值添加到lat或lon float中,以计算搜索的边界框吗?它不需要完全准确。 例如:如果给了我英国伦敦的经纬度(51.5001524,-0.1262362),我想计算从那一点开始东/西25公里的经纬度,以及那个北/南25公里的经度。点,我需要怎么做才能将25公里转换为十进制以添加到上述值? 我正在寻找一般的经验法则,即:1km == +/- 0.XXX 编辑: 我对“ lat lon”的原始搜索未返回以下结果: 如何计算给定经纬度位置的边界框? 接受的答案似乎足以满足我的要求。

30
设计一个堆栈,使getMinimum()应该为O(1)
这是面试问题之一。您需要设计一个包含整数值的堆栈,以便getMinimum()函数应返回堆栈中的最小元素。 例如:考虑以下示例 情况1 5->顶部 1个 4 6 2 调用getMinimum()时,它应返回1,这是最小元素 在堆栈中。 情况#2 stack.pop() stack.pop() 注意:5和1都从堆栈中弹出。所以之后,堆栈 好像, 4->顶部 6 2 调用getMinimum()时应返回2,这是 堆栈。 食用者: getMinimum应该返回O(1)中的最小值 在设计时还必须考虑空间约束,如果使用额外的空间,则它应该是恒定的空间。

6
最佳的犹太趾甲切割算法是什么?
我正在为会自动修剪脚趾甲的机器开发软件,以便用户可以简单地将脚放进去并运行它,而不必通过咬伤或使用指甲钳手动进行操作。 我们潜在用户群中有很大一部分可能是犹太人,而且很明显,有一种传统是不按顺序修剪脚趾甲(或指甲) 对于这种传统的确切应用,似乎存在不同意见,但是我们认为以下规则足以容纳宗教信仰禁止按趾甲切割的人: 不应连续切割两个相邻的脚趾甲 左脚的切割顺序应与右脚的切割顺序不匹配 连续两次切割的切割顺序不应相同。序列不应该容易预测,因此对交替序列进行硬编码是行不通的。 这就是我们决定给脚趾编号的方式: 5 4 3 2 1 1 2 3 4 5 Left foot Right foot 我已经编写了代码来解决该问题,但是所使用的算法不是最优的:实际上,最坏的情况是O(∞)。它的工作方式可与bogosort媲美。这是使用的实际代码的伪代码简化: function GenerateRandomSequence sequence = Array[5] foreach (item in sequence) item = RandomNumberBetween(1,5) return sequence function GetToenailCuttingOrder while (true) sequence = GenerateRandomSequence() if (!AllItemsAreUnique(sequence)) continue if (NoTwoAdjacentItemsHaveConsecutiveNumbers(sequence)) return sequence …

9
缓存无效-是否有通用解决方案?
“计算机科学中只有两个难题:缓存失效和命名。” 菲尔·卡尔顿 是否有使缓存无效的一般解决方案或方法;知道什么时候条目是陈旧的,所以可以保证您总是能获得最新数据? 例如,考虑一个getData()从文件获取数据的函数。它根据文件的上次修改时间对其进行缓存,并在每次调用时对其进行检查。 然后添加第二个函数transformData(),该函数转换数据,并缓存其结果,以备下次调用该函数时使用。它不知道文件-如何添加依赖项,如果文件被更改,此缓存将变为无效? 您可以在getData()每次调用时transformData()进行调用,并将其与用于构建缓存的值进行比较,但这最终可能会非常昂贵。

15
从技术上讲,这是“ Hello World”的O(1)算法吗?
将其归类为“ Hello,World!”的O(1)算法吗??? public class Hello1 { public static void Main() { DateTime TwentyYearsLater = new DateTime(2035,01,01); while ( DateTime.Now < TwentyYearsLater ) { System.Console.WriteLine("It's still not time to print the hello ..."); } System.Console.WriteLine("Hello, World!"); } } 我正在考虑使用 DateTime TwentyYearsLater = new DateTime(2035,01,01); while ( DateTime.Now < TwentyYearsLater ) { …
117 c#  .net  algorithm  big-o 

16
图算法查找两个任意顶点之间的所有连接
我正在尝试确定最佳的时间效率算法来完成下面描述的任务。 我有一套记录。对于这组记录,我具有连接数据,该数据指示该组记录中的记录对如何相互连接。这基本上表示一个无向图,其中记录是顶点,而连接数据是边。 集合中的所有记录都具有连接信息(即不存在孤立记录;集合中的每个记录都连接到集合中的一个或多个其他记录)。 我想从集合中选择任意两个记录,并能够显示所选记录之间的所有简单路径。“简单路径”是指在路径中没有重复记录的路径(即仅有限路径)。 注意:所选的两个记录将始终是不同的(即开始和结束顶点永远不会相同;没有周期)。 例如: 如果我有以下记录: A,B,C,D,E 并且以下表示连接: (A,B),(A,C),(B,A),(B,D),(B,E),(B,F),(C,A),(C,E), (C,F),(D,B),(E,C),(E,F),(F,B),(F,C),(F,E) [其中(A,B)表示记录A连接到记录B] 如果我选择B作为我的开始记录,选择E作为我的结束记录,则我想找到所有通过记录连接将记录B连接到记录E的简单路径。 将B连接到E的所有路径: B→E B-> F-> E B-> F-> C-> E B-> A-> C-> E B-> A-> C-> F-> E 这是一个例子,实际上我可能有包含数十万条记录的集合。

16
查找前10个搜索词的算法
我目前正在准备面试,它使我想起了一个在上次面试中曾经被问到的问题: “已经要求您设计一些软件来连续显示Google上排名前10位的搜索词。您可以访问Feed,该Feed提供了当前在Google上搜索的无穷实时搜索词源。请描述哪种算法和数据结构您将用来实现此目的。您将设计两个变体: (i)显示所有时间(即自您开始阅读提要以来)的前10个搜索词。 (ii)仅显示过去一个月的前10个搜索字词,每小时更新一次。 您可以使用一个近似值来获得前十名的列表,但您必须证明自己的选择是正确的。” 我在这次采访中大吃一惊,但实际上仍然不知道如何实现这一点。 第一部分要求在无限列表的不断增长的子序列中提供10个最频繁的项。我研究了选择算法,但找不到任何在线版本来解决此问题。 第二部分使用有限列表,但是由于要处理大量数据,您无法真正将整个月的搜索字词存储在内存中,也无法每小时计算一次直方图。 前十名列表不断更新的事实使问题变得更加棘手,因此您需要以某种方式在滑动窗口上计算前十名。 有任何想法吗?

1
在哪里可以找到“算法设计手册”的解决方案?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使其成为Stack Overflow 的主题。 7年前关闭。 改善这个问题 这本书充满了有趣的问题,但是由于我是自己学习的,因此,如果我能够找到至少一些问题的解决方案,将对您有很大的帮助。 有人知道吗?
115 algorithm 


12
将子手难度级别的单词分类为“轻松”,“中等”或“难”的算法
确定子手游戏单词的“难易程度”的好算法是什么,以便游戏可以选择匹配指定难度级别的单词? 难度似乎与所需的猜测次数,字母使用的相对频率(例如,具有很多不常见字母的单词可能更难猜测)以及单词的长度有关。 还有一些主观因素需要(尝试)进行补偿,例如单词出现在玩家词汇中的可能性,并且可以被识别,从而允许从仅基于字母频率的猜测策略转向基于列表的猜测。已知的匹配词。 我现在的尝试是在红宝石下面。关于如何改进分类的任何建议? def classify_word(w) n = w.chars.to_a.uniq.length # Num. unique chars in w if n < 5 and w.length > 4 return WordDifficulty::Easy end if n > w.length / 2 return WordDifficulty::Hard else return WordDifficulty::Medium end end 我正在写一个我想让孩子们玩的子手游戏;我已经太老了,不能尝试“作业”,这可能就是为什么这个问题获得如此之多的反对意见的原因。确定这个词。
114 algorithm 

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.