algorithm - 我们是根据计算模型进行算法分析,还是根据“常识”进行分析?
问题描述
最近,我正在阅读这些关于算法的书籍,特别是关于算法分析的部分:
- 算法导论。第三版。TCRC
- 算法设计手册。第 2 版。S.斯基纳
- 算法设计。J.Kleinberg & Eva Tardos
- 算法。第 4 版。R.塞奇威克
- 算法。S. Dasgupta、C. Papadimitriou 和 Vazirani
- 其他几本书
在那之后,我有点困惑,因为我不完全理解算法计算步数的起源。
我的意思是,在《算法导论》和《算法设计手册》中,提到了一种叫做 RAM 计算模型的东西。在这些书中,据说在该模型下我们计算步数,但在其他书中没有提到这样的计算模型。
其他书籍讨论了算法行进路径的计数步骤,即以常识方式或以逻辑方式。所以,如果你们能帮助我解决这些问题,我将不胜感激:
计步方法(其他书籍)和使用计算模型(TCRC & S. Skiena)之间有什么关系(或区别)?当有人谈论计算步骤来分析算法时,我可以假设他指的是使用计算模型(RAM)吗?
解决方案
我们的常识基于一个可以是隐式或显式的计算模型。通常在介绍性课程中,它是隐含的。明确地,您使用的通常是 RAM 模型。这是基于顺序处理的思想,每个简单的操作都需要固定的时间。所以你只计算步数。
您可以在http://people.seas.harvard.edu/~cs125/fall14/lec6.pdf找到该模型的正式描述。
当然,现实是完全不同的。正如https://gist.github.com/jboner/2841832所示,操作花费的时间完全不同。通过切换到使用排序而不是哈希查找,我个人看到工作从 5 天缩短到 1 小时。是的,哈希查找是O(1)
,但是当数据由磁盘支持时,它的常量很可怕。分布式计算使事物并行运行。GPU 上的计算为您提供了大量的并行性……只要所有计算都以完美的步调运行。我们正在尝试构建量子计算机,理论上它可以给我们带来很多很多数量级的并行性......以失去像“if”这样的不可逆操作为代价。
我们可以创建处理所有这些复杂性的模型。但是,在您了解基础知识之前,无需考虑其中任何一个。这是 RAM 模型中的标准“计数操作”。
推荐阅读
- oracle - 在 oracle 中将 oracle 用户名/user_id 添加到标题
- c++ - 如何从 C++ 访问 emscripten 会话数据?
- reactjs - 找不到 React-native/Libraries/Components/ScrollResponder
- java - Java GUI 运行不流畅
- python - 如何通过 python 从这个 json 中获取所有父元素?
- apache-spark - 火花流是否多次写入文件
- python - 如何将两个不同字典中的键相互映射?
- c# - 在 Web 表单之间发送变量
- python - PySpark DataFrame:查找最接近整数列值的数组列索引
- java - 为了安宁,我应该对不同的获取请求使用一种方法还是将它们分开