Bootstrap

《数据结构》C语言版 (清华严蔚敏版)详解

关键字定义

    1、数据

数据:是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合。

    2、数据元素
数据元素:是组成数据的、有一定意义的基本单位,在计算机中通常作为整体处理。也被称为记录。

    3、数据项
数据项:一个数据元素可以由若干个数据项组成,数据项是不可分割的最小单位。

    4、数据对象
数据对象:是性质相同的数据元素的集合,是数据的子集。

 

根据例子理解:假设有两张表,上表为人员表,下表为课程表, 表的格式如下:


这两张表就是数据
而单独的一张表就称为数据对象,即人员表是一个数据对象,课程表也是一个数据对象
而每张表中的每一行就称为数据元素
而姓名,性别,身高,课程代号,课程名就称为数据项


逻辑结构:数据的逻辑结构是面向用户的,因此其表现方法可以有:表格、图等我们常见的表示方法

逻辑结构四类型        

  • 集合:数据元素同属一个集合,单个数据元素之间没有任何关系。
集合结构
  • 线性结构 :一对一,类似于线性关系,线性结构中的数据元素之间有且只有一个开始元素和一个终端元素。
线性结构
  • 树型结构 :一对多,一个开始元素(根节点),多个终端元素。
树形结构
  • 图形结构 :多对多,多个开始元素和多个终端元素。

图形结构


存储结构:数据结构中四种数据存储结构 --- 顺序存储 链接存储 索引存储 散列存储(hash存储)

  • 顺序存储结构:顺序存储结构是把数据元素放到地址连续的存储单元里面,其数据间的逻辑关系和物理关系是一致的。之前学习的数组就是一种顺序存储结构。(如图所示)
顺序存储结构
  • 链式存储结构:链式存储结构:是把数据元素存放在任意的存储单元里面,这组存储单元可以是连续的也可以是不连续的。(如图所示)

 根据指针找出相邻元素的位置

链式存储结构
  • 索引存储方式:每个存储结点只含一个数据元素,所有存储结点连续存放,此外增设一个索引表以指示各存储结点的存储位置或区间端点。
  • 散列存储方式:每个存储结点只含一个数据元素,各个结点均匀分布在存储区里,用散列函数指示各存储结点的存储位置或区间端点。

算法和算法分析:算法 + 数据结构 = 程序

算法特性:对特定问题求解步骤的一种描述,是指令的有限序列。一个算法具有以下5个特性:①有穷性 ②确定性 ③可行性 ④有0个或多个输入 ⑤有一个或多个输出

    一个算法的优劣应该从以下四方面来评价①正确性 ②可读性 ③健全性 ④高效性

算法分析:在算法特性要求合格的情况下依据算法效率(时间复杂度,空间复杂度)进行评判;

    时间复杂度:时间复杂度是一个估算我们使用O的渐进表示法:O是用于描述函数渐进行为的数学符号。

    概念:算法的时间复杂度是一个函数:(是数学含义上的函数)数据里面带未知数的函数式。

    含义:算法在机器中运行所消耗的时间

    实际意义:算法中基本操作的执行次数。

    作用和理解:降低占用内存和减少运行时间,提高效率。

大O表示法 大O符号(Big O notation):用于描述函数渐进行为的数学符号(描述时间复杂度)

    推导大O阶方法:

        1,用常数1取代运行次数中的所有加法常数   

如:int i = 16, j = 100;//执行一次
printf("hello world");//执行一次
printf("%d",i);//执行一次
printf("%d",j);//执行一次

 上述语句一共执行4次,但时间复杂度并不是O(4),而是O(1)。

        2,在修改后的运行次数函数中,只保留最高阶项;

        3,如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶;

        含义:保留最高阶的未知数,不保留常系数

如:执行次数为f(n) = 2*n^3+4*n^2+6*n+16,时间复杂度为T(n) =  O(f(n)) = O(n^3)

常见的时间复杂度

    常见的时间复杂度耗费的时间从小到大的顺序为:   O(1)<O(log(m)n)<O(n)<O(n*log(m)n)<O(n^2)<O(n^3)<O(2^n)<O(n!)<O(n^n)

注意 最好、最坏和平均时间复杂度一般求解时间复杂度时,需要考虑的是算法的最坏情况。

    最好时间复杂度,指的是算法计算量可能达到的最小值

    最坏时间复杂度,指的是算法计算量可能达到的最大值

    平均时间复杂度,是指算法在所有可能情况下,按照输入实例以等概率出现时,算法计算量的加权平均值

数据类型

   数据类型:一般包括整型、实型、字符型等原子类型外,还有数组、结构体和指针等结构类型。


抽象数据类型(ADT

    抽象数据类型(Abstract Data Type,ADT):类似C语言中的结构体以及C++、java语言中的类。通俗的讲,抽象数据类型,泛指除基本数据类型以外的数据类型。抽象数据类型的概念与面向对象的思想是一致的。

;