数据结构与算法——算法

  • 输入——一个算法有零个或多个输入,这些输入取自与某个特定的对象的集合
  • 输出——一个算法有一个或多个的输出,这些输出是同输入有着某些特定关系的量

🚀算法的设计(要点)

通常一个好的算法有以下要求:

1.正确性,算法应该能够正确地解决求解问题

2.可读性,算法主要是为了让人阅读和交流,其次才是机器执行。可读性好有助于人对算法的理解;晦涩难懂的程序易于隐藏较多的错误,难以调试和修改。

3.健壮性,当输入非法时,算法也能适当地做出反应或进行处理,而不会产生莫名其妙的输出结果

4.高效率与低存储量需求,效率指的是算法执行的时间,对于同一个问题如果有多个算法可以解决,执行时间短的算法效率高。存储量需求指算法执行过程中所需要的最大存储空间。效率与低存储量需求这两者都与问题的规模有关

📌注:算法是可以用伪代码描述


🚀算法效率的度量

算法执行的时间需要通过依据该算法编制的程序在计算机上运行时所消耗的时间来度量。度量一个程序的执行时间通常有两种方法

🚢事后统计法

因为很多计算机内部都有计时功能,有的甚至可精确到毫秒级,不同算法的程序可通过一组或若干组相同的统计数据以分辨优劣,但这种方法有两个缺陷:一个是必须先运行依据算法编制的程序;另一个是所得时间的统计量依赖于计算机的硬件、软件等环境因素,有时容易掩盖算法本身的优劣

🚢事前分析估算法

📌一个用高级程序语言编写的程序在计算机上运行时所消耗的时间取决于下列因素:

  • 依据的算法选用何种策略
  • 问题的规模
  • 书写程序的语言,对于同一个算法,实现语言的级别越高,执行效率就越低
  • 编译程序所产生的机器代码的质量
  • 机器执行指令的速度

所以说,同一个算法用不同的语言实现,或者用不同的编译程序进行编译,或者在不 同计算机上运行时,效率均不相同。

一个算法是由 控制结构(顺序、分支和循环三种)和原操作(指固有的数据类型的操作) 构成的,则算法时间取决于两者的综合效果。为了便于比较同一问题的不同算法,通常做法是,从算法中选取一种对于研究的问题(或是算法类型)来说是基本操作的原操作,以该基本操作重复执行的次数作为算法的时间量度

👻时间复杂度

一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数f(n),算法的时间度量记作:

📌 T ( n ) = O ( f ( n ) ) T(n) = O(f(n)) T(n)=O(f(n))

它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称为时间复杂度

所以说,被称为问题的基本操作的元操作应是其重复执行次数和算法的执行时间成正比的原操作,多数情况下它是最深层循环内的语句中的原操作。它的执行次数和包含语句的频度相同。

📌注:语句的频度指的是该语句重复执行的次数

根据输入数据的特点,时间复杂度具有最差平均最佳三种情况,一般我们考虑的时间复杂度都是最坏的那种情况,最坏时间复杂度是包含于最好、和平均两种情况的。

常见种类:
在这里插入图片描述
根据从大到小,常见的算法时间复杂度主要有:

📌 O ( 1 ) < O ( l o g ₂ n ) < O ( n ) < O ( n l o g ₂ n ) < O ( n ² ) < O ( n ³ ) < O ( 2 ⁿ ) < O ( n ! ) < O ( n ⁿ ) O(1)<O(log₂n)<O(n)<O(nlog₂n)<O(n²)<O(n³)<O(2ⁿ)<O(n!)<O(nⁿ) O(1)<O(log₂n)<O(n)<O(nlog₂n)<O(n²)<O(n³)<O(2ⁿ)<O(n!)<O(nⁿ)

实例一:

void speaker(int n){
  int i = 1;
  while(i<=n){
    i = i* 2;   //每次翻倍
    printf("我真的会谢 %d\n", i);
  }
  printf("我是真的栓Q %d\n", n);
}


时间复杂度:

📌 T ( n ) = O ( x ) = O ( l o g ₂ n ) T(n) = O(x) = O(log₂n) T(n)=O(x)=O(log₂n)

实例二:

void speaker(int flag[], int n){  //n为问题规模
  printf("你今天好吗? \n");
  for(int i=0; i<n; i++){   //从第一个元素查找
    if(flag[i]==n){   //找到元素n
      printf("我很好 %d\n", n);
      break;
    }
  }
}

//flag数组中乱序存放了1~n这些数
int flag[n] = {1.......n};
speaker(flag, n)


时间复杂度:

  • 最好情况:元素n在第一个位置(T(n) = O(1))
  • 最坏情况:元素n在最后一个位置(T(n) = O(n))
  • 平均情况:假设元素n在任意一个位置的概率相同为1/n(T(n) = O(n))

由于算法的时间复杂度考虑的只是对于问题规模n的增长率,则在难以精确计算基本操作执行次数(或语句频度)的情况下,只需求出它关于n的增长率或阶即可

👻空间复杂度

类似于算法的时间复杂度,我们还需要掌握的是算法的空间复杂度,其中n为问题的规模(或大小)

📌 S ( n ) = O ( f ( n ) ) S(n) = O(f(n)) S(n)=O(f(n))

空间复杂度涉及的空间类型有:

  • 输入空间: 存储输入数据所需的空间大小;
  • 暂存空间: 算法运行过程中,存储所有中间变量和对象等数据所需的空间大小;
  • 输出空间: 算法运行返回时,存储输出数据所需的空间大小;

💻总结

以上就是对数据结构与算法中算法的一些介绍和理论知识,算法的时间复杂度和空间复杂度是评判一个程序设计是否高效合理的一种方式,在往后的数据结构中,对数据的操作都要考虑到该算法的时间复杂度和空间复杂度。

题外话

初入计算机行业的人或者大学计算机相关专业毕业生,很多因缺少实战经验,就业处处碰壁。下面我们来看两组数据:

  • 2023届全国高校毕业生预计达到1158万人,就业形势严峻;
  • 《新职业在线学习平台发展报告》 ,显示国内Python人才缺口高达40万,而人工智能人才目前缺口超过500万。

在这个大数据的时代,你要想走在潮流前端,就必须要学习前沿有用的知识。而今人工智能和数据分析爆发,python就是一颗冉冉升起的新星,学好 Python 不论是就业还是做副业赚钱都不错。

全球知名TIOBE编程语言社区发布了2023年最新的编程语言排行榜。我们一起来看看
在这里插入图片描述

目前来学的人群分为以下几类:

第一类:入行编程新手:大学刚毕业或者其他行业转岗,想从事编程开发的工作,目前认为Python比较火,想入行;Python简单易学,非常适合新手入门。

第二类:Linux系统运维人员:Linux运维以繁杂著称,对人员系统掌握知识的能力要求非常高,那么也就需要一个编程语言能解决自动化的问题,Python开发运维工作是首选,Python运维工资的薪资普遍比Linux运维人员的工资高。

第三类:做数据分析或者人工智能:不管是常见的大数据分析或者一般的金融分析、科学分析都比较大程度的应用了数据分析,人工智能的一些常见应用也使用了Python的一些技术。

第四类:在职程序员转Python开发:平常只关注div+css这些页面技术,很多时候其实需要与后端开发人员进行交互的,现在有很多Java程序在转到Python语言,他们都被Python代码的优美和开发效率所折服。

第五类:其他:一些工程师以前在做很多SEO优化的时候,苦于不会编程,一些程序上面的问题,得不到解决,只能做做简单的页面优化。现在学会Python之后,你和我一样都可以编写一些查询收录,排名,自动生成网络地图的程序,解决棘手的SEO问题。

当然,这里总结的只是常见的一些情况,关于职业和岗位。

Python的优点:

  • 易于学习:简单、易学、对新手极度友好。
  • 免费开源:Python的所有内容都是免费开源的,不需要花一分钱就可以免费使用Python,并且可以自由地发布这个软件的拷贝、阅读其源代码、对其做改动、把其一部分用于新的自由软件中;
  • 可扩展:Python除了使用Python本身编写外,还可以混合使用像C语言、Java语言等编写;

对于0基础小白入门:

如果你是零基础小白,想快速入门Python是可以考虑的。
一方面是学习时间相对较短,学习内容更全面更集中。
二方面是可以找到适合自己的学习方案

做了那么多年开发,自学了很多门编程语言,我很明白学习资源对于学一门新语言的重要性,这些年也收藏了不少的Python干货,对我来说这些东西确实已经用不到了,但对于准备自学Python的人来说,或许它就是一个宝藏,可以给你省去很多的时间和精力。

别在网上瞎学了,我最近也做了一些资源的更新,只要你是我的粉丝,这期福利你都可拿走。

我先来介绍一下这些东西怎么用,文末抱走。


(1)Python所有方向的学习路线(新版)

这是我花了几天的时间去把Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

最近我才对这些路线做了一下新的更新,知识体系更全面了。

在这里插入图片描述

(2)Python学习视频

包含了Python入门、爬虫、数据分析和web开发的学习视频,总共100多个,虽然没有那么全面,但是对于入门来说是没问题的,学完这些之后,你可以按照我上面的学习路线去网上找其他的知识资源进行进阶。

在这里插入图片描述

(3)100多个练手项目

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了,只是里面的项目比较多,水平也是参差不齐,大家可以挑自己能做的项目去练练。

在这里插入图片描述

(4)200多本电子书

这些年我也收藏了很多电子书,大概200多本,有时候带实体书不方便的话,我就会去打开电子书看看,书籍可不一定比视频教程差,尤其是权威的技术书籍。

基本上主流的和经典的都有,这里我就不放图了,版权问题,个人看看是没有问题的。

(5)Python知识点汇总

知识点汇总有点像学习路线,但与学习路线不同的点就在于,知识点汇总更为细致,里面包含了对具体知识点的简单说明,而我们的学习路线则更为抽象和简单,只是为了方便大家只是某个领域你应该学习哪些技术栈。

在这里插入图片描述

(6)其他资料

还有其他的一些东西,比如说我自己出的Python入门图文类教程,没有电脑的时候用手机也可以学习知识,学会了理论之后再去敲代码实践验证,还有Python中文版的库资料、MySQL和HTML标签大全等等,这些都是可以送给粉丝们的东西。

在这里插入图片描述

这些都不是什么非常值钱的东西,但对于没有资源或者资源不是很好的学习者来说确实很不错,你要是用得到的话都可以直接抱走,关注过我的人都知道,这些都是可以拿到的。

  • 25
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值