数据结构之所以重要,是因为不同的数据结构表现出来的数学性质是构成特定算法的基础。就像各种化学元素可以构建不同性质的化合物样,不同性质的化合物依赖于正式化学工程。计算机科学的数据结构大致可以分为两类,一类是数组,一类是链表。两种性质完全相反的物质。数组-线性性能最好,支持随机访问。根据索引,数组中元素的时间复杂度为O(1),插入和删除元素的时间复杂度为O(n);链表-可扩展性最好,支持动态增减元素,插入、删除元素的时间复杂度为O(1),检索元素的时间复杂度为O(n)。
算法设计技术是利用数据结构来解决实际问题的技术,就像化合物特性研究和化学工程的关系一样,一是偏重科学特性的研究,二是解决实际问题。要使科学能引导生产,能造福世界,就必须把科学落地,那么这一过程中最重要的一步就是对实际问题进行建模,建模就是对问题的模拟,越准确越能解决问题。在算法设计层面,有哪些建模方法?大致可分为四类:
蛮力算法
贪婪算法
分治算法
动态规划。
在这些算法中,蛮力算法是问题建模的初始阶段,是对问题程序的再现,追求的是定性,性能不一定重要,但问题描述没有问题;分治和贪心是在蛮力的基础上进行的一次降级,通常可以将问题优化到O(nlogn)的规模范围内;而动态规划则可以进一步将问题的阶段降级到O(n)水平。降级是设计算法的初衷,前提是问题本身计算的各个阶段都有冗余,有重复计算的地方,找出这个重复点并不容易,就拿动态规划来说,虽然有极致的性能,但发现递推方程并不容易,当然这一切都要经过严格的数学证明,这样才更难得可贵。我们这里没有考虑到空间的优化,往往降级过程中最好保证空间的复杂性不会激增,这样才会有效。这方面我们不展开,有许多资料可供参考,其中我建议屈婉玲教授的算法设计分析。
写在最后。仔细一看,你可能会发现,为什么不说多线程呢?多线程也是一种常用的优化方法啊。是的,工程上的多线程常常可以优化程序的运行效率,但是这其中一个基础是,硬件资源没有被充分利用,即,如果由于IO导致CPU利用率不足,当然,我们必须找到一种方法来建立一个能够充分利用硬件资源的方法,而多线程、多路复用这些技术都是为了提高硬件的利用率,因此,不在我们讨论的范围内。这篇文章还有另外一篇更详细的姐妹文章,希望对你有所帮助。