• 数据结构和算法


    1. 什么是数据结构

    数据结构本质上就是:数据元素按照一定的关系组织起来的集合,它是用来组织和存储数据的。

    2. 数据结构的分类

    传统上,我们可以把数据结构分为逻辑结构和物理结构两大类。

    2.1 逻辑结构

    逻辑结构是从具体问题中抽象出来的模型,是抽象意义上的结构,按照对象中数据元素之间的相互关系分类。常见的逻辑结构有:

    (1)集合结构:数据元素除了属于同一个集合外,它们之间没有任何其它关系。
    在这里插入图片描述

    (2)线性结构:数据元素之间存在一对一的关系。

    在这里插入图片描述

    (3)树形结构:数据元素之间存在一对多的关系。
    在这里插入图片描述

    (4)图形结构:数据元素之间存在多对多的关系。

    在这里插入图片描述

    2.2 物理结构

    逻辑结构在计算机中真正的表示方式(又称为映像)称为物理结构,也可以叫做存储结构。常见的物理结构有顺序存储结构链式存储结构

    (1)顺序存储结构:把数据元素放到地址连续的存储单元里面,其数据间的逻辑关系和物理关系是一致的。比如我们常用的数组就是顺序存储结构。

    在这里插入图片描述

    顺序存储结构存在一定的弊端,就像生活中排时也会有人插队也可能有人有特殊情况突然离开,这时候整个结构都处于变化中,此时就需要链式存储结构。

    (2)链式存储结构:把数据元素存放在任意的存储单元里面,这组存储单元可以是连续的也可以是不连续的。此时,数据元素之间并不能反映元素间的逻辑关系,因此在链式存储结构中引进了一个指针存放数据元素的地址,这样通过地址就可以找到相关联数据元素的位置。
    在这里插入图片描述

    3. 什么是算法

    算法是指根据一定的条件,对一些数据进行计算,得到需要的结果。

    4. 算法初体验

    在生活中,我们如果遇到某个问题,常常解决方案不是唯一的。

    例如从上海到北京,如何去?我们会有不同的解决方案,我们可以坐飞机,可以坐火车,可以坐汽车,甚至可以步行,不同的解决方案带来的时间成本和金钱成本是不一样的,比如坐飞机用的时间最少,但是费用最高,步行费用最低,但时间最长。

    在程序中,我们也可以用不同的算法解决相同的问题,而不同的算法的成本也是不相同的。总体上,一个优秀的算法追求以下两个目标:

    • 花更少的时间完成计算。
    • 占用更少的内存空间完成计算。

    下面我们用一些实际案例体验一些算法。

    4.1 需求1:计算1到100的和

    第一种解法:

    public static void main(String[] args) {
      int sum = 0;
      int n = 100;
      for (int i = 1; i <= n; i++) {
        sum += 1;
      }
      System.out.println("sum=" + sum);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    第二种解法:

    public static void main(String[] args) {
      int sum = 0;
      int n = 100;
      sum = (n + 1) * n / 2;
      System.out.println("sum=" + sum);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    第一种解法要完成需求,要完成以下几个动作:

    1. 定义两个整型变量。
    2. 执行100次加法运算。
    3. 打印结果到控制台。

    第二种解法要完成需求,要完成以下几个动作:

    1. 定义两个整型变量。
    2. 执行1次加法运算,1次乘法运算,1次除法运算,总共3次运算。
    3. 打印结果到控制台。

    很明显,第二种算法完成需求,花费的时间更少一些。

    4.2 需求2:计算10的阶乘

    第一种解法:

    public class Demo {
    
      public static void main(String[] args) {
        long result = calculateFactorial(10);
        System.out.println(result);
      }
    
      private static long calculateFactorial(long n) {
        if (n == 1) {
          return 1;
        }
        return n * calculateFactorial(n - 1);
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    第二种解法:

    public class Demo {
    
      public static void main(String[] args) {
        long result = calculateFactorial(10);
        System.out.println(result);
      }
    
      private static long calculateFactorial(long n) {
        int result = 1;
        for (long i = 1; i <= n; i++) {
          result *= i;
        }
        return result;
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    第一种解法:使用递归完成需求, calculateFactorial方法会执行10次,并且第一次执行未完毕,调用第二次执行,第二次执行未完毕,调用第三次执行…最终,最多的时候,需要在栈内存同时开辟10块内存分别执行10个calculateFactorial方法。

    第二种解法:使用for循环完成需求,calculateFactorial方法只会执行一次,最终,只需要在栈内存开辟一块内存执行calculateFactorial方法即可。

    很明显,第二种算法完成需求,占用的内存空间更小。

  • 相关阅读:
    关于pbootcms中被挂马以后的处理
    期权的时间价值是如何衰减的?内在价值和时间价值的关系
    手写一个简单的web服务器(B/S架构)
    操作系统知识点总结——第三章内存管理
    8月17日计算机视觉理论学习笔记——概述
    高精度延时实验
    ios下input不能输入,没有光标的原因及解决办法
    中国第一大微商TST涉嫌传销案听证会结束
    jvm学习笔记
    多服务器云探针源码(服务器云监控)/多服务器多节点_云监控程序python源码
  • 原文地址:https://blog.csdn.net/Anbang713/article/details/126275962