算法实现中的失望之源剖析
1. 不可预测性问题
计算复杂度是预测算法资源需求的重要工具。然而,在实际中,算法分析得出的预测结果与软件执行情况往往不一致,尤其是当输入数据相似甚至相同时,软件每次运行的性能表现却大相径庭。
例如,我们开发了一个求解特定问题的算法,其时间复杂度为 f(n),其中 n 是输入规模。将该算法转化为代码后,用非常相似的数据集多次执行程序,会发现即使输入集大小相同,运行时间也有很大差异,且算法的时间复杂度分析并未表明对于给定的 n,f(n) 的范围会有如此大的波动。
非均匀内存访问可能是一个因素,但如果主存可用量超过算法的空间复杂度,且程序合理实现了算法,那么这个因素并不能解释具有相同内存需求的程序不同运行时间的差异。真正的原因可能是动态数据结构的管理。
许多算法在产生结果的过程中会使用一些数据结构,但这些结构后续并无其他用途。例如,在归并排序(MergeSort)中,需要一个额外的数组来存储中间结果,排序完成后该数组就可以丢弃。同样,从二叉搜索树中删除元素时,断开节点与树的连接使其不可访问,从而释放了内存。
在算法复杂度分析中,隐含地假设不再需要的空间会自动被回收。但从算法过渡到软件时,必须有明确的机制来实现内存的重用。这可能需要程序员手动操作,也可能是自动进行的。
- 手动释放内存 :一些编程语言要求程序员显式地释放不再使用的内存。然而,有些程序员可能认为程序结束时所有分配的空间都会被释放,因此在执行过程中手动释放内存是多余的;或者一些缺乏经验的程序员可能根本不知道需要编写释放内存的语句。在固定内存空间的编程环境中,如果不释放内存,可能会导致程序崩溃
超级会员免费看
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



