数据结构与算法第一讲: [基础与线性表]

数据结构是计算机存储、组织数据的方式。数据结构分别为逻辑结构、(存储)物理结构和数据的运算三个部分。常见的数据结构有:队列,树,堆,数组,栈,链表,涂,散列表等。

第一节:数据结构概述

数据结构(data structure)是带有结构特性的数据元素的集合,它研究的是数据的逻辑结构和数据的物理结构以及它们之间的相互关系,并对这种结构定义相适应的运算,设计出相应的算法,并确保经过这些运算以后所得到的新结构仍保持原来的结构类型。

1.1 概念术语

(1)数据(Data)是能被计算机处理的符号或符号集合,含义广泛,可理解为“原材料”。如字符、图片、音视频等。

(2)数据元素(data element)是数据的基本单位。例如一张学生统计表。

(3)数据项(data item)组成数据元素的最小单位。例如一张学生统计表,有编号、姓名、性别、籍贯等数据项。

(4)数据对象(data object)是性质相同的数据元素的集合,是数据的一个子集。例如正整数N={1,2,3,····}。

(5)数据结构(data structure)是数据的组织形式,数据元素之间存在的一种或多种特定关系的数据元素集合。

(6)数据类型(data type)是按照数据值的不同进行划分的可操作性。在C语言中还可以分为原子类型和结构类型。原字类型是不可以再分解的基本类型,包括整型、实型、字符型等。结构类型是由若干个类型组合而成,是可以再分解的。

下图展示出他们之间的关系:
结构图.png

1.2 数据的逻辑结构

系统的逻辑结构是从思想的角度上对系统分类,把系统分成若干个逻辑单元,不同逻辑单元分别实现自己的功能。数据的逻辑结构是对数据之间关系的描述,有时就把逻辑结构简称为数据结构,数据的逻辑结构分为以下四种:

1、集合结构:集合结构的集合中任何两个数据元素之间都没有逻辑关系,组织形式松散
image.png

2、线性结构:数据结构中线性结构指的是数据元素之间存在着“一对一”的线性关系的数据结构,并且是有序的,常用的线性结构:数组、栈、队列、字符串、线性表。
image.png

3、树状结构:树状结构是一个或多个节点的有限集合,也就是一对多的关系。
image.png

4、图形结构:图形的数据元素结构关系是多对多的。
image.png

1.3 数据的存储(物理)结构

数据的存储结构是指数据的逻辑结构在计算机中的表示。数据的存储结构一般可以反映数据元素之间的逻辑关系。数据的存储结构分为顺序存储结构和链接存储结构两种。
1、顺序存储结构:顺序存储方法它是把逻辑上相邻的结点存储在物理位置相邻的存储单元里,结点间的逻辑关系由存储单元的邻接关系来体现,由此得到的存储表示称为顺序存储结构。

image.png

2、链接存储结构:链接存储方法它不要求逻辑上相邻的结点在物理位置上亦相邻,结点间的逻辑关系是由附加的指针字段表示的。由此得到的存储表示称为链式存储结构,链式存储结构通常借助于程序设计语言中的指针类型来实现。
image.png

1.4 数据结构与算法

算法(algorithm)是解决特定问题求解步骤的描述,在计算机中表现为有限的操作序列。在数据类型建立起来之后,就要对这些数据类型进行操作,建立起运算的集合即程序。运算的建立、方法好坏直接决定着计算机程序原型效率的高低。

  • 数据结构和算法的关系

    两者既有联系又有区别。联系是程序=算法+数据结构。数据结构是算法实现的基础,算法总是要依赖某种数据结构来实现的。算法的操作对象是数据结构。区别是数据结构关注的是数据的逻辑结构、存储结构等一些基本操作,而算法更多的是关注如何在数据结构的基本上解决实际问题。算法是编程思想,数据结构则是这些思想的基础,如下图
    image.png
  • 数据结构算法特性
    (1) 输入输出
    (2) 有穷性
    (3) 确定性
    (4) 可行性

  • 数据结构算法设计要求
    (1) 正确性
    (2) 可读性
    (3) 健壮性
    (4) 时间效率高和储存量低

1.5 时间复杂度

算法的时间复杂度是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,亦即考察输入值大小趋近无穷时的情况。

算法的时间复杂度是衡量一个算法好坏的重要指标。一般情况下,随着规模n的增大,次数T(n)的增长较慢的算法为最优算法。常见时间复杂度从小到大依次排列:O(1) < O(log2n) < O(n) < O(n²)

常见的算法复杂度

  • 常数阶
//1常数阶   执行3次。O(1)
void testNum1(int n){
    int sum = 0 ;//执行一次
    sum = (n+1)*n/2; //执行一次
    printf("sum=%d\n",sum);//执行一次
}
  • 线性阶
//x=x+1; 执行n次 O(n)
void add2(int x,int n){
    for (int i = 0; i < n; i++) {
        x = x+1;
    }
}
  • 平方阶
//x=x+1; 执行n*n次 ->O(n^2)
void add3(int x,int n){
    for (int i = 0; i< n; i++) {
        for (int j = 0; j < n ; j++) {
            x=x+1;
        }
    }
}
  • 对数阶
/* 2的x次方等于n x = log2n  ->O(logn)*/
void testA(int n){
    int count = 1;         //执行1次
    //n = 10
    while (count < n) {
        count = count * 2;
    }
}
  • 立方阶
void testB(int n){
    int sum = 1;                         //执行1次
    for (int i = 0; i < n; i++) {        //执行n次
        for (int j = 0 ; j < n; j++) {   //执行n*n次
            for (int k = 0; k < n; k++) {//执行n*n*n次
                sum = sum * 2;          //执行n*n*n次
            }
        }
    }
}
  • nlog阶
  • 指数阶(不考虑)
    常见的算法的时间复杂度.png

1.6 算法空间复杂度计算

空间复杂度(space complexity)作为算法所需存储空间的量度,记做S(n) = O (f(n))。其中,n为问题的规模;f(n)为语句关于n的所占存储空间的函数。

一般情况下,一个程序在机器上运行时,除了需要存储程序本身的指令、常数、变量和输入数据外,还需要存储对数据操作的存储单位。若输入数据所占空间只取决于问题本身,和算法无关,这样只需要分析该算法在实现时所需的辅助单元即可。若算法执行时所需的辅助空间相对于输入数据量而言是个常量,则称此算法为原地工作,空间复杂度为O(1)

你可能感兴趣的:(数据结构与算法第一讲: [基础与线性表])