上图对应的是算法复杂度的图片,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

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

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

  1. 一文带你了解算法复杂度O(1),O(n),O(logn),O(nlogn)的含义

    详解O(1),O(n),O(logn),O(nlogn)的区别 相信很多开发的同伴们在研究算法.排序的时候经常会碰到O(1),O(n),O(logn),O(nlogn)这些复杂度,看到这里就会有个疑惑 ...

  2. perl数组硬引用_Perl 继续前行,Perl 7 将是下一代(硬核老王点评版)

    它是默认带有现代行为的 Perl 5,将为以后更大的变化奠定基础. 来源:https://linux.cn/article-12349-1.html 作者:Brian D Foy 译者:Xingyu. ...

  3. 【老王的脑科学谬论】CSDN问答区老王谬论悬赏辩论赛二番战(再次求锤失败4月6日已结题)

    问题地址: [悬赏讨论(辩论)]愚人节应个景,再次拿出民科谬论并悬赏1000元求锤!尽管本次悬赏辩论赛热度一路飙升,多日雄踞CSDN问答区热门榜TOP 1 并且迎来四十余位网友参与回复和辩论,但依然以 ...

  4. 一个老王开枪案例带你一步一步领略程序开发的魅力

    一.前言 我身边的很多同学都认为学计算机专业的人,代码写的好很正常,认为自己不是学计算机专业的,不会写代码很正常,或者这么说,觉得会写代码是一种天赋.其实不然,我们现在必须要清楚当代社会的局势,当代社 ...

  5. 不讲一点数学知识,步步图解条理清晰,手把手带你理解DBSCAN算法

    不讲一点数学知识,步步图解条理清晰,手把手带你理解DBSCAN算法 DBSCAN(Density-Based Spatial Clustering of Applications with Noise ...

  6. 苹果自带相册打马赛克_老王被绿?iOS 13惊现漏洞,马赛克去除

    iOS 13 首先教长得说明下,虽然此文章的标题有些"标题党"的感觉,但相比之下还是比较贴切内容的,具体各位看后再置评 事情的起因来自于 iOS 13 的一个小漏洞,可谓劲爆.近日 ...

  7. 5分钟带你理解一致性Hash算法

    转载自 5分钟带你理解一致性Hash算法 一致性Hash算法背景 一致性哈希算法在1997年由麻省理工学院的Karger等人在解决分布式Cache中提出的,设计目标是为了解决因特网中的热点(Hot s ...

  8. 自动驾驶决策规划算法第一章笔记 忠厚老实的老王

    第一章 自动驾驶决策规划算法数学基础 第一节:决策规划算法的地位和作用 该笔记来自b站up主(偶像):憨厚老实的老王视频链接主页 第二节:为什么规划中经常见到五次多项式

  9. 机器学习分类算法_达观数据:5分钟带你理解机器学习及分类算法

    1.本文介绍内容:什么是机器学习,机器学习有哪些分类算法,分类算法之k-近邻,决策树,随机森林2.本文适合人群:本文通过通俗易懂的语言和例子介绍核心思想,不拽高大上的名词,适合于不懂机器学习的小白3. ...

最新文章

  1. 独家 | 在树莓派+Movidius NCS上运用YOLO和Tiny-YOLO完成目标检测(附代码下载)
  2. Arduino门禁人机接口调试 Version 1.0
  3. 并发编程-04线程安全性之原子性Atomic包的4种类型详解
  4. javascript学习总结1
  5. java 转jsp_【转】JSP三种页面跳转方式
  6. html留言回复评论页面模板,HTML5实现留言和回复的页面样式
  7. android 手机壁纸源码,Android工程实现换壁纸功能【附源码】
  8. 在java中8421_JAVA常量介绍
  9. 解决在linux环境下面不显示验证码的问题
  10. qt 程序异常结束。_软件特攻队|VLC-Qt,功能齐全的跨平台多媒体开发利器
  11. 戴尔电脑开机黑屏怎么办_电脑黑屏开不了机怎么办
  12. 全面讲解在BIOS设置IDE设备的多种组合方式
  13. SqlParameter的使用
  14. 简历编辑导出工具(类似wps简历助手)
  15. 超大流量分布式系统架构解决方案
  16. 堆积图--MatplotLib
  17. 中医药天池大数据竞赛——中医文献问题生成挑战(三)
  18. 【造数】利用Python快速生成测试数据
  19. Si523超低功耗带自动寻卡13.56MHz非接触式读写器 替代MFRC523
  20. 赵鑫:强化学习在京东广告序列推荐中的应用

热门文章

  1. XP系统中没有Internet信息服务windows组件解决办法
  2. 给要学习.NET(c#语言)的新手一些学习方法
  3. 【Django】数据库主从配置
  4. c语言指针数组课件,C语言指针与数组教程课件.ppt
  5. xcode8 快捷键失效
  6. 操作系统中常见的进程调度算法
  7. [NOI2019]回家路线
  8. 随堂小测冲刺.第19天
  9. 2019春第六周编程总结
  10. QT - 内存泄漏检测