- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
平时我比较懒,按如下方式计算模逆:
def inv(a,m):
return 1 if a==1 else ((a-inv(m%a,a))*m+1)//a
print(inv(100**7000,99**7001))
但我很想知道传递更多信息的方法,即 Bezout 定理的解决方案(而不是一对定理中的一个),在实践中是否会产生更快或更慢的算法:
def bez(a,b):
# returns [x,y,d] where a*x+b*y = d = gcd(a,b) since (b%a)*y+a*(x+(b//a)*y)=d
if a==0: return [0,1,b] if b>0 else [0,-1,-b]
r=bez(b%a,a)
return [r[1]-(b//a)*r[0],r[0],r[2]]
def inv(a,m):
r=bez(a,m)
if r[2]!=1: return None
return r[0] if r[0]>=0 else r[0]+abs(m)
print(inv(100**7000,99**7001))
我惊奇地发现后者比前者跑得快50多倍!但是两者都使用几乎相同数量的递归调用和每次调用 1 个整数除法和 1 个模运算,并且操作数的位长平均大约是前者的两倍(因为涉及的参数相同),所以我只期望它的时间复杂度大约是后者的 4 倍,而不是后者的 50 倍。
So why am I observing this strange speedup?
请注意,我使用的是 Python 3,我在运行 online 时观察到这一点,在顶部添加以下代码以停止 Python 解释器提示超出最大递归深度或堆栈空间:
import resource,sys
sys.setrecursionlimit(1000000)
resource.setrlimit(resource.RLIMIT_STACK,[0x10000000,resource.RLIM_INFINITY])
最佳答案
我终于明白了。假设初始输入是 n 位整数。在典型情况下,除了对 inv
或 inv2
的第一次调用外,递归调用的参数大小平均仅相差 O(1),并且有 O(n ) 平均递归调用,都是由于一些数论现象。这种 O(1) 大小差异意味着这两种方法实际上具有截然不同的平均时间复杂度。我的问题中隐含的假设是两个 n 位整数的乘法或除法大约需要 O(n^2) 时间;这适用于最坏的情况(对于教科书乘法),但不适用于快速方法的平均情况!
对于快速方法,可以证明当p,q > 0时,bez(p,q)
返回的三元组[x,y,d]满足abs(x) ≤ q 和 abs(y) ≤ p。因此,当每次调用 bez(a,b)
执行 b%a
和 (b//a)*r[0]
时,模由于平均 size(b)-size(a) ∈ O(1) 且 abs(r[0]) ≤ a,除法和乘法每个都需要 O(size(a)) 时间。因此,总时间大约为 O(n^2)。
然而,对于慢速方法,当每次调用inv(a,m)
时执行((a-inv(m%a,a))*m+1)//a
,我们有一个与 a 大小大致相同的 a-inv(m%a,a),所以这个除法是两个整数,其中第一个大约是第二个大小的两倍,这需要 O(大小(a)^2) 时间!因此,总时间大约为 O(n^3)。
的确,模拟结果与上述分析非常吻合。作为引用,使用快速方法 inv(100**n,99**(n+1))
where n = 1400·k for k∈[1..6] take time/ms 17,57,107,182,281,366
,同时使用慢速方法,其中 n = 500·k for k∈[1..6] 花费时间/ms 22,141,426,981,1827,3101
。它们分别与 9·k^2+9·k 和 13·k^3+8·k^2 非常吻合,平均分数误差分别为 ≈3.3% 和 ≈1.6%。 (我们包括前两个最高阶项,因为它们的贡献很小但很重要。)
关于algorithm - 模块化逆的奇怪 Python 加速,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42457205/
每个人(希望)都在努力实现代码模块化。我想要做的是有 1 个主要的 Sass 文件,它导入我的所有模块,这些模块是局部的,如果需要,这些局部可以调用它们自己的局部组。我想要的是,不是在我的代码库中调用
如何在 xslt 转换中模块化一组重复的输出?例如,我有如下内容(伪代码)。 并
假设我有几个简单的模型驻留在 food.py 中: import peewee as pw db = pw.SqliteDatabase('food.db') class BaseModel(pw.M
我正在开始一个新的 Angular 项目并尝试模块化我的所有代码——我厌倦了拥有大量的 app.js 文件,而且因为我正在为一家公司开发一个平台,所以我的代码整洁且模块化以便于测试、清洁和易于过渡到
所以,有人告诉我,在 nodeJS 中传递 request 和或 response 变量是“不好的做法”。但这意味着你的大部分代码都必须在 server.js 文件中,这使得它变得困惑而且有点难看。
有一个想法:函数(在 FP 中)可以以与 OOP 中的组件类似的方式组成。对于 OOP 中的组件,我们使用接口(interface)。对于函数,我们可以使用委托(delegate)。目标是实现分解、模
有没有办法将 SQL 代码模块化,使其更具可读性和可测试性? 我的 SQL 代码经常变成一长串复杂的嵌套连接、内连接等,难以编写和调试。相比之下,在像 Javascript 或 Java 这样的过程语
我想知道大公司如何倾向于在他们的页面上模块化组件。 Facebook 就是一个很好的例子: There's a team working on Search that has its own CSS,
我正在寻找在 WPF 中构建模块化应用程序模型的解决方案。目前,我使用 Devexpress POCO MVVM 来构建我的 WPF 应用程序,但缺乏模块化的可扩展性,我正在寻找适合我当前设计并允许构
我制作了一个 Gradle 项目,它使用类加载器从子目录资源/文本中加载文本文件。此时它可以工作,但是当我将项目转换为模块化 JavaFX 程序时,相同的类加载器函数会给出 NullPointerEx
假设我有一个通用类模块: export class MyCalc { data = {} ... } 并说我想扩展更多功能: export class MyCalcLoader {
我的模板文件变得越来越大并且过于复杂(大约 200 行(长)代码,9 级缩进),因此它也变得容易出错。我正在寻找一个简单的解决方案,它可以让我轻松访问 $scope 变量和函数。 我的第一个想法是使用
许多人说要将外部 CSS 和 JavaScript 文件的数量保持在最低限度以减少往返时间。例如,Google 建议每个网站最多分别使用两个 CSS 和 JavaScript 文件。 问题是,作为“模
我试图找出为什么我的 Promise 链执行无序,尽管编写了一个非嵌套的 then 链。我的函数已经模块化,以减少链中发生的代码膨胀(我期望有五个 then 方法),并且我不确定这些模块中的某些内容是
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 8 年前。 Improv
我使用 create-react-app 创建了一个样板 React 应用程序。 现在,在我的 App.js 文件中 import classes from './App.css'; 我做到了
Java 模块系统是否应该阻止模块通过反射访问其他模块,而不声明正确的模块依赖关系? 例如,在编译这个 hello world Java 11 类时,它从另一个模块调用类,正如预期的那样,它不会编译,
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 9 年前。 Improve this qu
我的应用程序上有许多不同的“控制元素”:下拉菜单、选项卡、菜单等。在同一页面上,有许多相同的控件。当编写 JavaScript 来处理与每个控件关联的不同事件时,我试图使我的代码尽可能干燥。挑战之一是
处理以下场景的模块化方式是什么:应用程序具有所有标题标签(h1、h2、h3 等)的通用样式。特定组件 Widget.jsx 可以使用这些标题中的任何一个,但 h1 标签具有特殊样式。在 CSS 的“旧
我是一名优秀的程序员,十分优秀!