算法复杂上届
❶ 如何计算一个算法的时间复杂度
你这个问题是自己想出来的吧?
第一,你指的时间复杂度是大o表示法的复杂度,也就是一个上界,但不是上确界,所以就算你以一种方式中断排序过程,时间复杂度还是o(n*logn),假设排序过程还能执行的话。
第二,达到o(n*logn)的排序算法,以快速排序为例,快速排序不知道你看过没有,它不像选择排序或者冒泡排序那样,每一趟可以确定一直最大或者最小值,对于快速排序,每一趟排序后如果你删掉最后一个元素将导致整个算法失效。如果你要用这种删除元素方法的话,只能采用冒泡排序或者选择排序,时间复杂度是o(n^2)
所以,我猜想你是不是想做类似于在n个元素中寻找前k个最大者之类的事情(k=n-l)
如果是这样的话,有复杂度是o(n*logk)的算法,利用快速排序中的partition操作
经过partition后,pivot左边的序列sa都大于pivot右边的序列sb;
如果|sa|==k或者|sa|==k-1,则数组的前k个元素就是最大的前k个元素,算法终止;
如果|sa|
k,则从sa中寻找前k大的元素。
一次partition(arr,begin,end)操作的复杂度为end-begin,也就是o(n),最坏情况下一次partition操作只找到第1大的那个元素,则需要进行k次partition操作,总的复杂度为o(n*k)。平均情况下每次partition都把序列均分两半,需要logk次partition操作,总的复杂度为o(n*logk)。
由于k的上界是n,所以以n表示的总复杂度还是o(n*logn)
❷ 世界上最复杂的程序算法有哪些
Jump-pointer: 在作LA(v,d)的时候, 如果一层一层的往上搜索很慢. 有没有可能直接跳呢? 比如我们知道LA(u,d) = LA(v,d),如果u是v的一个ancestor. 如果直接储存了LA(u,d), 并且可以在log(n)的时间"跳"到u, 那么只要log n的时间就能找到LA(v,d). 这个算法要用 O(n log n)的preprocess time + O(log n)的time. 每一次跳的距离是上一次的1/2倍.,[这个算法很简单的]。
❸ 数据结构:排序算法总会提到的上界和下界是什么意思呀
简单来说,上界就是时间复杂度总不会超过这个数量级,下界就是时间复杂度总不会低于这个数量级。具体去wiki上看下O,Ω,Θ,o,ω的数学定义吧
❹ 算法中上界和下界分别是指什么
上界与下界的定义和数学中是相通的,比如一个变量x,并且有x属于a到b区间,这个区间就表示上界是a,下界是b,对于变量x的取值范围来说,最大不超过b,最小不小于a。
同样对于一个算法,上界就是对于一种资源的限制最大不大于的值,下界就是对于这种资源的限制最小不小于的值。
❺ 如何分析算法的复杂度
算法的复杂性
算法的复杂性是算法效率度量,是评价算法优劣的重要依据。一个算法的复杂性的高低体现在运行该算法所需要的计算机资源的多少上面,所需的资源越多,我们就说该算法的复杂性越高;反之,所需的资源越低,则该算法的复杂性越低。
计算机的资源,最重要的是时间和空间(即存储器)资源。因而,算法的复杂性有时间复杂性和空间复杂性之分。
不言而喻,对于任意给定的问题,设计出复杂性尽可能低的算法是我们在设计算法时追求的一个重要目标;另一方面,当给定的问题已有多种算法时,选择其中复杂性最低者,是我们在选用算法适应遵循的一个重要准则。因此,算法的复杂性分析对算法的设计或选用有着重要的指导意义和实用价值。
简言之,在算法学习过程中,我们必须首先学会对算法的分析,以确定或判断算法的优劣。
1.时间复杂性:
例1:设一程序段如下(为讨论方便,每行前加一行号)
(1) for i:=1 to n do
(2) for j:=1 to n do
(3) x:=x+1
......
试问在程序运行中各步执行的次数各为多少?
解答:
行号 次数(频度)
(1) n+1
(2) n*(n+1)
(3) n*n
可见,这段程序总的执行次数是:f(n)=2n2+2n+1。在这里,n可以表示问题的规模,当n趋向无穷大时,如果 f(n)的值很小,则算法优。作为初学者,我们可以用f(n)的数量级O来粗略地判断算法的时间复杂性,如上例中的时间复杂性可粗略地表示为T(n)=O(n2)。
❻ 怎么求算法的时间复杂性的上界和下界
简单一点,忽略诸如程序在循环变量上的开销,只考虑循环体
复杂度是通过数运算次数直接数出来的,要知道循环多少次,以及每次循环的工作量
(1)循环n次,每次两步加法两步赋值,简单一点讲就是每次循环工作量都是常数,所以复杂度就是Θ(n)(既是上界也是下界)
对于(2)而言,n=n-1下降比较慢,n=n/2下降比较快,同样每次循环的工作量都是常数,只要看循环次数,所以从前者去统计上界,从后者统计下界
最少的情况来自n=2^k的形式,要循环k步,复杂度下界是Ω(log n)
循环次数比较多的情况是反复出现n=n-1运算的情况,但注意一旦执行该运算之后n一定变成偶数,所以最坏情况是n=n-1和n=n/2交替出现,此时循环次数不超过2log_2 n,复杂度上界是O(log n)
合并起来总体的复杂度还是Θ(n)
❼ 求算法上界的问题
如果有lim(n->∞) T(n)/f(n)=常数C>0,则称算法T(n)的时间复杂度为O(f(n))
对于T(n)=2^n+n^2,显然有lim(n->∞) (2^n+n^2)/(2^n)=1,因此我们说这个算法的时间复杂度是O(2^n)。
❽ 怎样通过计算复杂度来估计n的上界。如:T(n)=O(n^3),n的上界是多少
万有引力定律:
(law of gravitation)物体间相互作用的一条定律,1687年为牛顿所发现。任何物体之间都有相互吸引力,这个力的大小与各个物体的质量成正比例,而与它们之间的距离的平方成反比。如果用m1、m2表示两个物体的质量,r表示它们间的距离,则物体间相互吸引力为F=(Gm1m2)/r2,G称为万有引力常数。
万有引力定律是牛顿在1687年出版的《自然哲学的数学原理》一书中首先提出的。牛顿利用万有引力定律不仅说明了行星运动规律,而且还指出木星、土星的卫星围绕行星也有同样的运动规律。他认为月球除了受到地球的引力外,还受到太阳的引力,从而解释了月球运动中早已发现的二均差、出差等。另外,他还解释了慧星的运动轨道和地球上的潮汐现象。根据万有引力定律成功地预言并发现了海王星。万有引力定律出现后,才正式把研究天体的运动建立在力学理论的基础上,从而创立了天体力学。
简单的说,质量越大的东西产生的引力越大,地球的质量产生的引力足够把地球上的东西全部抓牢。
不但地球对它周围的物体有吸引作用,而且任何两个物体之间都存在这种吸引作用。物体之间的这种吸引作用普遍存在于宇宙万物之间,称为万有引力。
万有引力是由于物体具有质量而在物体之间产生的一种相互作用。它的大小和物体的质量以及两个物体之间的距离有关。物体的质量越大,它们之间的万有引力就越大;物体之间的距离越远,它们之间的万有引力就越小。
两个可看作质点的物体之间的万有引力,可以用以下公式计算:F=GmM/r2,即 万有引力等于重力常量乘以两物体质量的乘积除以它们距离的平方。其中G代表引力常量,其值约为6.67×10的负11次方单位 N·m2 /kg2。为英国科学家 卡文迪许通过扭秤实验测得。
两个通常物体之间的万有引力极其微小,我们察觉不到它,可以不予考虑。比如,两个质量都是60千克的人,相距0.5米,他们之间的万有引力还不足百万分之一牛顿,而一只蚂蚁拖动细草梗的力竟是这个引力的1000倍!
但是,天体系统中,由于天体的质量和大,万有引力就起着决定性的作用。在天体中质量还算很小的地球,对其他的物体的万有引力已经具有巨大的影响,它把人类、大气和所有地面物体束缚在地球上,它使月球和人造地球卫星绕地球旋转而不离去。
重力,就是由于地面附近的物体受到地球的万有引力而产生的。
任意两个物体或两个粒子间的与其质量乘积相关的吸引力。自然界中最普遍的力。简称引力,有时也称重力。在粒子物理学中则称引力相互作用和强力、弱力 、电磁力合称4种基本相互作用。引力是其中最弱的一种,两个质子间的万有引力只有它们间的电磁力的1/1035 ,质子受地球的引力也只有它在一个不强的电场1000伏/米的电磁力的1/1010。因此研究粒子间的作用或粒子 在电子显微镜和加速器中运动时,都不考虑万有引力的作用 。一般物体之间的引力也是很小的,例如两个直径为 1米的铁球 ,紧靠在一起时 , 引力也只有2.83×10-4牛顿,相当于0.03克的一小滴水的重量 。但地球的质量很大,这两个铁球分别受到4×104牛顿的地球引力 。所以研究物体在地球引力场中的运动时,通常都不考虑周围其他物体的引力。天体如太阳和地球的质量都很大,乘积就更大,巨大的引力就能使庞然大物绕太阳转动。引力就成了支配天体运动的唯一的一种力。恒星的形成,在高温状态下不弥散反而逐渐收缩,最后坍缩为白矮星、中子星和黑洞 , 也都是由于引力的作用,因此引力也是促使天体演化的重要因素。
现代天文学理论认为,太阳系是由所谓的原始星云形成的,原始星云是一大片十分稀薄的气体云,50亿年前受某种扰动影响,在引力的作用下向中心收缩。经过漫长时期的演化,中心部分物质的密度越来越大,温度也越来越高,终于达到可以引发热核反应的程度,而演变成了太阳。在太阳周围的残余气体则逐渐形成一个旋转的盘状气体层,经过收缩、碰撞、捕获、积聚等过程,在气体层中逐步聚集成固体颗粒、微行星、原始行星,最后形成一个个独立的大行星和小行星等太阳系天体。
太阳系的几乎所有天体包括小行星都自转,而且是按照右手定则的规律自转,所有或者说绝大多数天体的公转也都是右手定则。为什么呢?太阳系的前身是一团密云,受某种力量驱使,使它彼此相吸,这个吸积过程,使密度稀的逐渐变大,这就加速吸积过程。原始太阳星云中的质点最初处在混沌状,横冲直闯,逐渐把无序状态变成有序状态,一方面,向心吸积聚变为太阳,另外,就使得这团气体逐渐向扁平状发展,发展的过程中,势能变成动能,最终整个转起来了。开始转时,有这么转的,有那么转的,在某一个方向占上风之后,都变成了一个方向,这个方向就是现在发现的右手定则,也许有其他太阳系是左手定则,但在我们这个太阳系是右手定则。地球自转的能量来源就是由物质势能最后变成动能所致,最终是地球一方面公转,一方面自转。
-------------------------------------
3点一线是为潮汐
潮汐
由于日、月引潮力的作用,使地球的岩石圈、水圈和大气圈中分别产生的周期性的运动和变化的总称。固体地球在日、月引潮力作用下引起的弹性—塑性形变,称固体潮汐,简称固体潮或地潮;海水在日、月引潮力作用下引起的海面周期性的升降、涨落与进退,称海洋潮汐,简称海潮;大气各要素(如气压场、大气风场、地球磁场等)受引潮力的作用而产生的周期性变化(如8、12、24小时)称大气潮汐,简称气潮。其中由太阳引起的大气潮汐称太阳潮,由月球引起的称太阴潮。因月球距地球比太阳近,月球与太阳引潮力之比为11:5,对海洋而言,太阴潮比太阳潮显着。地潮、海潮和气潮的原动力都是日、月对地球各处引力不同而引起的,三者之间互有影响。大洋底部地壳的弹性—塑性潮汐形变,会引起相应的海潮,即对海潮来说,存在着地潮效应的影响;而海潮引起的海水质量的迁移,改变着地壳所承受的负载,使地壳发生可复的变曲。气潮在海潮之上,它作用于海面上引起其附加的振动,使海潮的变化更趋复杂。作为完整的潮汐科学,其研究对象应将地潮、海潮和气潮作为一个统一的整体,但由于海潮现象十分明显,且与人们的生活、经济活动、交通运输等关系密切,因而习惯上将潮汐(tide)一词狭义理解为海洋潮汐。
❾ 算法复杂度是什么概念
同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。算法分析的目的在于选择合适算法和改进算法。一个算法的评价主要从时间复杂度和空间复杂度来考虑。
1、时间复杂度
(1)时间频度
一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)。
(2)时间复杂度
在刚才提到的时间频度中,n称为问题的规模,当n不断变化时,时间频度T(n)也会不断变化。但有时我们想知道它变化时呈现什么规律。为此,我们引入时间复杂度概念。
一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。
在各种不同算法中,若算法中语句执行次数为一个常数,则时间复杂度为O(1),另外,在时间频度不相同时,时间复杂度有可能相同,如T(n)=n2+3n+4与T(n)=4n2+2n+1它们的频度不同,但时间复杂度相同,都为O(n2)。
按数量级递增排列,常见的时间复杂度有:
常数阶O(1),对数阶O(log2n),线性阶O(n),
线性对数阶O(nlog2n),平方阶O(n2),立方阶O(n3),...,
k次方阶O(nk),指数阶O(2n)。随着问题规模n的不断增大,上述时间复杂度不断增大,算法的执行效率越低。
2、空间复杂度
与时间复杂度类似,空间复杂度是指算法在计算机内执行时所需存储空间的度量。记作:
S(n)=O(f(n))
说到底,就是程序执行效率和占用空间的问题.
❿ 什么是算法的复杂性
算法的复杂性主要包括两个内容:时间复杂度和空间复杂度;
(1)时间复杂度:表示算法运行时间的长短,主要和数据的规模、算法实现的效率有关,一般用O(n)来表示,n表示数据的规模大小。
(2)空间复杂度,主要是指算法实现所需占用内存空间的大小,一般用S(n)来表示。