C语言 | 数据结构——数据类型与算法

简介: 一个有限指令集接受一些输入(有些情况下不需要输入)产生输出一定在有限步骤之后终止每一条指令必须有充分明确的目标,不能有歧义在计算机能处理的范围只能描述应不依赖于任何一种计算机语言以及具体的实现手段。

 目录

数据结构

抽象数据类型

算法(Algorithm)

定义

判断算法的指标

1.空间复杂度S(n)

2.时间复杂度T(n)

复杂度分析:

编辑



数据结构

       数据对象在计算机中的组织方式,数据对象必定与一系列加在其上的操作相关联

⬆⬆⬆⬆⬆⬆完成这些操作所用的方法就是算法⬆⬆⬆⬆⬆⬆

抽象数据类型

拆分成“抽象”与“数据类型”

抽象:即描述数据类型的方法不依赖于具体实现(只描述数据对象集相关操作集“是什么”,并不涉及“如何做到”的问题)

    1. 与存放数据的机器无关
    2. 与数据存储的物理结构无关
    3. 与实现操作的算法均无关
    4. 与实现操作的编程语言无关

    数据类型(Abstract Data Type)

      1. 数据对象集
      2. 数据集合相关联的操作集

      image.gif编辑

      算法(Algorithm)

      定义

        • 一个有限指令集
        • 接受一些输入(有些情况下不需要输入)
        • 产生输出
        • 一定在有限步骤之后终止
        • 每一条指令必须
          • 有充分明确的目标,不能有歧义
          • 在计算机能处理的范围只能
          • 描述应不依赖于任何一种计算机语言以及具体的实现手段

            判断算法的指标

            1.空间复杂度S(n)

                   根据算法写成的程序在执行时占用存储单元的长度。这个长度往往与输入数据的规模有关。空间复杂度过高的算法可能导致使用的内存超限,造成程序非正常中断

            #include <stdio.h>
            void PrintN(int N)
            {
                if(N){
                    PrintN(N-1);
                    printf("%d\n",N);
                }
                return;
            }
            int main()
            {
                int i;
                scanf("%d",&i);
                PrintN(i);
                return 0;
            }

            image.gif

            递归中,要打印N个数,此时空间复杂度:   S(N) = C*N

            即占用的空间与要输出的N个数成正比,当N过大,程序可用空间有限,此时就会爆掉

            我们可以测试一下,输出10000和100000,很明显,后者直接报错,内存爆了

            image.gif编辑

            image.gif编辑

            2.时间复杂度T(n)

                   根据算法写成的程序在执行时耗费时间的长度。这个长度往往也与输入数据的规模有关。时间复杂度过高的低效算法可能导致我们在有生之年都等不到运行结果。

                   在计算机中,做加减法的速度要比乘除法快,在下面两种写法不同的函数,前者的乘法运算更多,也更呆,所以消耗的时间也更多

            前者的时间复杂度为 T(n)=C1 * n*n+C2 * n

            后者的时间复杂度为 T(n)=C*n

            double f(int n, double a[], double x)
            {
                int i;
                double p = a[0];
                for (i = 1;i<=n; i++)
                    p+=(a[i]* pow(x,i));
                return p;
            }

            image.gif

            double f(int n, double a[], double x)
            {
                int i;
                double p = a[n];
                for (i = n;i>0; i--)
                    p = a[i-1]+x*p;
                return p;
            }

            image.gif

            在分析一般算法效率时,我们经常关注下面的两种复杂度

              1. 最坏情况复杂度Tworst(n)
              2. 平均复杂度Tavg(n)

                                                        Tavg(n)<=Tworst(n)

              复杂度分析:

              image.gif编辑

              for循环的时间复杂度等于循环次数乘以循环体代码的复杂度

              if-else结构的复杂度取决于if的条件判断复杂度和两个分支部分的复杂度,总体复杂度取三者最大

              相关文章
              |
              8月前
              |
              存储 监控 安全
              企业上网监控系统中红黑树数据结构的 Python 算法实现与应用研究
              企业上网监控系统需高效处理海量数据,传统数据结构存在性能瓶颈。红黑树通过自平衡机制,确保查找、插入、删除操作的时间复杂度稳定在 O(log n),适用于网络记录存储、设备信息维护及安全事件排序等场景。本文分析红黑树的理论基础、应用场景及 Python 实现,并探讨其在企业监控系统中的实践价值,提升系统性能与稳定性。
              461 1
              |
              8月前
              |
              存储 监控 算法
              基于跳表数据结构的企业局域网监控异常连接实时检测 C++ 算法研究
              跳表(Skip List)是一种基于概率的数据结构,适用于企业局域网监控中海量连接记录的高效处理。其通过多层索引机制实现快速查找、插入和删除操作,时间复杂度为 $O(\log n)$,优于链表和平衡树。跳表在异常连接识别、黑名单管理和历史记录溯源等场景中表现出色,具备实现简单、支持范围查询等优势,是企业网络监控中动态数据管理的理想选择。
              221 0
              |
              存储 算法 Java
              算法系列之数据结构-二叉树
              树是一种重要的非线性数据结构,广泛应用于各种算法和应用中。本文介绍了树的基本概念、常见类型(如二叉树、满二叉树、完全二叉树、平衡二叉树、B树等)及其在Java中的实现。通过递归方法实现了二叉树的前序、中序、后序和层次遍历,并展示了具体的代码示例和运行结果。掌握树结构有助于提高编程能力,优化算法设计。
              385 10
               算法系列之数据结构-二叉树
              |
              算法 Java
              算法系列之数据结构-Huffman树
              Huffman树(哈夫曼树)又称最优二叉树,是一种带权路径长度最短的二叉树,常用于信息传输、数据压缩等方面。它的构造基于字符出现的频率,通过将频率较低的字符组合在一起,最终形成一棵树。在Huffman树中,每个叶节点代表一个字符,而每个字符的编码则是从根节点到叶节点的路径所对应的二进制序列。
              374 3
               算法系列之数据结构-Huffman树
              |
              算法 Java
              算法系列之数据结构-二叉搜索树
              二叉查找树(Binary Search Tree,简称BST)是一种常用的数据结构,它能够高效地进行查找、插入和删除操作。二叉查找树的特点是,对于树中的每个节点,其左子树中的所有节点都小于该节点,而右子树中的所有节点都大于该节点。
              513 22
              |
              存储 人工智能 程序员
              一文彻底搞清楚C语言的数据类型和变量
              本文介绍了数据类型(基本、构造、指针、空类型)、变量(使用、命名规则、作用域)和常量(字面、符号、枚举、表达式),帮助初学者理解编程基础概念。坚持学习,定能创造奇迹!
              2014 1
              一文彻底搞清楚C语言的数据类型和变量
              |
              存储 机器学习/深度学习 算法
              C 408—《数据结构》算法题基础篇—链表(下)
              408考研——《数据结构》算法题基础篇之链表(下)。
              469 30
              |
              存储 算法 C语言
              C 408—《数据结构》算法题基础篇—链表(上)
              408考研——《数据结构》算法题基础篇之链表(上)。
              667 25
              |
              定位技术 C语言
              c语言及数据结构实现简单贪吃蛇小游戏
              c语言及数据结构实现简单贪吃蛇小游戏
              |
              存储 算法
              非递归实现后序遍历时,如何避免栈溢出?
              后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
              371 59

              热门文章

              最新文章