【数据结构】——入门

structure

算法基础

算法的特性:

  • 输入输出算法具有零个或者多个输入,同时,算法具有至少一个的输出。

  • 确定性算法的每一步都具有确定的含义,无二义性

  • 有穷性每个算法需要在有穷的时间内完成

  • 可行性一个算法是可以被执行的

算法设计要求

  • 正确性能够满足预先指定的功能与性能的需求

  • 健壮性当输入数据不合法时,算法也能做出相关的处理

  • 可读性算法是可以阅读,理解和交流的

  • 耗时低、占空间小能够更少的使用时间和空间达成我们的目标

数据结构基础

基本概念

  • 数据:信息载体

  • 数据元素:数描述数据的基本单元,一个数据元素有若干个数据项组成

  • 数据项:是描述数据的最小单位

  • 数据对象:性质相同的一类数据元素的集合,是数据的一个子集

  • 数据结构:指数据和关系的集合

四大逻辑结构

  • 集合结构:所有数据元素除了同属于一个集合外

  • 显性结构

  • 树形结构

  • 图形结构

复杂程度

时间、空间复杂度定义

  • 时间复杂度
    时间复杂度表示一个程序运行所需要的时间,但是我们并不需要一个具体的时间,而是时间频度T(n),n称为问题的规模

  • 空间复杂度
    空间复杂度是指运行完一个程序所需内存的大小,包括:固定部分、可变部分

    • 固定部分:
      指令空间(代码空间)、数据空间(常量、变量)等,数据静态空间

    • 可变部分:
      主要包括动态分配的空间、递归堆栈的空间

度量时间复杂度

以下为一些常用的基本公式:

a)O(a)=O(1)      其中a为常数
b)O(an)=O(n)     其中a为常数
c)O(an2++bn+c)=O(n2)  

时间复杂度O(1)示例:

#include<stdio.h>
int main(){
    printf("Hello World");  //执行一次
    return 0;       //执行一次
}

对于如上代码,执行了两次,即O(2)=O(1),我们可以称其时间复杂度为O(1)

时间复杂度O(n)示例:

#include<stdio.h>
int main(){
    int n=10000,ans=0;  //执行一次
    for(int i=0;i<n;i++){   //执行n次
        ans+=i;     //执行一次
    }
    return 0;       //执行一次
}

我们一共执行了n*1+2次,即O(n*1+2),由上文我们的公式得到其复杂度为O(n)

时间复杂度O(n^2)示例:

#include<stdio.h>
int main(){
    int n=10000,ans=0;  //执行一次
    for(int i=0;i<n;i++){   //执行n次
        for(int j=0;j<n;j++){   //执行n次
            ans+=j;
        }
    }
    return 0;       //执行一次
}

我们一共执行了n*n*1+2次,即O(n*n*1+2),由上文我们的公式得到其复杂度为O(n^2)

时间复杂度O(logn)示例:

#include<stdio.h>
int main(){
    int i=1,n=10000;    //执行一次
    while(i<=n){    //执行logn次
        i*=2;
    }
    return 0;       //执行一次
}

其i的增长是倍增的形式,也就是说i会随着运行次数的增加变大的趋势变更大,这样的代码时间复杂度一般为log级别O(logn)

时间复杂度O(n*logn)示例:

#include<stdio.h>
int main(){
    int n=10000,ans=0;  //执行一次
    for(int i=0;i<n;i++){   //执行n次
        int j=0;        //执行1次
        while(j<=n){    //执行log(n)次
            j*=2;
        }
    }
    return 0;       //执行一次
}

这就是对对数级别复杂度进行嵌套,O(n*logn)级别

相关文章

排序算法(C )

描述 介绍了常用的几种排序算法:**冒泡排序、选择排序、插入排序、快排、希尔排序**、归并排序、堆排 为什么后面两个没有加租?因为目前的我还没发熟练使用 后期如果有时间会出分析讲解视频 **加油!愿祖国强盛**😊😊😊 冒泡排序 冒泡排序原理 从第一个元素开始比较相邻的元素,如果顺序错误则调换顺序,继续往下一一对比,直到序列末尾。 冒泡排序分析 冒泡排序的核心就是:**...

structure

【数据结构】——树

速通回忆 **下面是一个二叉树的演示:包括二叉树的类型构造,二叉树存放一个数值,二叉树的遍历(先序遍历、中序遍历、后序遍历)** 你可以选择直接看这个演示代码回忆之前学过的内容,或者看下面的介绍进行二次学习 ``` #include "stdio.h" #include "stdlib.h" /* 树的元素结构体,结点元素、左子树、右子树 */ typedef struct tree_n...

structure

【数据结构】——循环链表

速通回忆 **如果你之前学过链表**,可以直接看我下面的这个项目,实现了下面专题中所有内容; **如果你是个新手**,**_建议先不要看下面这个项目_**,先好好看一下下面每一个部分的代码思路,并尝试自己去写一下 ``` /* * 功能:单向循环链表操作 * 作者:此乃刘同学(www.liustu.com.cn) */ #include "stdio.h" #include...

structure