算法-效率的度量和函数的渐进增长_算法分析,等效率函数(1)

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上运维知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注运维)
img

正文

第二种算法 :

int 1, sum = 0,n = 100;		/ * 执行1次 */
sum = (1 + n) * n /2;		/ * 执行1次 */
System.out.println(sum);		/ * 执行1次 */

显然,第一种算法,执行了 1+ ( n+1 ) +n+1 次 =2n+3次; 而第二种算法,是1+1+1=3 次。事实上两个算法的第一条和最后一条语句是一样的,所以我们关注的代码其实是中间的那部分,我们把循环看作一个整体,忽略头尾循环判断的开销, 那么这两个算法其实就是 n 次与 1 次的差距。算法好坏显而易见。

我们再来延伸一下上面这个例子:

int i,j,x=0,sum=0, n = 100;		/* 执行1次 */
   for(i = 1; i <= n; i++){
       for(j = 1; j <= n; j++){
 	   x++;					/* 执行n×n次 */
	   sum+=x;
       }
    }
System.out.println(sum);		/* 执行1次 */

这个例子中, i 从 1 到 100 ,每次都要让 j 循环 100 次,而当中的 x++和 sum+=x ; 其实就1+2+3+…+10000 ,也就是 100^2 (100的2次方)次,所以这个算法当中,循环部分的代码整体需要执行 n^2 (忽略循环体头尾的开销)次。显然这个算法的执行次数对于同样的输入规模 n =100 , 要多于前面两种算法,这个算法的执行时间随着 n 的增加也将远远多于前面两个。

此时你会看到,测定运行时间最可靠的方法就是计算对运行时间有消耗的基本操作的执行次数, 运行时间与这个计数成正比。

我们不关心编写程序所用的程序设计语言是什么,也不关心这些程序将跑在什么样的计算机中,我们只关心它所实现的算法。这样,不计那些循环索引的递增和循环终止条件、 变量声明、打印结果等操作, 最终,在分析程序的运行时间时,最重要的是把程序看成是独立于程序设计语言的算法或一系列步骤。

可以从问题描述中得到启示,同样问题的输入规模是 n ,求和算法的第一种,求1+2+… +n 需要一段代码运行 n 次 。那么这个问题的输入规模使得操作数量是 f ( n)= n ,显然运行 100 次的同一段代码规模是运算 10 次的 10 倍。而第二种,无论 n 为多少,运行次数都为 1 ,即 f (n) =1 ; 第三种,运算 100 次是运算 10 次的 100倍。因为它是 f (n) =n^2 。

我们在分析一个算法的运行时间时,重要的是把基本操作的数量与输入规模关联起来,即基本操作的数量必须表示成输入规模的函数(如图 2-7-1 所示) 。

我们可以这样认为,随着 n 值的越来越大,它们在时间效率上的差异也就越来越大 。好比你们当中有些人每天都在学习,我指有用的学习,而不是只为考试的死读书 , 每天都在进步,而另一些人,打打游戏,睡睡大觉。 入校时大家都一样 , 但毕业时结果可能就大不一样,前者名企争抢着要,后者求职无门 。

2.8 函数的渐近增长

我们现在来判断一下,两个算法 A 和 B 哪个更好。 假设两个算法的输入规模都是n ,算法 A 要做 2n + 3 次操作,你可以理解为先有一个 n 次的循环 ,执行完成后,再有一于 n 次循环,最后有三次赋值或运算,共 2n + 3 次操作。 算法 B 要做 3n + 1 次操作。 你觉得它们谁更快呢?

准确说来,答案是不一定的(如表 2-8-1 所示)。

当 n = 1 时,算法 A 效率不如算法 B (次数比算法 B 要多一次)。 而当 n = 2时,两者效率相同 ; 当 n>2 时,算法 A 就开始优于算法 B 了,随着 n 的增加,算法 A 比算法 B 越来越好了: (执行的次数比 B 要少)。于是我们可以得出结论,算法 A 总体上要好过算法 B 。

此时我们给出这样的定义,输入规模 n 在没有限制的情况下,只要超过一个数值N ,这个函数就总是大于另一个函数,我的称函数是渐近增长的。

函数的渐近增长:给定两个函数 f(n)和g(n), 如果存在-个整数 N ,使得对于所有的 n>N, f(n)总是比g(n)大,那么 , 我们说f(n)的增长渐近快于 g(n)。

从中我们发现,随着 n 的增大,后面的 +3 还是 +1 其实是不影响最终的算法变化的,例如算法 A’ 与算法 B ’ ,所以, 我们可以忽略这些加法常数。 后面的例子,这样的常数被忽略的意义可能会更加明显 。

我们来看第二个例子,算法 C 是 4n+8 ,算法 D 是 2n^2 + 1 (如表 2-8-2 所示) 。

当 n <= 3 的时候,算法 C 要差于算法 D (因为算法 C 次数 比较多) ,但当 n > 3后,算法 C 的优势就越来越优于算法D了,到后来更是远远胜过。而当后面的常数去掉后,我们发现其实结果没有发生改变。 甚至我们再观察发现, 哪怕去掉与 n 相乘的常数,这样的结果也没发生改变,算法 C 的次数随着 n 的增长,还是远小于算法D 。 也就是说, 与最高次项相乘的常数并不重要

我们再来看第三个例子。算法 E 是 2n^2(n的2次方) + 3n + 1 ,算法 F 是 2n^3 + 3n + 1 (如表2-8-3 所示)。

为了做好运维面试路上的助攻手,特整理了上百道 【运维技术栈面试题集锦】 ,让你面试不慌心不跳,高薪offer怀里抱!

这次整理的面试题,小到shell、MySQL,大到K8s等云原生技术栈,不仅适合运维新人入行面试需要,还适用于想提升进阶跳槽加薪的运维朋友。

本份面试集锦涵盖了

  • 174 道运维工程师面试题
  • 128道k8s面试题
  • 108道shell脚本面试题
  • 200道Linux面试题
  • 51道docker面试题
  • 35道Jenkis面试题
  • 78道MongoDB面试题
  • 17道ansible面试题
  • 60道dubbo面试题
  • 53道kafka面试
  • 18道mysql面试题
  • 40道nginx面试题
  • 77道redis面试题
  • 28道zookeeper

总计 1000+ 道面试题, 内容 又全含金量又高

  • 174道运维工程师面试题

1、什么是运维?

2、在工作中,运维人员经常需要跟运营人员打交道,请问运营人员是做什么工作的?

3、现在给你三百台服务器,你怎么对他们进行管理?

4、简述raid0 raid1raid5二种工作模式的工作原理及特点

5、LVS、Nginx、HAproxy有什么区别?工作中你怎么选择?

6、Squid、Varinsh和Nginx有什么区别,工作中你怎么选择?

7、Tomcat和Resin有什么区别,工作中你怎么选择?

8、什么是中间件?什么是jdk?

9、讲述一下Tomcat8005、8009、8080三个端口的含义?

10、什么叫CDN?

11、什么叫网站灰度发布?

12、简述DNS进行域名解析的过程?

13、RabbitMQ是什么东西?

14、讲一下Keepalived的工作原理?

15、讲述一下LVS三种模式的工作过程?

16、mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?

17、如何重置mysql root密码?

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注运维)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
,那么很难做到真正的技术提升。**

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注运维)
[外链图片转存中…(img-eIDkYL5b-1713633077142)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DQN算法是一种基于Q-learning的深度强化学习算法,其目标是学习一个Q函数,使得该函数能够最大化累积奖励。DDQN算法是对DQN算法的改进,通过解决DQN算法中过高估计Q值的问题,提高了算法的性能。Dueling DQN算法则是在DDQN算法的基础上,提出了一种新的神经网络结构,使得算法的学习效率更高。 下面是DQN算法的公式推导分析: 1. Q-learning的更新公式为:$Q(s_t,a_t) \leftarrow Q(s_t,a_t) + \alpha(r_{t+1} + \gamma \max_{a} Q(s_{t+1},a) - Q(s_t,a_t))$ 2. DQN算法使用了深度神经网络来逼近Q函数,将更新公式改为:$Q(s_t,a_t) \leftarrow Q(s_t,a_t) + \alpha(r_{t+1} + \gamma \max_{a} Q(s_{t+1},a; \theta^-) - Q(s_t,a_t; \theta))$,其中$\theta$为当前网络的参数,$\theta^-$为目标网络的参数,$\max_{a} Q(s_{t+1},a; \theta^-)$表示在下一个状态$s_{t+1}$中,选择动作$a$所得到的最大Q值。 3. DDQN算法在DQN算法的基础上,使用了双网络结构,解决了DQN算法中过高估计Q值的问题。更新公式为:$Q(s_t,a_t) \leftarrow Q(s_t,a_t) + \alpha(r_{t+1} + \gamma Q(s_{t+1},\arg\max_{a} Q(s_{t+1},a; \theta); \theta^-) - Q(s_t,a_t; \theta))$,其中$\arg\max_{a} Q(s_{t+1},a; \theta)$表示在下一个状态$s_{t+1}$中,选择动作$a$所得到的最大Q值对应的动作。 4. Dueling DQN算法在DDQN算法的基础上,提出了一种新的神经网络结构,使得算法的学习效率更高。具体来说,Dueling DQN算法的输出包括两个分支,分别是该状态的状态价值V(标量)和每个动作的优势值A(与动作空间同维度的向量)。网络结构如下图所示: [Dueling DQN网络结构](https://img-blog.csdn.net/20170727145756345?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2hlbnhpYW9fYmFpZHUx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/80) 更新公式为:$Q(s_t,a_t) \leftarrow V(s_t) + (A(s_t,a_t) - \frac{1}{|\mathcal{A}|} \sum_{a} A(s_t,a))$,其中$V(s_t)$表示状态$s_t$的价值,$A(s_t,a_t)$表示在状态$s_t$下选择动作$a_t$的优势值,$\frac{1}{|\mathcal{A}|} \sum_{a} A(s_t,a)$表示所有动作的平均优势值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值