Questions tagged «algorithms»

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

4
生成树中所有节点的所有后代的最有效方法
我正在寻找获取树的最有效算法(存储为边列表;或存储为从父节点到子节点列表的映射列表);并为每个节点生成从其派生的所有节点的列表(叶级和非叶级)。 由于规模的原因,实现必须通过循环而不是撤回。理想情况下应为O(N)。 该SO问题涵盖了一个合理合理的标准解决方案,用于为树中的一个节点找到答案。但是很明显,在每个树节点上重复该算法都是非常低效的(在我的脑海中,O(NlogN)至O(N ^ 2))。 树的根是已知的。该树具有绝对任意的形状(例如,不是N元,没有以任何方式平衡,形状或形式,深度也不统一)-有些节点有1-2个子节点,有些节点有30K个子节点。 在实际水平上(尽管它不应该影响算法),该树具有约100K-200K节点。

3
需要帮助来确定联赛排程算法
我正在尝试创建体育联赛调度程序。我无法确定一种算法来帮助我有效地填写每个位置。 建立时间表的样本数据为: 10支 每个团队互相比赛1次(总共需要45场比赛) 每队每天最多玩1次 在我的测试中,我使用9天,每天5个广告位。 组合表(包含45个连击) ID Team1ID Team2ID位已 分配 时间表表(包含45个时隙) scheduleID homeTeamID awayTeamID GameDate GameTime 现在,我现有的过程将填补约90%的插槽,而剩下10%的插槽将留空,以免基于上述规则发生调度冲突。 我以递增的日期/时间顺序遍历我的计划表。 我的第一个时段可能是星期六上午8点。 我查询尚未安排的球队名单。然后,我对这些团队进行了一系列可能的组合。然后,我使用该数组从我的组合表中从尚未安排的组合中提取1条随机记录,然后将这些团队放在计划中。然后,我将该组合设置为使用状态。 我一遍又一遍地重复循环,每次我的可用团队列表变小,结果数组也变小。 我发现有些日子过得很好,而在另一些日子里,我最后剩下的最后两支球队已经在前一周打过球,因此不再被添加到日程表中。 我还没有尝试过的唯一方法就是“重置”冲突天数,然后再试一次以查看我是否能获得更好的排名。 有没有人有什么建议?

3
制作图像镶嵌的算法-有比这更快的方法吗?
我一直在玩制作图像马赛克。我的脚本拍摄了大量图像,将它们缩小为缩略图大小,然后将它们用作平铺以逼近目标图像。 该方法实际上非常令人愉快: 我计算每个图块位置中每个拇指的均方误差。 起初,我只是使用贪婪的放置方式:将误差最小的拇指放在最适合的图块上,然后放置下一个,依此类推。 贪婪的问题在于,无论它们是否紧密匹配,最终都会让您最终将最不相同的指尖放在最不受欢迎的图块上。我在这里显示示例:http : //williamedwardscoder.tumblr.com/post/84505278488/making-image-mosaics 因此,我然后进行随机交换,直到脚本被中断。结果还可以。 随机交换两个图块并不总是一种改进,但是有时三个或更多图块的旋转会导致整体改进,即A <-> B可能不会改进,但A -> B -> C -> A1可能会。 因此,在选择了两个随机图块并发现它们没有改善之后,我选择了一堆图块来评估它们是否可以成为这种旋转中的第三个图块。我不探讨是否可以使四个图块中的任何一组进行有利可图的旋转,等等。很快就会变得非常昂贵。 但这需要时间。。很多时间! 有没有更好,更快的方法? 赏金更新 我测试了匈牙利方法的各种Python实现和绑定。 到目前为止最快的是纯Python https://github.com/xtof-durr/makeSimple/blob/master/Munkres/kuhnMunkres.py 我的直觉是,这近似于最佳答案。当在测试映像上运行时,所有其他库都对结果达成了共识,但是这个kuhnMunkres.py虽然快了几个数量级,但是却非常非常接近其他实现所同意的分数。 速度与数据密切相关;蒙娜丽莎(Mona Lisa)在13分钟内冲过kuhnMunkres.py,但猩红胸鹦鹉(Scarlet Chested Parakeet)花了16分钟。 结果与长尾小鹦鹉的随机互换和轮换非常相似: (左侧为kuhnMunkres.py,右侧为随机交换;用于比较的原始图像) 但是,对于我测试过的《蒙娜丽莎》图像,结果得到了明显改善,实际上,她定义的“微笑”闪闪发光: (左侧为kuhnMunkres.py,右侧为随机交换)

4
为什么大数据需要发挥作用?
我开始从事与大数据相关的新项目的实习。我的经理们建议开始学习函数式编程(他们强烈推荐Scala)。我使用F#的经验很卑鄙,但是我看不到使用这种编程范例的重要性,因为在某些情况下它很昂贵。 迪恩(Dean)在这个话题上做了有趣的演讲,并在这里分享了他对“大数据”为何的想法:http : //www.youtube.com/watch?v=DFAdLCqDbLQ 但这并不十分方便,因为大数据并不意味着只有Hadoop。 由于BigData是非常模糊的概念。我暂时忘记了。我尝试提出一个简单的示例,以便在处理数据时比较不同方面,以查看功能方式是昂贵的还是没有。如果小数据的功能编程昂贵且占用大量内存,那么为什么大数据需要它? 我远没有花哨的工具,而是尝试使用三种方法针对一个特定且普遍存在的问题构建解决方案:命令式和功能性方法(递归,使用集合)。我比较了时间和复杂性,以比较这三种方法。 我使用Scala编写这些函数,因为它是使用三种范式编写算法的最佳工具 def main(args: Array[String]) { val start = System.currentTimeMillis() // Fibonacci_P val s = Fibonacci_P(400000000) val end = System.currentTimeMillis() println("Functional way: \n the Fibonacci sequence whose values do not exceed four million : %d \n Time : %d ".format(s, end - start)) val …

1
“不良苹果”算法或进程使共享沙箱崩溃
我正在寻找一种算法来处理以下问题,我暂时将其称为“坏苹果”算法。 问题 我有N个进程在M个沙箱中运行,其中N >>M。 为每个进程提供自己的沙箱是不切实际的。 这些进程中至少有一个进程表现不佳,并导致整个沙箱崩溃,从而杀死了同一沙箱中的所有其他进程。 如果这是一个行为不佳的进程,那么我可以使用简单的二等分将一半的进程放在一个沙箱中,再将一半的进程放在另一个沙箱中,直到发现错误为止。 问题 如果一个以上进程的行为不佳-包括它们都表现不佳的可能性-这种朴素的算法是否有效?是否可以保证在某些合理范围内工作? 简化版 为了争辩,让我们假设一个不好的过程会立即降低其沙箱,而一个好的过程则永远不会。

3
为什么将Quicksort称为“ Quicksort”?
这个问题的重点在于,与其他任何排序算法相比,它的优点不容置疑-当然还有许多其他问题。这个问题是关于名字的。为什么将Quicksort称为“ Quicksort”?当然,大多数情况下都是“快速”,但并非总是如此。简并为O(N ^ 2)的可能性是众所周知的。对Quicksort进行了各种修改以缓解此问题,但那些将最坏情况降低到保证的O(n log n)的修改通常不再称为Quicksort。(例如Introsort)。 我只是想知道为什么在所有众所周知的排序算法中,这是唯一应得的“快速”名称,它不描述算法的工作原理,而是描述算法的速度(通常)。之所以称为Mergesort,是因为它合并了数据。之所以称为Heapsort,是因为它使用堆。Introsort的名称来自“ Introspective”,因为它会监视自己的性能来决定何时从Quicksort切换到Heapsort。同样,对于所有较慢的变量-Bubblesort,Insertion排序,Selection排序等,它们均以其工作方式命名。我能想到的唯一一个例外是“ Bogosort”,它实际上只是一个笑话,没人在实践中实际使用过。为什么Quicksort不能称为更具描述性的名称,例如“分区排序”或“数据透视排序”,哪个描述了它的实际作用?甚至都不是“先到这里”的情况。Mergesort的开发比Quicksort早了15年。(根据维基百科分别为1945年和1960年) 我想这确实是一个历史问题,而不是编程问题。我很好奇它的名字-只是好的营销?

6
从未排序数组的范围中检索最大值
我有一个未排序的数组。我在查询中给出一个范围,然后必须返回该范围的最大值。例如: array[]={23,17,9,45,78,2,4,6,90,1}; query(both inclusive): 2 6 answer: 78 我构造了哪种算法或数据结构来快速检索任何范围内的最大值。(有很多查询) 编辑: 这确实是实际问题的简单版本。我可以将数组的大小设置为最大100000,查询数量最多为100000。因此,我绝对需要进行一些预处理,以利于快速查询响应。


1
可以改善Damerau-Levenshtein吗?
我最近从Wikipedia上的伪代码实现了Damerau-Levenshtein距离算法。我找不到它是如何工作的任何解释和伪采用完全无信息变量的名称,如DA,DB,i1,和j1我留下抓我的头。 这是我在Python中的实现:https : //gist.github.com/badocelot/5327337 Python的实现帮助我遍历了程序并弄清了正在发生的事情,将变量重命名为更有用的名称。我很熟悉Wagner-Fischer的方法来计算Levenshtein距离,因此有了参考系。 冒着过长的风险,这就是我对Damerau-Levenshtein的理解: 神秘变量: DA(last_row在我的代码中)是一种地图,其中包含每个元素被查看到的最后一行;在我的代码中,这是一个实际的Python字典 DB(last_match_col)保留最后一列,其中输入的字母b与a当前行的输入字母匹配 i1(last_matching_row)是来自DA当前字母的行号b j1只是DB/ 值last_match_col可能被更新之前的副本;在我的代码中,我只是移动了last_match_col更新并消除了此变量的位置 换位成本: H[i1][j1] + (i-i1-1) + 1 + (j-j1-1) 正在计算将当前字符换成已知b的最后一个字符(最后一个匹配项)所花费的费用,将之间的所有字符都视为增加或删除。ba 成本要素: H[i1][j1] 将基本成本还原到转置之前的计算点,因为找到转置会使先前的工作无效 (i-i1-1) 是当前行与匹配当前字符的最后一行之间的距离,这是需要删除的数量 (j-j1-1) 是当前列与具有匹配项的最后一列之间的距离,即相加次数 多余+ 1的只是换位本身的成本 如果此分析不正确,我很想知道我哪里做错了。就像我说的那样,我找不到关于该算法如何在线工作的任何详细说明。 改进版? 已经想通了这一点,虽然,它让我吃惊的是,通过计算成本都增加和调换字母之间的缺失似乎有缺陷的:一个加法和一个删除相当于替代,这,这是不检查。 如果一切正确,那么解决方案应该是微不足道的:转置字母之间的字母成本应为添加和删​​除中的较高者:将尽可能多的字母转换为替换,并添加所有剩余的添加或删除。 因此成本为: H[i1][j1] + max((i-i1-1), (j-j1-1)) + 1 这是该版本的代码:https : //gist.github.com/badocelot/5327427 从一些简单的测试来看,这似乎是正确的。例如,“ abcdef”->“ abcfad”的编辑距离为2(转置“ d”和“ f”,将“ e”更改为“ …

1
哈希函数分类
在互联网上,我遇到了这个问题: 根据找到键值的各种方法对散列函数进行分类。 像这样的答案 直接法 减法 模除法 数字提取方法 中方法 折叠方式 伪随机法 我觉得很奇怪。我想我对哈希非常了解,但这对我来说简直是胡言乱语,有人可以解释吗?

2
计算机视觉算法(这怎么可能?)
我最近偶然发现一家公司,该公司创建了一种看起来像计算机视觉技术的技术,该技术能够自动检测入店行窃并向其用户发出警报。 链接 观看该公司提供的一些视频和示例使我完全困惑,他们在现实中如何实现此功能。 我知道这里没有人能够确切地告诉我这是如何实现的,但是任何人都知道并且可以指出我在该领域的研究,或者可能提供有关如何实现或类似的细节。指导从哪里开始? 我的理解是,计算机视觉算法距离这种复杂的算法还差很多年。这种应用真的可行吗?任何人愿意冒险猜测他们是如何实现的?

4
分析内存使用情况:Java与C ++可以忽略不计?
用Java编写的整数对象的内存使用情况与用C ++编写的整数对象的内存使用情况如何比较\对比?差异可忽略不计吗?没有不同?有很大的不同吗?我猜是一样的,因为int是int而不管语言(?) 我之所以这样问,是因为我正在阅读了解何时知道程序的内存需求将阻止程序员解决给定问题的重要性。 让我着迷的是创建单个Java对象所需的内存量。以一个整数对象为例。如果我错了,请纠正我,但是Java整数对象需要24个字节的内存: 4个字节的int实例变量 16字节的开销(引用对象的类,垃圾收集信息和同步信息) 4字节的填充 再举一个例子,Java数组(作为对象实现)需要48个字节以上: 标头信息的24个字节 16个字节的对象开销 4个字节的长度 4个字节用于填充 加上存储值所需的内存 与使用C ++编写的相同代码相比,这些内存使用情况如何? 我过去对编写的C ++和Java程序的内存使用情况一无所知,但是现在,我开始学习算法,对计算机的资源有了更大的了解。

2
如何更好地解决动态编程问题
我最近遇到了一个问题:“您得到一个布尔表达式,由字符串'true','false','and','or'和'xor'组成。计算括号的方法数量这样,表达式的结果将为true。例如,可以通过两种方式将“ true and false xor true”括起来,使其结果为true。” 我知道这是一个动态编程问题,因此我尝试自己提出一个解决方案,如下所示。假设我们有一个表达式为ABC .... D,其中“。” 代表任何运算,或xor和大写字母代表true或false。可以说,此大小为K的表达式产生真值的方式为N。当向该表达式添加新的布尔值E时,有两种方法可以使该新表达式成为括号。(((ABC .... D) .E),即 加上ABC .... D的所有可能括号,我们在末尾加上E。2.(ABC(DE)),即 首先评估DE,然后找到此大小为K的表达式产生真值的方式。 假设T [K]是大小为K的表达式产生真值的方式数,则T [k] = val1 + val2 + val3其中val1,val2,val3的计算如下。 1)当E与D分组时 i)它不会改变D的值 ii)反转D的值 在第一种情况下,val1 = T [K] = N。(因为这简化为初始ABC ... D表达式)。在第二种情况下,重新计算dp [K],其中D的值取反,即val1。 2)当E与整个表达式分组时。 // val2包含'true'的数量E将产生的表达式在所有带括号的ABC实例中给出'true'... D i)如果为true.E = true则val2 = N ii)如果为true.E = false,则val2 …

3
是否有通用的方法来评估优化算法的最优性?
是否有一种通用的方法来评估优化算法的最优性,例如解决原本为NP困难或NP完全问题的算法? 到目前为止,我想到的唯一方法是将算法的结果与已知的最佳解决方案进行比较。 如果不是,是否有针对某些特殊问题的特定方法? 编辑要澄清:通过最优性,我的意思是结果与最优解的结果有多接近。

5
使用O(n)中的后缀数组的字符串的最小词典旋转
我将引用ACM 2003中的问题: 考虑一个长度为n(1 <= n <= 100000)的字符串。确定其最小词典编排旋转。例如,字符串“ alabala”的旋转为: 阿拉巴拉 拉巴拉 阿巴拉尔 巴拉拉 阿拉拉卜 拉拉巴 阿拉巴拉 其中最小的是“ aalabal”。 至于解决方案-我知道我需要构造一个后缀数组 -可以说我可以在O(n)中做到这一点。我的问题仍然是,如何找到O(n)的最小旋转度?(n =字符串的长度) 我对此问题非常感兴趣,但仍然不知如何解决。我对概念和如何解决问题更感兴趣,而不对具体实现更感兴趣。 注意:最小旋转的含义与英语词典中的顺序相同-“ dwor”在“ word”之前,因为d在w之前。 编辑:后缀数组构造需要O(N) 最后编辑:我想我找到了解决方案!!!如果我只是合并两个字符串怎么办?因此,如果字符串是“ alabala”,那么新字符串将是“ alabalaalabala”,现在我只需构造一个后缀数组(在O(2n)= O(n)中)并得到第一个后缀?我想这可能是对的。你怎么看?谢谢!

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.