哪种模型的算法运行时间存在?
我们都希望mergesort比bublesort快,并注意mergesort对于bubblesort进行O(n log n)比较与O(n 2 )。
对于其他算法,您可以计算其他操作(比较比较和交换),例如指针取消引用,数组查找,固定大小整数算术等。
有哪些建模执行时间的方法?
我知道自己正在计算从磁盘读取和写入磁盘的块数;请参阅我对When does Big-O notation fail?的回答,以获得冗长的描述。
另一个是计算缓存未命中数。这通过查看内存层次结构的所有级别来扩展I / O模型。
对于分布式算法(例如在安全多方计算中),第三种方法是计算通过网络传输的数据量(通常以通信轮次或消息数量来衡量)。
为了预测算法的性能,有哪些其他有趣的东西可以计算(而不是计数!)?
另外,这些模型有多好?据我所知,缓存遗忘算法与磁盘上数据的I / O高效算法相比具有竞争力,但对于内存中算法则不然
特别是:在哪些特定情况下,这些模型会错误预测相对表现?根据我自己的实验,当数据足够小以适应内存时,Fibonacci堆不会加快Dijstra的最短路径(相对于二进制堆)。
答案 0 :(得分:4)
您必须定义计算模型,估算每项操作的成本,然后根据这些成本分析算法;当然,成本取决于您要部署算法的特定环境和底层机器的特性,因此这个问题实在太普遍了。
在算法课程中,我们假设每个操作都花费1,所以我们只计算循环次数;在与主存储器一起使用的算法中,我们假设每个操作(从I / O读取/写入除外)成本为0(和读/写1),依此类推。
这些模特是否与现实紧密相关?这取决于现实:您的环境和机器。
您在缓存未命中时的计算可能在核心组合上是正确的,但对于单元处理器是错误的,例如,您必须手动传输SPE内存的内容。
答案 1 :(得分:0)
我认为无论您使用O(n ...)表示法建模执行时间/空间的基础,您都假设一个规范化的环境。我认为无论你指定什么模型,无论你测量多少变量来确定它......它只适用于标准化环境。因此,当磁盘I / O在竞争条件中较低时,可能不需要O(n ...)来计算这些开销......如果你看到了我的观点。
因此,O(n)模拟输入n上的标准化环境中的典型性能。
通过扩展,您可以说磁盘读取的顺序为O(n),或者内存分配的顺序为O(n),依此类推。增加压力的外部事件(例如调度)不应该在典型时间/空间/任何事件发生的模型中起作用。
或许我错过了你的观点(我怀疑我可能会这样)。
答案 2 :(得分:0)
对于我正在使用的实时平台,最近我发现复制大量数据(例如:KB范围内,而不是MB范围)实际上比我预期的更快。可能这与今天使用的大型缓存有关,或者可能只是速度极快的处理器速度。但结果是,为了避免数据拷贝,人们真的不应该费心去歪曲一个人的代码了。
相反,我真正需要注意的是设备访问和上下文切换。这些越多越好。
“零缓冲”设备驱动程序与速度同步的日子结束了。