(一)算法之时间复杂度理解
1个回答
展开全部
前言
相信学过C语言的都知道算法:冒泡排序、选择排序、快速排序等等。
那么,关于时间复杂度O(n)、O(logn)这个概念应该怎么理解呢?
本篇为你讲述
正文
《数据结构》(严蔚敏、吴伟民编著)中有句话:“整个算法的执行时间与基本操作重复执行的次数成正比”,基本操作重复执行的次数是问题规模n的某个函数f(n),于是算法的时间量度可以记为:T(n) = O(f(n)) ,也就是算法之行时间,其中f(n)为T(n)的同数量级函数,即T(n)/f(n) = 常数。“语句频度”定义:该语句重复执行的次数。如果是基本操作所在语句重复执行的次数,那么就该是f(n)。
一、冒泡排序,时间复杂度为O(n^2).
为了理解,首先举个例子,for循环遍历一个长度为n的数组
for(int i = 0;i < n;i++) {
a[i] = 0; //重复操作执行n次
}
那么次循环的时间复杂度就是O(n),若是两层for循环
for(int i = 0;i < n;i++) {
a[i] = 0; //重复操作执行n次
for(int j = 0;j < n;j++){
b[i] = 1; //重复执行n^2次
}
}
那么此时T(n) = n + n^2,令f(n) = n^2, T(n)/f(n) = 1/n + 1;当n->∞,T(n)/f(n) =1为常数,则T(n) = O(n^2);
那么对于冒泡排序,就好理解了,两层for循环,时间复杂度为O(n^2)。同理,选择排序也是O(n^2)。
二、对于二分搜索,其时间复杂度为O(logn)。
二分搜索指的是对一个已经排好序的数组、先查找中间元素,如果中间元素小于要查找的值,则继续查找大于中间元素的那一部分。反正则查找小于中间元素,这样每次都能减少1/2的查找范围。
对于n个元素的数组进行二分搜索。
第一次二分查找剩下: n/2 个元素
第二次二分剩下:n/4个元素
第三次二分剩下:n/8个元素
第m次二分剩下:n/(2^m)个元素
在最坏情况下是在排除到只剩下最后一个值之后得到结果,所以为n/(2^m)=1; 则m = log2(n);
所以其时间复杂度为O(log2(n)).那么O(logn)是什么意思?log的底数为?
计算机思想中有一种叫做分治思想,即不管是二分还是三分、其次数和复杂度上只是一个常数上的差别。
例如 log3(n) / log2(n),根据数学换低公式, log3(n) / log2(n) = ln(n) / ln(3) * ln(2) / ln(n) = ln(2)/ln(3)为一个常数,当我们将n取一个非常大的数字,n->∞,我们可以发现任意底数的一个对数函数其实都相差一个常数倍而已。所以O(logn)已经可以表达所有底数的对数了。
总结:
计算时间复杂度,1,首先看有几重for循环,只有一重则时间复杂度为O(n),两重则为O(n^2),依次类推。2,如果有二分(或三分)则为O(logn),如果一个for循环套一个二分,那么时间复杂度为O(nlogn)。
相信学过C语言的都知道算法:冒泡排序、选择排序、快速排序等等。
那么,关于时间复杂度O(n)、O(logn)这个概念应该怎么理解呢?
本篇为你讲述
正文
《数据结构》(严蔚敏、吴伟民编著)中有句话:“整个算法的执行时间与基本操作重复执行的次数成正比”,基本操作重复执行的次数是问题规模n的某个函数f(n),于是算法的时间量度可以记为:T(n) = O(f(n)) ,也就是算法之行时间,其中f(n)为T(n)的同数量级函数,即T(n)/f(n) = 常数。“语句频度”定义:该语句重复执行的次数。如果是基本操作所在语句重复执行的次数,那么就该是f(n)。
一、冒泡排序,时间复杂度为O(n^2).
为了理解,首先举个例子,for循环遍历一个长度为n的数组
for(int i = 0;i < n;i++) {
a[i] = 0; //重复操作执行n次
}
那么次循环的时间复杂度就是O(n),若是两层for循环
for(int i = 0;i < n;i++) {
a[i] = 0; //重复操作执行n次
for(int j = 0;j < n;j++){
b[i] = 1; //重复执行n^2次
}
}
那么此时T(n) = n + n^2,令f(n) = n^2, T(n)/f(n) = 1/n + 1;当n->∞,T(n)/f(n) =1为常数,则T(n) = O(n^2);
那么对于冒泡排序,就好理解了,两层for循环,时间复杂度为O(n^2)。同理,选择排序也是O(n^2)。
二、对于二分搜索,其时间复杂度为O(logn)。
二分搜索指的是对一个已经排好序的数组、先查找中间元素,如果中间元素小于要查找的值,则继续查找大于中间元素的那一部分。反正则查找小于中间元素,这样每次都能减少1/2的查找范围。
对于n个元素的数组进行二分搜索。
第一次二分查找剩下: n/2 个元素
第二次二分剩下:n/4个元素
第三次二分剩下:n/8个元素
第m次二分剩下:n/(2^m)个元素
在最坏情况下是在排除到只剩下最后一个值之后得到结果,所以为n/(2^m)=1; 则m = log2(n);
所以其时间复杂度为O(log2(n)).那么O(logn)是什么意思?log的底数为?
计算机思想中有一种叫做分治思想,即不管是二分还是三分、其次数和复杂度上只是一个常数上的差别。
例如 log3(n) / log2(n),根据数学换低公式, log3(n) / log2(n) = ln(n) / ln(3) * ln(2) / ln(n) = ln(2)/ln(3)为一个常数,当我们将n取一个非常大的数字,n->∞,我们可以发现任意底数的一个对数函数其实都相差一个常数倍而已。所以O(logn)已经可以表达所有底数的对数了。
总结:
计算时间复杂度,1,首先看有几重for循环,只有一重则时间复杂度为O(n),两重则为O(n^2),依次类推。2,如果有二分(或三分)则为O(logn),如果一个for循环套一个二分,那么时间复杂度为O(nlogn)。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
光点科技
2023-08-15 广告
2023-08-15 广告
通常情况下,我们会按照结构模型把系统产生的数据分为三种类型:结构化数据、半结构化数据和非结构化数据。结构化数据,即行数据,是存储在数据库里,可以用二维表结构来逻辑表达实现的数据。最常见的就是数字数据和文本数据,它们可以某种标准格式存在于文件...
点击进入详情页
本回答由光点科技提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询