(一)算法之时间复杂度理解

 我来答
科创17
2022-06-15 · TA获得超过5866个赞
知道小有建树答主
回答量:2846
采纳率:100%
帮助的人:169万
展开全部
前言

相信学过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 广告
通常情况下,我们会按照结构模型把系统产生的数据分为三种类型:结构化数据、半结构化数据和非结构化数据。结构化数据,即行数据,是存储在数据库里,可以用二维表结构来逻辑表达实现的数据。最常见的就是数字数据和文本数据,它们可以某种标准格式存在于文件... 点击进入详情页
本回答由光点科技提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式