前言
进入代码世界已经有一阵了,C语言学的差不多了打算看看数据结构
以前都没想过我能学到这嘞哈哈哈哈
所以,《重生到现代之从零开始的数据结构生活》开始啦
数据结构
我们天天说数据结构怎么怎么了,那什么是数据结构你知道吗
数据结构(Data Structure)是计算机存储、组织数据的⽅式,指相互之间存在⼀种或多种特定关系的数据元素的集合
这么说可能有点抽象了,但是如果举一个例子:int arr[3]={0};
不就是数据元素的集合吗,没错,他就是数据结构的一种,不过我们会有很多更为复杂的情况,只要这种简单的肯定是不够的,这就是我们学习数据结构的原因
算法
算法(Algorithm):就是定义良好的计算过程,他取⼀个或⼀组的值为输⼊,并产⽣出⼀个或⼀组值作为 输出。简单来说算法就是⼀系列的计算步骤,⽤来将输⼊数据转化成输出结果。
简单来说就是我们写的每一个成熟的代码,都是某种算法
但是我对他的了解也不深,所以只能讲解到这了
复杂度
之前在牛客上面刷题的时候,我写的代码就经常和讨论区的不一样
我的代码就会很复杂,逻辑也会很冗杂
但是当时的我并不care,想着把题目完成就行了,管他这么多,反正又不是我算
等到我打开一些对复杂度有要求的的题的时候我就懵了
不是哥们,我咋写代码你也管啊
至于那他怎么管,用什么管,管的标准是什么
让我们看看复杂度吧
算法在编写成可执⾏程序后,运⾏时需要耗费时间资源和空间(内存)资源 。因此衡量⼀个算法的好坏,⼀般是从时间和空间两个维度来衡量的,即时间复杂度
和空间复杂度
。
时间复杂度主要衡量⼀个算法的运⾏快慢,⽽空间复杂度主要衡量⼀个算法运⾏所需要的额外空间
其实从开始我说的大家也能看出来,有很多的地方都有在使用复杂度这一概念
在时间复杂度和空间复杂度中,由于现代科技的发达,让我们对空间的要求没有这么高.
时间复杂度
在计算机科学中,算法的时间复杂度是⼀个函数式T(N),它定量描述了该算法的运⾏时间
实际上空间复杂度是在描述程序的时间效率,因为没有固定的时间,运行的时间可能会随着环境,cpu,内存等因素改变,所以主要算的就是运行的效率
时间复杂度的计算
计算复杂度的时候,我们不能精确的算出来程序执行的次数,因为很麻烦,所以我们只需要算出大概的执行次数然后比较他们执行次数的量级就行了
执行次数就是程序运行了多少次,程序没运行一次都算
复杂度的表⽰通常使⽤⼤O的渐进表示法
大O的渐进表示法
⼤O符号(Big O notation):是⽤于描述函数渐进⾏为的数学符号
大O的规则
- 时间复杂度函数式T(N)中,只保留最⾼阶项,去掉那些低阶项,因为当N不断变⼤时, 低阶项对结果影响越来越⼩,当N⽆穷⼤时,就可以忽略不计了
- 如果最⾼阶项存在且不是1,则去除这个项⽬的常数系数,因为当N不断变⼤,这个系数 对结果影响越来越⼩,当N⽆穷⼤时,就可以忽略不计了
- T(N)中如果没有N相关的项⽬,只有常数项,⽤常数1取代所有加法常数
举个例子
void Func2(int N)
{
int count = 0; //1(后面的数字就是运行的次数)
for (int k = 0; k < 2 * N ; ++ k)
{
++count; //2n
}
int M = 10; //1
while (M--)
{
++count;//10
}
printf("%d\n", count);//1
T (N) = 2N + 13
但是根据大O渐进表示法来看
时间复杂度就是:O(N)
这就是时间复杂度计算的过程
空间复杂度
至于空间复杂度和时间复杂度的算法一样,就不过多叙述
今天的知识讲解完啦,如果觉得有用可以点一下赞和关注,也可以先收藏以防需要时找不到哦,当然如果作者写的哪里有问题欢迎指出,我们一起进步!!!
祝看到这里的人天天开心哦(笔芯)