1_数据结构及算法的基本概念

一、数据结构

1、数据结构的基本概念

1.1 数据、数据项、数据元素、数据对象

  • 数据(date):描述客观事物的数值、字符以及能输入机器且能被处理的各种符号集合。
  • 数据项(data item):具有原子性,是不可分割的最小数据单位。
  • 数据元素(data element ):是数据集合的个体,通常由若干个数据项组成。
  • 数据对象(data object ):性质相同的数据元素的集合,是数据的子集。
    1_数据结构及算法的基本概念_第1张图片

1.2 数据结构

  • 数据结构(data structure ):指相互之间存在一种或多种特定关系的数据元素的集合。

  • 数据结构 = 逻辑结构 + 存储结构 + 运算/操作

逻辑结构:数据结构的逻辑层面,与实现无关。
存储结构:算法逻辑在计算机上的具体实现。

2、数据结构的分类

1_数据结构及算法的基本概念_第2张图片

2.1 逻辑结构分类

2.1.1 线性结构与非线性结构

  • 线性结构:有且只有一个开始结点和一个终端结点,并且所有结点都最多只有一个直接前驱和一个直接后继。
    1_数据结构及算法的基本概念_第3张图片
  • 非线性结构:一个结点元素可能对应多个直接前驱和多个直接后继。

1_数据结构及算法的基本概念_第4张图片1_数据结构及算法的基本概念_第5张图片

2.1.2 集合结构、线性结构、树状结构、网络结构

1_数据结构及算法的基本概念_第6张图片
1_数据结构及算法的基本概念_第7张图片
1_数据结构及算法的基本概念_第8张图片
1_数据结构及算法的基本概念_第9张图片

2.2 存储结构的分类

2.2.1 顺序存储

  • 把逻辑上相邻的节点存储在物理位置上相邻的存储单元中,结点之间的逻辑关系由存储单元的邻接关系来体现。
    1_数据结构及算法的基本概念_第10张图片

  • 优点

节省存储空间,因为分配给数据的存储单元全用存放结点的数据(不考虑c/c++语言中数组需指定大小的情况),结点之间的逻辑关系没有占用额外的存储空间。

  • 缺点

1、插入和删除操作需要移动元素,效率较低。
2、必须提前分配固定数量的空间,如果存储元素少,可能导致空闲浪费。

2.2.2 链式存储

  • 数据元素的存储对应的是不连续的存储空间,每个存储节点对应一个需要存储的数据元素。
  • 每个结点是由数据域和指针域组成。 元素之间的逻辑关系通过存储节点之间的链接关系反映出来。
    1_数据结构及算法的基本概念_第11张图片
  • 优点

1、插入、删除灵活 (不必移动节点,只要改变节点中的指针)。
2、有元素才会分配结点空间,不会有闲置的结点。

  • 缺点

查找结点时链式存储要比顺序存储慢。

2.2.3 索引存储

  • 除建立存储结点信息外,还建立附加的索引表来标识结点的地址。
  • 举例:图书、字典的目录
    1_数据结构及算法的基本概念_第12张图片

2.2.4 散列结构

  • 根据结点的关键字直接计算出该结点的存储地址
  • 举例:HashSet、HashMap
    1_数据结构及算法的基本概念_第13张图片

二、算法

1、算法的基本概念

1.1 什么是算法?

  • 算法就是计算机解题的过程。

1.2 算法的特征

  • 输入
  • 输出
  • 可行性
  • 有穷性
  • 确定性

2、时间复杂度

2.1 时间复杂度的定义

  • 时间复杂度(Time Complexity):执行算法所需要的计算工作量。
  • 一个算法花费的时间与算法中语句的执行次数成正比例。一个算法中的语句执行次数称为语句频度或时间频度,表示为T(n),n表示问题的规模。
    -在看算法的效率时,我们想知道问题的规模,而不是具体的次数,此时引入时间复杂度。 时间复杂度就是时间频度去掉低阶项和首项常数,记作T(n)=O(f(n))。

2.2 时间复杂度的定义

  • Ο:算法时间复杂度的上界(最坏情况)。
  • Ω:算法时间复杂度的下界(最好情况 )。
  • Θ:算法时间复杂度的精确阶(最好和最坏是同一个阶 )。

2.3 时间复杂度的计算步骤:

  1. 找出算法中的基本语句;
  2. 计算基本语句的执行次数的数量级;
  3. 用大Ο记号表示算法的时间性能。

2.4 举例

2.4.1 T(n) = O(1)

int count=0;
int count=0;
     count=0;
     count=0;
     ...
     count=0;

2.4.2 T(n) = O(n)

int n=8, count=0;
for (int i=1; i<=n; i++)
   count++;

在这里插入图片描述

int n=8, count=0;
for (int i=1; i<=100n; i++)
   for (int j=1; j<=10n; j++)
       count++;
int n=8, count=0;
for (int i=1; i<=n; i++)
   for (int j=1; j<=i; j++)
       count++;

算法执行次数:1+2+3+…+n = ((n+1)*n )/ 2

在这里插入图片描述

int n=8, count=0;
for (int i=1; i<=n; i*=2)
   count++;

2^x=n ----> x=log2n

在这里插入图片描述

int n=8, count=0;
for (int i=1; i<=n; i*=2)
   for (int j=1; j<=n; j++)
       count++;

3、空间复杂度

3.1 空间复杂度的定义

  • 空间复杂度:执行这个算法所需要的内存空间。
  • 空间复杂度是对一个算法在运行过程中临时占用的存储空间大小的量度,一般也作为问题规模n的函数,以数量级形式给出,记作:S(n) = O(g(n))

3.2 举例分析

3.2.1 S(n) = O(1)

int fun(int n){  
       int i,j,k,s;
       s=0;
       for (i=0;i<=n;i++)          
          for (j=0;j<=i;j++)          
             for (k=0;k<=j;k++)    
                 s++;
      return(s);
}

由于算法中临时变量的个数与问题规模n无关,所以空间复杂度均为S(n)=O(1)。

3.2.2 S(n) = O(n)

void fun(int a[],int n,int k)
  //数组a共有n个元素
{  int i;
   if (k==n-1)
       for (i=0;i

此属于递归算法,每次调用本身都要分配空间,fun(a,n,0)的空间复杂度为O(n)。

你可能感兴趣的:(数据结构)