算法复杂度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怎么算
如果程序运行的规模,每执行一次的规模是按等比例规模降低的,那么这个算法的时间复杂度就是logn的。
C. 算法时间复杂度比较:根号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)算法,只有大数据才会用米勒罗宾
D. 电脑编程中快速排序的时间复杂度n log n 是n*log(n)还是什么
复杂度的表示式里面只看幂级不看具体底数,log n跟log2n是一回事,感觉你有些概念不清的样子,时间复杂度的n就表示算法处理的数字个数,快速排序的时间复杂度就是n log n,快速排序10个数的时间复杂度也还是n log n,你可以说n=10,但是时间复杂度的表示式里面要求把具体的输入个数用n表示,因为这样才能反映出算法在输入个数增加的时候运行时间相应增加的程度,也就是“时间复杂度”这个概念本身想说明的问题。