• 读书笔记|指数型函数对算法的影响实际应用-day3


    14天阅读挑战赛

    系列文章目录

    趣味算法(第二版)读书笔记:
    day1: 序章|学习的方法和目标.
    day2:算法之美|打开算法之门与算法复杂性
    day3.算法之美|指数型函数对算法的影响实际应用
    day4.数学之美|斐波那契数列与黄金分割
    day5.算法实践|贪心算法基础
    day6.算法实践|最优装载
    day7.算法实践|背包问题


    课程导学

    从一盘棋的麦子作为展开:

    本章节主要讲解了,算法的增量度,也是对上一个章节的具体补充。尤其是对指数型函数算法进行了重点的剖析。需要在实践中,尽量避免。
    按照辩证思维,任何事务都是一体两面,在算法设计的实践中需要避免,不代表指数型函数在实际的工作中没有用处,今天的笔记就按照正反两个方面从算法设计和实际运用中去展开论述:


    一、算法时间复杂度详解

    首先声明算法效率的排序方式,从小到大依次如下:
    在这里插入图片描述
    运行效率排序:
    常数阶O(1)>对数阶O(logN)>线性阶O(n)>线性对数阶O(nlogN)>平方阶O(n²)>立方阶O(n³)>指数阶(2^n)> 阶乘O(n!) >循环递归O(n^n)

    上面从上至下依次的时间复杂度越来越大,执行的效率越来越低。
    下面选取一些较为常用的来讲解一下(没有严格按照顺序):

    1.1 常数阶O(1)

    无论代码执行了多少行,只要是没有循环等复杂结构,那这个代码的时间复杂度就都是O(1),如:

    int i = 50;
    int m = i ;
    
    • 1
    • 2

    上述代码在执行的时候,它消耗的时候并不随着某个变量的增长而增长,那么无论这类代码有多长,即使有几万几十万行,都可以用O(1)来表示它的时间复杂度。

    1.2 线性阶O(n)

    这个在最开始的代码示例中就讲解过了,如:

    for(i=1; i<=n; ++i)
    {
       j = i;
       j++;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    这段代码,for循环里面的代码会执行n遍,因此它消耗的时间是随着n的变化而变化的,因此这类代码都可以用O(n)来表示它的时间复杂度。

    1.3 对数阶O(logN)

    还是先来看代码:

    int i = 1;
    while(i
    • 1
    • 2
    • 3
    • 4
    • 5

    从上面代码可以看到,在while循环里面,每次都将 i 乘以 2,乘完之后,i 距离 n 就越来越近了。我们试着求解一下,假设循环x次之后,i 就大于 2 了,此时这个循环就退出了,也就是说 2 的 x 次方等于 n,那么 x = log2n【这里是log 2的n次方,符号不会敲】
    也就是说当循环 log2n【这里是log 2的n次方,符号不会敲】 次以后,这个代码就结束了。因此这个代码的时间复杂度为:O(logn)

    1.4 线性对数阶O(nlogN)

    线性对数阶O(nlogN) 其实非常容易理解,将时间复杂度为O(logn)的代码循环N遍的话,那么它的时间复杂度就是 n * O(logN),也就是了O(nlogN)。

    就拿上面的代码加一点修改来举例:

    for(m=1; m
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    1.5 平方阶O(n²)

    平方阶O(n²) 就更容易理解了,如果把 O(n) 的代码再嵌套循环一遍,它的时间复杂度就是 O(n²) 了。
    举例:

    for(x=1; i<=n; x++)
    {
       for(i=1; i<=n; i++)
        {
           j = i;
           j++;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    这段代码其实就是嵌套了2层n循环,它的时间复杂度就是 O(n*n),即 O(n²)
    如果将其中一层循环的n改成m,即:

    for(x=1; i<=m; x++)
    {
       for(i=1; i<=n; i++)
        {
           j = i;
           j++;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    那它的时间复杂度就变成了 O(m*n)

    1.6 立方阶O(n³)、K次方阶O(n^k)

    参考上面的O(n²) 去理解就好了,O(n³)相当于三层n循环,其它的类似。

    除此之外,其实还有 平均时间复杂度、均摊时间复杂度、最坏时间复杂度、最好时间复杂度 的分析方法,有点复杂,这里就不展开了。

    因此在实际应用过程中,循环的嵌套和回归算法的次数是有严格的使用要求的。


    二、空间复杂度

    既然时间复杂度不是用来计算程序具体耗时的,那么我也应该明白,空间复杂度也不是用来计算程序实际占用的空间的。

    空间复杂度是对一个算法在运行过程中临时占用存储空间大小的一个量度,同样反映的是一个趋势,我们用 S(n) 来定义。

    空间复杂度比较常用的有:O(1)、O(n)、O(n²),我们下面来看看:

    2.1 空间复杂度 O(1)

    如果算法执行所需要的临时空间不随着某个变量n的大小而变化,即此算法空间复杂度为一个常量,可表示为 O(1)
    举例:

    int i = 1;
    int j = 2;
    ++i;
    j++;
    int m = i + j;
    代码中的 i、j、m 所分配的空间都不随着处理数据量变化,因此它的空间复杂度 S(n) = O(1)

    2.2 空间复杂度 O(n)

    我们先看一个代码:

    int[] m = new int[n]
    for(i=1; i<=n; ++i)
    {
       j = i;
       j++;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    这段代码中,第一行new了一个数组出来,这个数据占用的大小为n,这段代码的2-6行,虽然有循环,但没有再分配新的空间,因此,这段代码的空间复杂度主要看第一行即可,即 S(n) = O(n)

    内存溢出错误

    在这里插入图片描述

    实际过程中,尤其是内存溢出错误,是现场很头疼的问题,所以对空间复杂度在进行设计和评估时也要进行衡量和估算。

    三、指数型函数与实际应用的结合

    作为一名以解决实际问题为导向的产品,函数图像尤其是课程中的指数型函数在对传媒,病毒防控,舆情管控的数据统计和分析,以及方案决策上有着广泛的应用。

    3.1 指数型函数对传播学的应用

    3.1.1 病毒传播研究模型

    在病毒传播学领域,研究病毒的传播算法,及其图形化决策也有重要的指导意义。
    假设感染的数量是可以稳定的。稳定与两个因素有关:
    一、施加在粒子上的感染浓度随机因子;
    二、治愈时间。对于随机因子,随机量(a,b的值)设置的大,则稳定的快,设置的小则稳定的慢。
    这个现象可以解释,当种群污染量达到一定程度时,会有很多粒子在随机因子的作用下随机变好,当变好的速度与感染的速度相等时,就稳定了。对于治愈时间,当然越短越好。
    如果不设置这两个值,那么种群会很快被全部感染。
    在这里插入图片描述

    3.1.2 指数型函数和裂变式营运

    裂变公式:

    在这里插入图片描述
    函数图形:
    在这里插入图片描述

    常见的六种营运裂变模型

    1. 助力模型

    助力是目前最常用的一种裂变模型,它的好处是用户理解容易、操作简单、效果明显,常用的助力玩法主要是以下这三种:

    1)砍价

    用户想要以零元或超低价获得某件商品,就需要邀请好友帮忙砍价。价格从高到低,邀请人数越多,成功概率越大。做砍价裂变,前几刀的设置很关键,要让用户感觉到成功无限接近。

    所以许多砍价活动,第一刀就会直接砍成90%以上,激发用户的胜负欲。

    2)领红包

    领红包的逻辑和砍价恰好相反,领红包是积少成多,所以在第一次攒红包的时候,需要让用户完成90%以上。当然与拼多多相反的路径,你也可以把每次助力的金额增大,而不是像拼多多每次助力一分钱的逻辑。

    另外针对奖励金额,也可以根据自己的业务进行调整,比如8元,66元,88元、200元等,让用户自己进行选择。这样的好处是,用户完成简单的任务之后得到现金,验证了获得真实性,就会更加积极的去做这件事情。

    3)点赞

    点赞有两种形式,一种是朋友圈常见的点赞,这种点赞活动在统计上会有麻烦。好处就是你可以要求兑奖的人必须添加你的微信,这样的话,如果你发了1000份礼物,你就能成功添加1000位微信好友。

    而这些人又是精准的活动参与人群,后期活动的冷启动他们都是很好的用户。另一种助力可以理解为投票,投票属于荣誉+物质性激励的行为,特别适合针对宝妈、微商代理、内容创作者。

    1. 分销模型

    分销是当前最流行的玩法,万物皆可分销,人人都是代理。

    对于单次活动或者小平台来说,直接做一级分销即可,把更多的利益给到推广者,比如卖门票、课程、日历、图书等,可以拿出30%,50%甚至更多作为分销者的奖励。

    但对于长期经营,用户消费频次高的产品或平台,可以采用多级分销模式,目前来说就是两级比较稳妥,合法合规。另外,如果需要做用户分层运营的话,可以在分销逻辑上加上一层等级的划分。

    最常见的是初中高三个等级,每个等级的晋升设置不同的条件,同时获得不同的分销奖励。

    1. 集卡模型

    集福、集字或者拼图片,这类集卡获得,其实对平台本身的用户体量要求比较高。其实它更多强调平台内的用户互动,可以当成用户留存和老用户激活的一种玩法。

    想把集卡活动变成拉新玩法,就需要对流程进行特殊的设计,比如新人翻倍卡。另外集卡集身份解锁这种玩法,比较适合各类游戏。

    对于电商平台或者教育等相关的产品,只适合在大促、重大节日的做活动,有一定的局限性,用户激活的成本比较高。

    1. 互利模型

    无论是邀请别人帮我们砍价,还是投票,都是单向的获利行为。这会让一部分推广者心里有门槛,不好意思去分享,我们都说利他主义,就得考虑助力者可以先获得什么?

    所以我们看到免费送、打车券、红包,都是以用户名义送给助力者一分好礼。互利的逻辑就是助力者可以得到优惠,分享者也可以获得对应的奖励。

    1. 邀请模型

    目前的玩法属于嵌套式的邀请奖励,比如邀请一位好友奖励30元。一般会把30元的现金奖励进行拆分,比如好友注册奖励5元,好友下首单奖励15元,好友二次复购奖励10元。

    这能有效规避刷单,确保用户的质量。还有一种阶梯奖励的方式,比如邀请3人以内每人奖励5元,邀请3-10人以内每人奖励8元。

    在单次获得奖励的基础上,可以设置业绩突破奖或者排行获得,刺激更多人冲击邀请任务。

    1. 特惠模型

    我们刚才分享的裂变玩法,最终的奖励几乎都是现金驱动的。而接下来,我们以现金等价物的方式作为裂变激励的条件,和大家分享三种常见的玩法。

    这三种玩法,要实现裂变的目的,就需要添加邀请好友助力的条件。比如邀请多少好友获得一元秒杀、免费领取的资格,还要加上限定的时间条件。

    其中重点说下拼团的玩法,拼团可以是两人团、3人团或者是更多人参团。但要求参团的人越多,越要注意选品的受众属性。


    四、总结

    以上就是今天要讲的内容,本文我们详细的学习了时间和空间复杂度的算法的函数表达,以及在实际工作中指数型函数从泛型到实例。
    tips:对于知识型的内容创作者来说,积累性的成长和回报曲线也如同指数型函数的曲线,必须熬过漫长的积累期,不断迭代完善和打磨,完成从0-1的积累,才能进入快速增长期,祝各位参加打开的小伙伴,“厚积薄发,破蛹成蝶”。

    下一章:day4.数学之美|斐波那契数列与黄金分割

  • 相关阅读:
    前端面试:原型和原型链
    机械设计基础习题
    Day04-GET和POST请求
    PostgreSQL的学习心得和知识总结(一百一十一)|内核级自上而下完美实现PostgreSQL数据库 日志格式tsvlog 的实现方案
    Python| GUI界面进行学生与作业匹配
    【递归、搜索与回溯算法】第三节.21. 合并两个有序链表和206. 反转链表和24. 两两交换链表中的节点
    果断收藏|产品经理的职业发展路径是怎样的?
    laravel 自定义节流中间件
    4种 Redis 集群方案及优缺点对比
    【LabVIEW 】串口如何读取长度不一致的字符串
  • 原文地址:https://blog.csdn.net/qq_16430177/article/details/127380431