Tag: algorithm

关于Python的内置sort()方法

Python中使用sort()方法构build的algorithm是什么? 是否有可能看看该方法的代码?

哈希表真的可以O(1)?

哈希表可以达到O(1)似乎是常识,但是这对我来说是没有意义的。 有人可以解释吗? 这里有两个想到的情况: A. 值是一个比散列表的大小小的int。 因此,这个值是它自己的哈希,所以没有哈希表。 但是,如果有的话,这将是O(1),仍然是低效的。 B. 你必须计算一个哈希值。 在这种情况下,查找数据大小的顺序是O(n)。 在O(n)工作之后,查找可能是O(1),但是在我眼中仍然是O(n)。 除非你有一个完美的散列表或一个大的散列表,否则每个存储桶可能有几个项目。 所以,无论如何它都会在某个点上进入一个小的线性search。 我认为散列表很棒,但是除非它是理论上的,否则我不会得到O(1)的称号。 维基百科关于散列表的文章始终引用常量查找时间,并完全忽略散列函数的成本。 这真的是一个公平的措施? 编辑:总结我学到的东西: 这在技术上是正确的,因为散列函数不需要使用密钥中的所有信息,因此可以是恒定的时间,并且因为足够大的表可以将冲突降低到接近恒定的时间。 在实践中是这样的,因为随着时间的推移,只要散列函数和表大小被select为使冲突最小化,即使这通常意味着不使用恒定时间散列函数,也可以实现。

如何计算从现在的Joda时间stream逝的时间?

我需要计算从一个特定date到现在的时间,并显示与StackOverflow问题相同的格式,即: 15s ago 2min ago 2hours ago 2days ago 25th Dec 08 你知道如何用Java Joda-Time库实现它吗? 那里是否有一个已经实现的辅助方法,或者我应该自己写algorithm?

在Python中查找数字的所有因素的最有效的方法是什么?

有人可以向我解释一个有效的方法来find在Python(2.7)中的一个数字的所有因素? 我可以创buildalgorithm来完成这项工作,但是我认为它编码不好,并且花费很长时间来执行大量的结果。

确定Tic Tac Toe游戏结束的algorithm

我用Java编写了一个井字棋的游戏,而我目前确定游戏结束的方法解释了游戏结束时的以下可能的场景: 董事会已经满员,还没有赢家宣布:比赛是平局。 克罗斯赢了。 圈子赢了。 不幸的是,为了做到这一点,它从表中读取了一组预定义的场景。 考虑到棋盘上只有9个空格,所以这不一定是不好的,因此桌子有点小,但是有更好的algorithm来判断游戏是否结束? 确定是否有人获胜是问题的核心,因为检查9个空间是否满是微不足道的。 表格方法可能是解决scheme,但如果没有,是什么? 另外,如果董事会不是大小n=9 ? 如果是一个更大的棋盘,比如说n=16 , n=25等等,那么连续放置棋子的数量是x=4 , x=5等等。 用于所有n = { 9, 16, 25, 36 … }通用algorithm?

algorithm给定数的除数

计算给定数字的除数的最佳algorithm(性能方面)是什么? 如果你能提供伪代码或者某个例子的链接,那将是非常好的。 编辑:所有的答案都非常有帮助,谢谢。 我正在实施Atkin的Sieve,然后我将使用与Jonathan Leffler所指出的类似的东西。 Justin Bozonier发布的链接提供了我想要的更多信息。

什么是最快的子stringsearchalgorithm?

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

澄清玩蛇的neural network

我是新来的neural network/机器学习/遗传algorithm,并为我的第一个实现,我正在写一个networking,学习玩蛇( 以前的例子,如果你以前没有玩过 )我有几个问题,我不完全不了解: 在我的问题之前,我只想确保我理解正确的一般想法。 有一群蛇,每个都有随机产生的DNA。 DNA是neural network中使用的权重。 每次蛇移动,它使用neural network决定去哪里(使用一个偏见)。 当人口死亡,select一些父母(也许最高适应度),并交叉他们的DNA与一个轻微的变异机会。 1)如果给予整个董事会作为一个input(大约400个点)足够的隐藏层(不知道有多less,也许是256-64-32-2?),并有足够的时间,是否会学会不把自己装进去? 2)什么是好的投入? 以下是我的一些想法: 400个input,板上的每个空间都有一个input。 如果蛇应该去那里(苹果)正面,如果是墙壁/你的身体,则是负面的。 越接近-1/1,它越接近。 6个input:游戏宽度,游戏高度,蛇x,蛇y,苹果x和苹果y(如果以这种方式训练,可以学习在不同尺寸的板上玩,但不知道如何input它的身体,因为它改变大小) 给它一个可以提醒墙壁,苹果或它的身体的蛇的视野(也许是头部前面的3×3平方)。 (蛇只能看到前面的东西不幸,这可能会阻碍它的学习能力) 3)给定input法,隐藏图层大小的起始位置是什么(当然,计划调整这个,只是不知道什么是一个好的起点) 4)最后是蛇的健身。 除了得到苹果的时间之外,它的长度,还有它的一生,是否应该考虑其他因素呢? 为了让蛇学会不要阻止自己,有什么我可以添加到健身帮助吗? 谢谢!

在2D点集中find洞?

我有一套2d points 。 它们是标准笛卡尔网格系统上的X,Y coordinates (在本例中是UTM zone )。 我需要find那个点的孔,最好有一些设置find这些孔的algorithm的灵敏度的能力。 通常这些点集非常密集,但有些可能不那么密集。 它们是什么,如果有帮助的话,就是农田里的土壤被取样为农业中的人们显然有用的各种性质的地方。 有时在这些点样品有巨大的岩石或沼泽的地方或充满小湖泊和池塘。 从点集他们希望我find大致定义这些洞的凹多边形。 我已经写出了find外部凹形边界多边形的algorithm,并允许它们设置algorithm形成的多边形的粗糙度或平滑度的灵敏度。 之后,他们希望find洞,并把这些洞作为一个凹多边形,我猜在某些情况下可能是凸的,但这将是边缘情况不规范。 问题是我所听到的关于这个问题的唯一论文是天文学家所做的,他们希望在空间中find大量空洞,我从来没有能够find他们的论文中的实际algorithm,除了粗略的概念性描述外, 我已经尝试过谷歌和各种学术论文search等,但迄今为止我还没有发现很多有用的东西。 这让我想知道是否有这样一个问题的名称,我不知道,所以我正在寻找错误的东西或什么? 所以在这个漫长的解释之后,我的问题是:有没有人知道我应该寻找什么来find这个文件,最好用明确的algorithm,或者有人知道一个algorithm,他们可以指向我? 任何能够帮助我解决这个问题的东西都是非常有用的,并且非常值得赞赏,即使只是正确的search短语,将会产生潜在的algorithm或论文。 这将实施的语言将是C#,但从Mathematica包到MATLAB or ASM, C, C++, Python, Java or MathCAD等的任何示例都可以,只要示例中没有一些调用去FindTheHole等等FindTheHole没有定义或者是专有的实现软件,例如MathCAD例子通常有很多。 下面是实际点集的两个例子,一个是稠密的,一个是稀疏的,我们需要find它们的区域:

如何对浮点数执行按位运算

我试过这个: float a = 1.4123; a = a & (1 << 3); 我得到一个编译器错误,说&的操作数不能是floattypes。 当我这样做时: float a = 1.4123; a = (int)a & (1 << 3); 我正在运行程序。 唯一的事情就是按四舍五入后得到的数字的整数表示进行按位运算。 以下也是不允许的。 float a = 1.4123; a = (void*)a & (1 << 3); 我不明白为什么int可以被抛出void*但不能float 。 我正在这样做来解决在Stack Overflow问题中描述的问题如何使用遗传algorithm求解线性方程组? 。