声明:算法和数据结构的文章均是作者从github上翻译过来,为方便大家阅读。如果英语阅读能力强的朋友,可以直接到swift算法俱乐部查看所有原文,以便快速学习。作者同时也在学习中,欢迎交流。
在编程过程中,了解一个算法的速度和消耗内存是非常有用的,它可以让你在不同的情况选择合适的算法。
通过大O符号可以让你对算法的运行速度和内存消耗有粗略的判断。当有人说:“这个算法比O(n^2)跑得慢,占用了O(n)的空间。”他们的意思是,这个算法有点慢,但是不需要太多额外的内存。
理解算法的大O符号通常是经过数学分析。这里我们不讨论数学,但是了解不同的值所代表的意思还是有必要的,如下图。N代表你在处理的数据总量。比如,排序一个含有100个元素的数组,n=100。
通常情况下你不需要用数学推理去知道一个算法的大O,只需要简单的凭自觉。如果你的代码使用的是单一循环来查看所有的输入数据,那这个算法就是O(n)。如果你的代码使用的是两层嵌套循环,那这个算法就是O(n^2)。三次嵌套循环就是O(n^3),以此类推。
必须注意大O符号只是一个大致判断,同时它只适合数据总量大的情况。比如,对于插入排序算法O(n^2)是属于运行时间较长的,理论上会比归类排序算法O(nlogn)来的更久。但是在小数据总量的时候,插入排序算法却比归类排序算法更快,特别是当数组已经是部分排序好的情况下!
如果你感觉很迷惑,请不要让大o符号困扰你太多。在对比两个算法的优劣时候它是非常有用的!重点是要不断的去尝试。当然,在数据总量很小的时候,即使是实际应用,一个糟糕的算法也可以取得不错的效果。