logn的算法
A. 严蔚敏老师的《数据结构》里,关于时间复杂度的写法,譬如logn,这个对数函数的底数是多少啊
算法中log级别的时间复杂度都是由于使用了分治思想,这个底数直接由分治的复杂度决定。如果采用二分法,那么就会以2为底数,三分法就会以3为底数,其他亦然。不过无论底数是什么,log级别的渐进意义是一样的。也就是说该算法的时间复杂度的增长与处理数据多少的增长的关系是一样的。
(1)logn的算法扩展阅读:
时间复杂度的计算方法
(1)一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得T(n)/f(n)的极限值(当n趋近于无穷大时)为不等于零的常数,则称f(n)是T(n)的同数量级函数。
记作T(n)=O(f(n)),称O(f(n))
为算法的渐进时间复杂度,简称时间复杂度。
(2)在计算时间复杂度的时候,先找出算法的基本操作,然后根据相应的各语句确定它的执行次数,再找出 T(n) 的同数量级。
(3)在pascal中比较容易理解,容易计算的方法是:看看有几重for循环,只有一重则时间复杂度为O(n),二重则为O(n^2),依此类推,如果有二分则为O(logn),二分例如快速幂、二分查找,如果一个for循环套一个二分,那么时间复杂度则为O(nlogn)。
B. log怎么计算
如果a的x次方等于N(a>0,且a不等于1),那么数x叫做以a为底N的对数(logarithm),记作x=logaN。其中,a叫做对数的底数,N叫做真数。
计算方式:
根据2^3=8,可得log2 8=3。
(2)logn的算法扩展阅读:
推导公式
log(1/a)(1/b)=log(a^-1)(b^-1)=-1logab/-1=loga(b)
loga(b)*logb(a)=1
loge(x)=ln(x)
lg(x)=log10(x)
求导数
(xlogax)'=logax+1/lna
其中,logax中的a为底数,x为真数;
(logax)'=1/xlna
特殊的即a=e时有
(logex)'=(lnx)'=1/x[4]
C. 时间复杂度log怎么算
如果程序运行的规模,每执行一次的规模是按等比例规模降低的,那么这个算法的时间复杂度就是logn的。
D. 几个数学证明题,关于log的计算,求解答,高分悬赏
你就记住一点,任何大于0的n 取了log之后,就再也无法和之前的自己n平起平坐,哪怕是n的delta次方,delta特别小。因为考虑从f(n) = n^a - logn 求导得f‘(n) = a*n^(a-1)-1/n = (a*n^a - 1)/n 所以当n很大很大的时候a*n^a 一定是大于1的,所以导函数大于0,函数递增到没有尽头,从而n^a 把 logn 远远甩在身后。
所以(a) 两边取log得到 logn平方 vs n*loglogn 有n的完胜,右赢
(b) klogn vs logn的k次方 这个很显然k是0或是负,都是klogn负 ,logn的k次方正,没得比;
其次两边取log变成logk + loglogn vs k*loglogn 所以当k在0,1之间,左赢;k=1,打平;k>1 右赢
(c) (logn)!是个啥。。暂且当logn后取整数部分。 网络一下stirling公式,换成等价形式两边取log
变成logn * logloglogn vs ... 总之右边有n,右边完胜。
(d) 还是stirling,n^n vs sqrt(2*pi*n)/exp(n) * n^n 这个sqrt(2*pi*n)/exp(n) 显然比1要小,左胜
E. 数学中的logn是怎么回事来着哪位数学大神解释一下,工作好多年这些东西忘光了
log是对数函数
[1]对数的定义:一般地,如果ax=N(a>0,且a≠1),那么数x叫做以a为底N的对数,记作x=logaN,读作以a为底N的对数,其中a叫做对数的底数,N叫做真数。对数函数:一般地,函数y=logax(a>0,且a≠1)叫做对数函数,也就是说以幂为自变量,指数为因变量,底数为常量的函数,叫对数函数。其中x是自变量,函数的定义域是(0,+∞)。它实际上就是指数函数的反函数,可表示为x=ay。因此指数函数里对于a的规定,同样适用于对数函数。“log”是拉丁文logarithm(对数)的缩写,读作:[英][lɔɡ][美][lɔɡ, lɑɡ]。求采纳 谢谢F. 算法时间复杂度比较:根号n与logn相比哪个更优优多少试根据下图猜想其算法
米勒罗宾是logn的算法,但是实际应用上它并不稳定,一般在范围较大(int64范围)才会用,一般的情况用的都是sqrt(n)的算法,但是在需要判断大量素数的情况下(假设判断次数为m),一般是比较m*sqrt(n)和n的大小,如果前者小就暴力判断,否则用筛法会更快。
然后比较,在不考虑常数的情况下是logn更优,但是算法常数导致在数据较小的一些情况下sqrt(n)反而更快。
第一个根号n的:
#include<cmath>
inlineboolisPrime(intx){
if(x==2){returntrue;}
if(x<2){returnfalse;}
intpos=int(sqrt(x))+1;
for(inti=2;i<=pos;++i){
if(x%i==0){returnfalse;}
}
returntrue;
}
然后logn的米勒罗宾你可以看下博客网页链接
然后提供一个筛法的代码(stl版本)
#include<vector>
boolvis[MAXNUM];//MAXNUM就是最大数字
std::vector<int>primes;//储存素数
inlinevoidgetPrimes(intmaxn){
for(inti=2;i<=maxn;++i){
if(!vis[i]){primes.push_back(i);}
for(size_tj=0;j<primes.size()&&primes[j]*i<=maxn;++j){
vis[primes[j]*i]=true;
}
}
}
实际应用一般用筛法或者sqrt(n)算法,只有大数据才会用米勒罗宾
G. 关于log的公式
当a>0且a≠1时,M>0,N>0,那么:
(1)log(a)(MN)=log(a)(M)+log(a)(N);
(2)log(a)(M/N)=log(a)(M)-log(a)(N);
(3)log(a)(M^n)=nlog(a)(M) (n∈R)
(4)log(a^n)(M)=1/nlog(a)(M)(n∈R)
(5)换底公式:log(A)M=log(b)M/log(b)A (b>0且b≠1)
(6)a^(log(b)n)=n^(log(b)a) 证明: 设a=n^x则a^(log(b)n)=(n^x)^log(b)n=n^(x·log(b)n)=n^log(b)(n^x)=n^(log(b)a)
(7)对数恒等式:a^log(a)N=N; log(a)a^b=b
(8)由幂的对数的运算性质可得(推导公式)
1.log(a)M^(1/n)=(1/n)log(a)M , log(a)M^(-1/n)=(-1/n)log(a)M
2.log(a)M^(m/n)=(m/n)log(a)M , log(a)M^(-m/n)=(-m/n)log(a)M
3.log(a^n)M^n=log(a)M , log(a^n)M^m=(m/n)log(a)M
4.log(以 n次根号下的a 为底)(以 n次根号下的M 为真数)=log(a)M , log(以 n次根号下的a 为底)(以 m次根号下的M 为真数)=(n/m)log(a)M
5.log(a)b×log(b)c×log(c)a=1
H. 最近在研究算法,书上一直说时间是O(logn),但是没有明确说logn的底是什么,这样理解是否准确
从理论上,无论低是什么都无关紧要,因为不同底的logn之间只存在常数倍的关系,这与n无关,不会影响复杂度的大小。
I. 1+3.23logN怎么算来的
log即以10为底的对数
如N=50,则log50=log(100/2)=log100-log2=2-log2=2-0.301=1.699
1+3.23log50=1+3.23×1.699=6.48777
若N=100,则1+3.23log100=1+3.23×2=7.46
J. 最近在研究算法,书上一直说时间是O(logn),但是没有明确说logn的底是什么,所以请教一下,谢谢
从我的理解上来说,我们先考虑O(logx(n))和O(logy(n)),x!=y,我们是在考虑n趋于无穷的情况。
求当n趋于无穷大时logx(n)/logy(n)的极限可以发现,极限等于lny/lnx(用一次洛必达可求得),也就是一个常数,也就是说,在n趋于无穷大的时候,这两个东西仅差一个常数。
所以从研究算法的角度log的底数不重要。
最后,结合上面,我来说一下关于大O的定义(我使用的是算法导论28页的定义),注意把这个定义和高等数学中的极限部分做比较,我们显然可以发现,这里的定义正是体现了一个极限的思想,假设我们将n0取一个非常大的数字,显然,当n大于n0的时候,我们可以发现任意底数的一个对数函数其实都相差一个常数倍而已。所以书上说写的O(logn)已经可以表达所有底数的对数了,就像O(n^2)一样。
没有非常严格的证明,不过我觉得这样说比较好理解,如果你有兴趣证明,完全可以参照高数上对极限趋于无穷的证明,希望你能理解。