- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我了解到增长率通常用于衡量算法的运行时间和效率。我的问题是为什么使用增长率而不是使用运行时和输入大小之间的精确(或近似)关系?
编辑:
感谢您的回复。我想澄清一下“运行时和输入大小之间的关系”是什么意思,因为它有点含糊。
据我了解,增长率是运行时相对于输入的梯度。因此,n^2 的增长率将给出 t = k(n^3) + Constant 形式的方程。考虑到方程式的信息量更大(因为它包含常数)并且显示与所需时间的直接关系,我认为它会是首选。
我确实明白,随着 n 的增加,常数很快就会变得无关紧要,并且根据不同的计算配置,k 会有所不同。也许这就是为什么仅使用增长率就足够了。
最佳答案
算法并不是影响实际运行时间的唯一因素
编程语言、优化、分支预测、I/O 速度、分页、处理速度等因素都会发挥作用。
一种语言/机器/任何东西肯定比另一种有优势,因此每种算法都需要在完全相同的条件下执行。
除此之外,当考虑驻留在 RAM 中的输入和输出时,一种算法可能优于 C 语言中的另一种算法,但当考虑驻留在磁盘中的输入和输出时,另一种算法可能优于 Python 中的第一种算法。
毫无疑问,几乎没有机会就应该用于执行所有基准测试的确切条件达成一致,而且,即使可以达成这样的一致,使用 5 岁的 child 肯定是不负责任的当今计算世界的基准测试结果,因此需要定期为所有算法重新创建这些结果 - 这将是一项庞大且非常耗时的任务。
算法有不同的常数因子
在极端情况下,某些算法的常数因子非常高,以至于现代其他渐近较慢的算法在所有合理输入上都优于它。如果我们只看运行时间,那么这些算法在较大输入上优于其他算法的事实可能会丢失。
在不太极端的情况下,由于涉及的常数因素,我们会得到与其他输入大小不同的结果 - 我们可能会看到一种算法在我们所有的测试中都更快,但一旦我们达到某个输入大小,另一个可能会变得更快。
一些算法的运行时间在很大程度上取决于输入
例如,对已排序数据的基本快速排序需要 O(n^2),而平均需要 O(n log n)。
当然可以确定最好和最坏的情况并针对这些情况运行算法,但平均情况只能通过数学分析来确定 - 你不能为“平均情况”运行它 - 你 可以针对随机输入运行它很多次并得到平均值,但这相当不精确。
所以粗略估计就足够了
由于上述原因,仅说一个算法是有意义的,例如,O(n^2),这非常粗略地意味着,如果我们处理足够大的输入大小,则需要 4如果输入大小加倍,则时间更长。如果您一直在关注,您就会知道实际花费的时间可能与 4 倍长的时间有很大不同,但它至少给了我们一些想法 - 我们预计不会花费两倍长,也不是 10 倍长(尽管在极端情况下可能会如此)。我们也可以合理地期望,例如,对于大 n,O(n log n) 算法优于 O(n^2) 算法,这是一个有用的比较,并且可能比某些人更容易看到发生了什么更准确的表示。
关于algorithm - 为什么首选增长顺序作为运行时算法性能的基准?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21703166/
SQLite、Content provider 和 Shared Preference 之间的所有已知区别。 但我想知道什么时候需要根据情况使用 SQLite 或 Content Provider 或
警告:我正在使用一个我无法完全控制的后端,所以我正在努力解决 Backbone 中的一些注意事项,这些注意事项可能在其他地方更好地解决......不幸的是,我别无选择,只能在这里处理它们! 所以,我的
我一整天都在挣扎。我的预输入搜索表达式与远程 json 数据完美配合。但是当我尝试使用相同的 json 数据作为预取数据时,建议为空。点击第一个标志后,我收到预定义消息“无法找到任何内容...”,结果
我正在制作一个模拟 NHL 选秀彩票的程序,其中屏幕右侧应该有一个 JTextField,并且在左侧绘制弹跳的选秀球。我创建了一个名为 Ball 的类,它实现了 Runnable,并在我的主 Draf
这个问题已经有答案了: How can I calculate a time span in Java and format the output? (18 个回答) 已关闭 9 年前。 这是我的代码
我有一个 ASP.NET Web API 应用程序在我的本地 IIS 实例上运行。 Web 应用程序配置有 CORS。我调用的 Web API 方法类似于: [POST("/API/{foo}/{ba
我将用户输入的时间和日期作为: DatePicker dp = (DatePicker) findViewById(R.id.datePicker); TimePicker tp = (TimePic
放宽“邻居”的标准是否足够,或者是否有其他标准行动可以采取? 最佳答案 如果所有相邻解决方案都是 Tabu,则听起来您的 Tabu 列表的大小太长或您的释放策略太严格。一个好的 Tabu 列表长度是
我正在阅读来自 cppreference 的代码示例: #include #include #include #include template void print_queue(T& q)
我快疯了,我试图理解工具提示的行为,但没有成功。 1. 第一个问题是当我尝试通过插件(按钮 1)在点击事件中使用它时 -> 如果您转到 Fiddle,您会在“内容”内看到该函数' 每次点击都会调用该属
我在功能组件中有以下代码: const [ folder, setFolder ] = useState([]); const folderData = useContext(FolderContex
我在使用预签名网址和 AFNetworking 3.0 从 S3 获取图像时遇到问题。我可以使用 NSMutableURLRequest 和 NSURLSession 获取图像,但是当我使用 AFHT
我正在使用 Oracle ojdbc 12 和 Java 8 处理 Oracle UCP 管理器的问题。当 UCP 池启动失败时,我希望关闭它创建的连接。 当池初始化期间遇到 ORA-02391:超过
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve
引用这个plunker: https://plnkr.co/edit/GWsbdDWVvBYNMqyxzlLY?p=preview 我在 styles.css 文件和 src/app.ts 文件中指定
为什么我的条形这么细?我尝试将宽度设置为 1,它们变得非常厚。我不知道还能尝试什么。默认厚度为 0.8,这是应该的样子吗? import matplotlib.pyplot as plt import
当我编写时,查询按预期执行: SELECT id, day2.count - day1.count AS diff FROM day1 NATURAL JOIN day2; 但我真正想要的是右连接。当
我有以下时间数据: 0 08/01/16 13:07:46,335437 1 18/02/16 08:40:40,565575 2 14/01/16 22:2
一些背景知识 -我的 NodeJS 服务器在端口 3001 上运行,我的 React 应用程序在端口 3000 上运行。我在 React 应用程序 package.json 中设置了一个代理来代理对端
我面临着一个愚蠢的问题。我试图在我的 Angular 应用程序中延迟加载我的图像,我已经尝试过这个2: 但是他们都设置了 src attr 而不是 data-src,我在这里遗漏了什么吗?保留 d
我是一名优秀的程序员,十分优秀!