数据结构与算法概述

479 阅读5分钟

1. 数据结构

1.1 组成

数据结构中最基本的5个概念:数据,数据元素,数据项,数据对象,数据结构。

数据: 程序的操作对象,用于描述客观事物。

数据项: 一个数据元素由若干数据项组成 。

数据元素: 组成数据的对象的基本单位 。

数据对象: 性质相同的数据元素的集合(类似于数组) 。

结构: 数据元素之间不是独立的,存在特定的关系.这些关系即是结构。

数据结构:指的数据对象中的数据元素之间的关系。

    /*
     数据: 程序的操作对象,用于描述客观事物.
     
     数据项: 一个数据元素由若干数据项组成
     数据元素: 组成数据的对象的基本单位
     数据对象: 性质相同的数据元素的集合(类似于数组)
     
     结构: 数据元素之间不是独立的,存在特定的关系.这些关系即是结构;
     数据结构:指的数据对象中的数据元素之间的关系
     */
    
    //声明一个结构体类型
    struct Teacher{     //一种数据结构
        char *name;     //数据项--名字
        char *title;    //数据项--职称
        int  age;       //数据项--年龄
        
    };
    
    int main(int argc, const char * argv[]) {
       
        struct Teacher t1;     //数据元素;
        struct Teacher tArray; //数据对象;
        
        t1.age = 18;       //数据项
        t1.name = "CC";    //数据项
        t1.title = "讲师";  //数据项
        
        printf("老师姓名:%s\n",t1.name);
        return 0;
    }

1.2 逻辑结果与物理结构

1.2.1 逻辑结构

逻辑结构指的是数据对象中的数据元素之间的相互关系.

逻辑结构分为四种:集合结构,线性结构,树形结构,图形结构. 具体采用什么的数据结构,是需要根据实际业务需求来进行合理的设计.

  • 集合结构

集合结构中的数据元素除了同属于一个集合外,它们之间没有其他关系. 各个数据元素是"平等"的. 它们的共同属性是:"同属于一个集合".

  • 线性结构

线性结构中的数据元素之间是一对一的关系.常用的线性结构有:线性表,栈,队列,双队列,数组,串。

  • 树形结构

    重要的非线性数据结构。树形数据结构可以表示数据表素之间一对多的关系.常见的树形结构: 二叉树,B树,哈夫曼树,红黑树等.

  • 图形结构

    图形结构的数据元素是多对多的关系.常见的图形结构: 邻近矩阵,邻接表.

1.2.2 物理结构

指的是数据的逻辑结构在计算机的存储形式.数据元素的存储结构形式有2种: 顺序存储和链式存储;

顺序存储结构: 是指把数据元素存放在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的.

链式存储结构: 是把数据元素放在任意的存储单元里,这组存储单元可以是连续的,也可以是不连续的. 数据元素的存储关系并不能反映逻辑关系,因此需要用一个指针存放数据元素的地址,这样通过地址就可以找到相关关联数据元素的位置.

2. 算法

2.1 概念

算法: 解决特定问题的求解步骤的描述。

2.2 算法与数据结构关系

程序设计 = 数据结构 + 算法

2.3 算法特性及度量方式

算法必须具备几个基本特性: 输入,输出,有穷性,确定性和可行性。

算法设计要求:正确性,可读性,健壮性,时间效率高和存储量低.

抛开与计算机硬件,软件有关的因素,一个程序运行时间,依赖于算法的好坏和问题的输入规模. 即时间复杂度。

2.4 时间复杂度

总的时间复杂度就等于量级最大的那段代码的时间复杂度,即一般情况下循环执行次数花费的时间。

常见算法时间复杂度有:O(1),O(n),O(logn),O(n^2),O(nlogn),O(n^3)

2.5 平均时间复杂度

最好情况时间复杂度就是,在最理想的情况下,执行这段代码的时间复杂度。

最坏情况时间复杂度就是,在最糟糕的情况下,执行这段代码的时间复杂度。

以要查找的变量 x 在数组中的位置为例,有 n+1 种情况:在数组的 0~n-1 位置中和不在数组中。我们把每种情况下,查找需要遍历的元素个数乘以此种情况下发生的概率,累加起来,然后再除以 n+1,就可以得到需要遍历的元素个数的加权平均值,也叫作期望值,所以平均时间复杂度的全称应该叫加权平均时间复杂度或者期望时间复杂度。

实际上,在大多数情况下,我们并不需要区分最好、最坏、平均情况时间复杂度三种情况。很多时候,我们使用一个复杂度就可以满足需求了。只有同一块代码在不同的情况下,时间复杂度有量级的差距,我们才会使用这三种(最好时间复杂度、最坏时间复杂度、平均时间复杂度)复杂度表示法来区分。

2.6 空间复杂度

算法设计有一个重要原则,即空间/时间权衡原则

一般情况下, 一个程序在机器上执行时,除了需要寄存本身所用的指令,常数,变量和输入数据外,还需要一些对数据进行操作的辅助存储空间.而这个辅助存储空间我们用空间复杂度来衡量。