图解弄懂八大常用算法思想
|
旁路缓存策略 提到这个有逼格的名词你可能不是很熟悉,但是说到它的使用方式,你肯定用过。 这是一种最经典的缓存+数据库读写的模式,英文是这样 Cache Aside Pattern,可能你见过。 这种模式对应的使用方式有两种情况,一读一写:
1、基本读取方式 这部分相信大家已经轻车熟路:先读缓存,缓存中没有数据的话就去数据库读取,然后再存入缓存中,同时返回响应。
这没什么可说的,平时都这么用。如果还不清楚,看下小莱为大家画的图: 日常生产场景中,为了避免大量请求同时打在数据库上导致故障,数据库+缓存的方式已经成了日常标配。 对于读取的部分,大家都很熟悉。但是对于写的部分,到底是先写库还是先写缓存,这点可能困扰着很多人。
各位看官请跟随小莱往下看: 这段代码想要实现的就是往一个数组中插入数据,如果数组满了的话,那么就求和之后的 sum 放到数组的第一个位置,之后继续将数据插入到数组中。通过分析可以发现,这段代码的最好情况时间复杂度是 O(1),最坏情况时间复杂度是 O(n),平均时间复杂度是 O(1)。 那么这段代码中,在大部分情况下,时间复杂度是 O(1),只有个别情况下,复杂度才是 O(n)。并且,O(1) 和 O(n) 出现的比较规律,一般一个 O(n) 执行之后,会出现 n-1 个 O(1) 的执行。针对这种情况,可以使用摊还分析法,就是把 O(n) 这个耗时多的时间复杂度均摊到接下来的 n-1 个 O(1) 的执行上,均摊下来的时间复杂度为 O(1),这个时间复杂度就是均摊时间复杂度。 那么均摊时间复杂度不怎么常见,常见的场景是:对一个数据结构进行一组连续操作,大部分情况下时间复杂度都很低,只有个别情况下时间复杂度比较高。而且这些操作之间存在前后连贯的时序关系,比如上面提到的先是一系列 O(1) 的时间复杂度操作,接下来是 O(n) 的时间复杂度操作。这个时候就可以采用摊还分析法将较高时间复杂度的那次操作的耗时平摊到其他时间复杂度比较低的操作上。 一般均摊时间复杂度等于最好情况时间复杂度。那么如何区别平均时间复杂度和均摊时间复杂度呢?我觉得看你使用哪种方法,假如使用摊还分析法算出来的时间复杂度就是均摊时间复杂度,使用加权方式、或者期望值计算方式算出来的时间复杂度就是平均时间复杂度。 4. 空间复杂度分析 空间复杂度分析方法很简单。时间复杂度的全称叫做渐进时间复杂度,表示算法的执行时间与数据规模之间的增长关系。那么空间复杂度全称叫做渐进空间复杂度,表示算法的存储空间与数据规模之间的增长关系。
比如下面这段代码中,首先 int i= 0; 申请一个空间存储变量,是常量可以忽略,int[] a = new int[n]; 申请了一个大小为 n 的 int 类型数组,剩下的代码都没有占用更多的空间,因此空间复杂度是 O(n) (编辑:信阳站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
