复杂度
复杂度应环绕在每个程序员的心间。我始终认为写代码是对抽象事物的具体实现,针对不同的事物应该有想媲美的写法。
讲个在工作中很真实的事情,前段时间我实现一个jenkins有关的需求。具体的需求:在jenkins完成制品之后,使用脚本库里面的脚本进行部署。为了防止脚本不可用情况,应提供一个对应的手动部署的指令集。
这个玩意很尴尬的点是建立在py获取脚本上的。也就是说很慢。我在实现后发现了这一问题,一开始也是想着在代码层面进行解决,优化代码优化JVM等。
后面时间损耗的大头,py脚本实在是没办法。最终引入本地缓存,那这边就要考虑是redis还是Java内置的Map Or List?缓存肯定是需要一个有效期的,不然脚本更新了,无法正常显示。
Map-->KV结构--->无序-->自动过期需要一个监控-->计算量增大。
LinkedList-->节点维护-->散列表优化-->中庸。
ArrayList-->时间天然有序-->需要至少两个(一个存Key,一个存Value)-->空间损耗
就这样的一个思考。其实应该在大家平时开发的时候也经常有,如何思考,如何选择。
最后和针对业务选择了ArrayList。然后使用定时任务进行删除,定时任务删除的频率是根据业务量的高低峰进行动态切换的。不过这边使用下来不好用,后期我准备还是切换成正常的LRU来进行实现。
这边扯远了,但是我个人觉得复杂度应该是一个程序员应该必须的思维角度。同样的思想还有时间换空间,空间换时间等。
复杂度是什么:同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。算法分析的目的在于选择合适算法和改进算法。一个算法的评价主要从时间复杂度和空间复杂度来考虑。
其实这个玩意大部分人都知道。
复杂度分析是评估所采用的算法和数据结构效率的一种方式,又可以叫做“事前分析估算方法”,指的是在程序运行之前,在程序员编写程序时就进行代码时间复杂度和空间复杂度的估算,进而提高代码运行效率的一种手段。
与事前分析估算方法对应的,还有事后分析估算方法,通过设计好的测试程序和数据,来统计和监控,利用计算机计时器对不同算法编制的程序的运行时间进行比较,从而确定算法效率的高低。
复杂度又分为时间复杂度和空间复杂度
时间复杂度的全称是渐进时间复杂度(asymptotic time complexity),表示算法的执行时间与数据规模之间的增长关系。
空间复杂度全称就是渐进空间复杂度(asymptotic space complexity),表示算法的存储空间与数据规模之间的增长关系。
那么事后统计法的缺陷是什么:不同的服务器,可能结果不相同。
这边不谈论如何进行时间复杂度的计算,这玩意看看肯定知道了。