老王带你理解算法复杂度O(1),O(N),O(N^2)

上图对应的是算法复杂度的图片,X轴对应的是n(问题规模),Y轴对应的是执行的运行时间。

 

我们先从简单的复杂度解读O(1)

从上面的图片我们可以看到O(1)的复杂度是恒定的,一点波澜都没有,什么是O(1)呢,就比如你是一个酒店的管理员,你负责管理酒店的钥匙,你很聪明,你把酒店的100把钥匙放在了100个格子里面存着,并且把格子从1~100进行了编号,有一天有客人来了,酒店老板说,给我拿10号房间的钥匙给我,你迅速从10号格子里面拿出钥匙给老板,速度非常快,这时候你就是一个电脑了,老板跟你说拿几号房房间的钥匙,你只需要看一眼就能知道钥匙在哪里。

存放钥匙的格子

对应代码里面可以是这样的语句

#include <stdio.h>
void main(void)
{int i = 0;i = 1;i = 3;
}

 

然后我们说一下O(n)

突然,有一天,你的老板给你说,老王啊,你用100个箱子存100把钥匙,太浪费空间了,你能补能把钥匙上编号一下,然后把钥匙要用绳子穿起来,这样我们可以把这个放箱子的地方再装修一个房间出来。你想了一下,是啊,现在房价这么贵,这样能多赚点钱。

所以你就不能通过上面的方法来找到钥匙了,老板跟你说,老王啊,给我拿45号房间的钥匙出来,你就需要从100个钥匙里面挨个找45个房间的钥匙。

O(n)是随着样本数增加复杂度按指数增加的,如果你的酒店老板把酒店的房间增加到一万个,然后有一天,老外不小心把穿钥匙的绳子弄断了,我了个叉叉叉,这时候老板说,老王快把98号房间的钥匙给我,老王惨爆了~~~我们假设如果老王的老板酒店有两万个房间呢?

for(int i = 1; i<=100: i++)
{if(i == 45) printf("Find it\n");
}

 

继续说一下O(n^2)

随着经济发展越来越好,你的老板把酒店扩大了,有100层每一层有100个房间,当然,你还是你,老王还是老王,工资并没有涨,你因为关注了公众号嵌入式Linux,知道怎么把钥匙排序更好了,你把每一层的钥匙穿在一起,然后一共就有100个用绳子穿起来的钥匙串。

然后老板叫你找钥匙的时候,你先要找到楼层的编号,再对应找到房间的编号,所以大概对应的是这样的代码。

#include <stdio.h>
int main ()
{int key;int array[100][100];for(int i=1;i<100;i++)for(int j=1;j<100;j++)array[i][j] = i*100 +j;scanf("%d",&key);for(int i=1;i<100;i++)for(int j=1;j<100;j++)if(array[i][j] == key)printf("FIND KEY\n");return 0;
}

这个可以看是O(N^2) +O(N^2) = O(2*N^2) 把常数去掉变成O(N^2)

 

最后我们解读一下O(log^n)

这个就像是有一百把钥匙,老王在关注公众号后学了不少东西,老王突然觉得,我从头找是不是太慢了,我从中间找,比如我要找到23号的房间钥匙,我从中间切开,找到50编号的位置,然后23在1~50里面,我再把从中间切开变成25,然后23在1~25之间,我再切开变成12.5,然后23在12.5~25之间,依次找下去,直到找到钥匙。这种查找钥匙的方法的复杂度就是O(log^n)

#include <stdio.h>
/***  折半查找函数**  @param arr   数组*  @param len   数组长度*  @param value 查找元素**  @return 返回查找元素的位置*/
int searchItem(int arr[],int len, int value){int low = 0,high = len-1,mid;while (low <= high) {mid = (low + high)/2;if (value > arr[mid]) {low = mid+1;}else if (value < arr[mid]){high = mid - 1;}else{return mid;}}return -1;
}int main(int argc, const char * argv[]) {//数组必须是有序数组int a[10] = {1,2,31,45,52,62,73,86,90,100};//查找86元素int l = searchItem(a,10,86);printf("loc = %d\n",l);return 0;
}

我们知道了O(log^n)可以类推出O(nlog^n)

后话

随着工作时间的推移,发现掌握一种思维远远胜过掌握一种单纯的技能,就比如C语言知识一种工具,C++也是一种工具,不要沉迷于一种工具或者“武功”不能自拔,要修炼自己的思维,以无招胜有招,举个栗子,下雨天的时候,我喜欢开玛莎拉蒂去上班能挡风遮雨,不下雨的时候我喜欢开我的小毛驴去上班不堵车更快,这样更方便,各有各的专长和不足,当然对于某些公司把某种编程语言看得非常重要的,我觉得也是值得商榷的。人无完人,我们不可能把所有武功都学会了再去打天下,而是有了自己的专长,对问题有了自己的见解,就可以去做很多事情了。

不足之处,后面再补充

欢迎关注微信公众号-嵌入式Linux

觉得不错,请帮忙转发,点赞,您的每一次支持,我都将铭记于心

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/468883.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【PyAutoGUI操作指南】05 屏幕截图与图像定位:截图+定位单个目标+定位全部目标+灰度匹配+像素匹配+获取屏幕截图中像素的RGB颜色

6 屏幕截图与图像定位 PyAutoGUI可以拍摄屏幕截图&#xff0c;将其保存到文件中&#xff0c;并在屏幕中定位图像。OSX使用操作系统附带的screencapture命令。Linux使用scrot命令&#xff0c;可以通过运行sudo-apt-get-install-scrot来安装该命令。 功能介绍&#xff1a;一个需…

C语言-数组a 和a 的区别

面试经典题目 #include "stdio.h"int main() {int a[5] { 1,2,3,4,5 };int *ptr (int *)(&a 1);printf("%d,%d", *(a 1), *(ptr - 1));/*getchar是用VS编写方便查看输出*/getchar();return 0; }请思考一下上面的输出结果&#xff0c;如果你非常自…

使用export/import导出和导入docker容器

1、导出容器如果要导出本地某个容器&#xff0c;可以使用 docker export 命令&#xff0c;导出容器快照到本地文件。$ sudo docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAM…

前端为什么有的接口明明是成功回调却执行了.catch失败回调_前端进阶高薪必看-手写源码篇(高频技术点)...

前言此系列作为笔者之前发过的前端高频面试整理的补充 会比较偏向中高前端面试问题 当然大家都是从新手一路走过来的 感兴趣的朋友们都可以看哈初衷我相信不少同学面试的时候最怕的一个环节就是手写代码 大家一定听过这句话talk is cheap, show me the code 没事 此文章不仅包含…

C/C++函数指针与指针函数

前面说的话 面试的时候&#xff0c;经常有面试官问这个问题&#xff0c;在Linux内核里面也是经常被使用的&#xff0c;在看很多大神的代码里面&#xff0c;我们也经常遇到函数指针与指针函数&#xff0c;一样&#xff0c;如果你自己没问题了&#xff0c;就不用往下看了。 定义…

ImportError: TensorBoard logging requires TensorBoard with Python summary writer installed.

Tensorboard原本是Google TensorFlow的可视化工具&#xff0c;可以用于记录训练数据、评估数据、网络结构、图像等&#xff0c;并且可以在web上展示&#xff0c;对于观察神经网络的过程非常有帮助。 项目场景&#xff1a; 突然报如下错误&#xff0c;我以为是环境坏掉了&#…

jsp人事管理系统_Jsp+Ssm+Mysql实现的医院人事管理系统源码附带视频运行教程

项目地址&#xff1a;jspssmmysql实现的医院人事管理系统源码附带视频运行教程|猿来入此【beta】多用户版IT项目教程源码分享网站​www.yuanlrc.com今天给大家演示的是一款由jspssm&#xff08;springspringMVCmybatis&#xff09;实现的医院人事管理系统&#xff0c;系统比较简…

CODVES 5929 亲戚

5929 亲戚 时间限制: 1 s空间限制: 128000 KB题目等级 : 黄金 Gold题目描述 Description若某个家族人员过于庞大&#xff0c;要判断两个是否是亲戚&#xff0c;确实还很不容易&#xff0c;现在给出某个亲戚关系图&#xff0c;求任意给出的两个人是否具有亲戚关系。 规定&#x…

深度学习·理论篇(2023版)·第001篇快速了解人工智能与Pytorch:机器/表示/深度学习定义+端到端的学习+神经网络在计算机视觉应用+深度学习的技术蓝图

💕恭喜本博客浏览量达到两百万,CSDN内容合伙人,CSDN人工智能领域实力新星~ 🧡本文章为2021版本迭代更新版本,在结合有效知识的基础上对文章进行合理的增加,使得整个文章时刻顺应时代需要 🧡本专栏将通过系统的深度学习实例,从可解释性的角度对深度学习的原理进行讲…

linux kernel编译 undefined reference to `__ae

问题代码 ktime_t calltime, delta, rettime;unsigned long long duration;calltime = ktime_get();/*获取当前时间*/ rettime = ktime_get(); /*计算时间差 ktime_sub(A,B) 计算A-B的时间差 返回纳秒*/ delta = ktime_sub(rettime,calltime); /*转换成微秒*/ duration = (unsi…

CodeForces - 796D Police Stations bfs

思路&#xff1a;删除尽量多的边使得所有点都能在限制距离之内到达一个警局&#xff0c;删除边会形成多棵子树&#xff0c;最多只能k棵。其实就是以每个警局为根结点&#xff0c;把整棵树划分为以警局为根结点的k棵树&#xff0c;说明要删除的边的数量就是k-1条&#xff0c;即删…

python中list函数中variables变量_如何在Python中使用变量,浅谈,Pytorch,的,Variable,方法...

Variable的基本概念autograd.Variable 是包的核心类。它包装了张量&#xff0c;并且支持几乎所有的操作。一旦你完成了你的计算&#xff0c; 就可以调用.backward() 方法来自动计算所有的梯度。你还可以通过.data 属性来访问原始的张量&#xff0c;而关于该 variable(变量)的梯…

深度学习·理论篇(2023版)·第002篇深度学习和计算机视觉中的基础数学知识01:线性变换的定义+基于角度的线性变换案例(坐标变换)+点积和投影+矩阵乘法的几何意义+图形化精讲

💕恭喜本博客浏览量达到两百万,CSDN内容合伙人,CSDN人工智能领域实力新星~ 🧡本文章为2021版本迭代更新版本,在结合有效知识的基础上对文章进行合理的增加,使得整个文章时刻顺应时代需要 🧡本专栏将通过系统的深度学习实例,从可解释性的角度对深度学习的原理进行讲…

RK3288/RK3399 CPU定频方法

直接上方法 查看cpu能支持的频率 cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies 写入userspace说明要用户设定频率 echo userspace > /sys/devices/system/cpu/cpufreq/policy0/scaling_governor 写入上面列出的cpu频率 echo 1608000 > …

notepad++正则表达式去掉关键字所在行

如下图 1、选择正则表达式 2、选择匹配大小写 3、^(.*)KERNEL(.*)$\n 加上\n就是把去除的行删除&#xff0c;不加就算把删除的行替换为空格

深度学习·理论篇(2023版)·第003篇深度学习和计算机视觉中的基础数学知识02:特征向量和特征值+矩阵乘法的几何意义(2)+奇异值分解+线性可分性和维度+非线性变换

&#x1f495;恭喜本博客浏览量达到两百万&#xff0c;CSDN内容合伙人&#xff0c;CSDN人工智能领域实力新星~ &#x1f9e1;本文章为2021版本迭代更新版本&#xff0c;在结合有效知识的基础上对文章进行合理的增加&#xff0c;使得整个文章时刻顺应时代需要 &#x1f9e1;本…

Oracle 控制文件管理

控制文件是一个很小的二进制文件(10MB左右)&#xff0c;含有数据库结构信息&#xff0c;包括数据文件和日志文件信息。控制文件在数据库创建时被自动创建&#xff0c;并在数据库发生物理变数时更新。控制文件被不断更新&#xff0c;在任何时候都要保证控制文件可用&#xff0c;…

数组超过预设的最大数组大小_工作表数组大小的扩展及意义

朋友们好&#xff0c;今日给大家继续讲解VBA数组与字典解决方案的第17讲&#xff0c;数组大小的扩充问题。这一讲的内容相对比较简单&#xff0c;在之前的章节中讲了数组与数组的计算规律&#xff0c;也是利用了数组的扩展原理。其实&#xff0c;两个数组计算时&#xff0c;参与…

Android ANR 实例分析

什么是ANR&#xff1f; 以下四个条件都可以造成ANR发生&#xff1a; InputDispatching Timeout&#xff1a;5秒内无法响应屏幕触摸事件或键盘输入事件BroadcastQueue Timeout &#xff1a;在执行前台广播&#xff08;BroadcastReceiver&#xff09;的onReceive()函数时10秒没…

python图像下采样_[Python图像处理]十二.图像向下取样和向上取样

图像向下取样在图像向下取样中&#xff0c;使用最多的是高斯金字塔。它将对图像Gi进行高斯核卷积&#xff0c;并删除图像中所有的偶数行和列&#xff0c;最终缩小图像&#xff0c;其中高斯卷积核运算就是对整幅图像进行加权平均的过程&#xff0c;每一个像素点的值&#xff0c;…