万文带你入门数据结构,还学不会?

数据结构 <绪论>


本文知识点PPT已上传至资源,需要可自行下载。整理不易,如果对你有帮助,欢迎点赞,收藏,关注我!不定期分享相关技术文章。


基本内容:

Ø数据结构的兴起和发展

Ø数据结构的研究对象

Ø数据结构的基本概念

Ø算法及算法分析

重点与难点

重点
1.数据结构及相关概念
2.数据结构的逻辑结构和存储结构,二者之间的关系
3. 算法及特性
4.大O记号

难点
1.抽象数据类型的理解和使用
2.伪代码的理解和使用
3.算法的时间复杂度分析


数据结构的兴起和发展

程序设计的实质是什么?
数据表示:将数据存储在计算机(内存)中
数据处理:处理数据,设计方案(算法)
数据结构问题起源于程序设计


学习数据结构之前,我们先认识以先数据结构的创始人!

数据结构的创始人——克努思

这里是引用

数据结构随着程序设计的发展而发展
无结构阶段 —> 结构化阶段 —>面向对象阶段 --> ?
面向对象阶段:
应用领域:更多地应用于非数值处理
类和数据结构之间的对应关系:
程序 = 数据结构 + 算法


.属性
.方法
数据结构…
.数据之间的关系
.基本操作

数据结构的发展并没有结束…

流程示例:

利用计算机求解问题的一般过程?

计算机不能分析问题并产生问题的解决方案,必须由人来分析问题,确定问题的解决方案,编写程序,然后让计算机执行程序最终获得问题的解。


数据结构的研究对象

1.计算机求解问题:
问题→抽象出问题的模型→求模型的解

2.问题——数值问题、非数值问题
数 值 问 题→数学方程
非数值问题→数据结构

非数值问题的数据组织和处理:
(1)数据的逻辑结构:线性表、树、图等数据结构,其核心是如何组织待处理的数据以及数据之间的关系;

(2)数据的存储结构:如何将线性表、树、图等数据结构存储到计算机的存储器中,其核心是如何有效地存储数据以及数据之间的逻辑关系;

(3)算法:如何基于数据的某种存储结构实现插入、删除、查找等基本操作,其核心是如何有效地处理数据;

(4)常用数据处理技术:查找技术、排序技术、索引技术等。


数据结构的基本概念

数据:
对客观事物的符号表示,在计算计算机科学中使之所有能输入到计算机中并能被计算机程序处理的符号总称。
数值类型: 整数,实数等
非数值数据:图型,图像,声音,文字等

数据元素:
数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。

数据项:
构成数据元素的不可分割的最小单位。

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

数据,数据元素,数据想之间的关系
包含关系:
数据由数据元素组成,数据元素由数据项组成。
数据元素是讨论数据结构时涉及的最小数据单位,其中的数据项一般不予考虑。
在这里插入图片描述
数据结构:
相互之间存在一定关系的数据元素的集合。
按照视点的不同,数据结构分为逻辑结构和存储结构。

数据的逻辑结构在形式上可定义为一个二元组:
Data_Structure = (D, R)
其中D是数据元素的有限集合,R是D上关系的集合。

逻辑结构:
指数据元素之间逻辑关系的整体。

逻辑关系:关联方式或邻接关系
在这里插入图片描述
存储结构:
又称为物理结构,是数据及其逻辑结构在计算机中的表示。
计算机 — 内存
存储结构实质上是内存分配,在具体实现时依赖于计算机语言。

数据的逻辑结构是从具体问题抽象出来的数据模型

数据结构从逻辑上分为四类:
⑴ 集合:数据元素之间就是“属于同一个集合”
在这里插入图片描述
⑵ 线性结构:数据元素之间存在着一对一的线性关系
在这里插入图片描述

⑶ 树结构:数据元素之间存在着一对多的层次关系
在这里插入图片描述
⑷ 图结构:数据元素之间存在着多对多的任意关系。
在这里插入图片描述
两种不同的表示方法:
顺序映像非顺序映像
通常有两种存储结构:通常有两种存储结构:

  1. 顺序存储结构:用一组连续的存储单元依次存储数据元素,
  2. 数据元素之间的逻辑关系由元素的存储位置来表示。
    在这里插入图片描述
  3. 链接存储结构:用一组任意的存储单元存储数据元素,
  4. 数据元素之间的逻辑关系用指针来表示 。
    在这里插入图片描述

逻辑结构和存储结构之间的关系

1.数据的逻辑结构属于用户视图,是面向问题的,反映了数据内部的构成方式;数据的存储结构,属于具体实现的视图,是面向计算机的。

2.一种数据的逻辑结构可以用多种存储结构来存储,而采用不同的存储结构,其数据处理的效率往往是不同的。

抽象数据类型

  1. 数据类型(Data Type):一组值的集合以及定义于这个值集上的一组操作的总称。

代码示例:

例如:C语言中的整型变量
int a, b; 
a = 10000000000000; 
a = a % b;

float x, y; 
x = 1234567.123; 
x = x % y;
  1. 抽象(Abstract):抽出问题本质的特征而忽略非本质的细节。
    在这里插入图片描述
    抽象数据类型把什么抽象掉了呢?

  2. 抽象数据类型(Abstract Data Type,ADT):一个数据模型以及定义在该模型上的一组操作

抽象数据类型不考虑数据项,把具体的数据类型抽象掉了。
抽象数据类型只考虑数据结构和基本操作。

在这里插入图片描述

在设计ADT时,把ADT的定义、设计和实现分开来。定义部分只包含数据的逻辑结构和所允许的操作集合,一方面,ADT的使用者依据这些定义来使用ADT,即通过操作集合对该ADT进行操作;另一方面,ADT的实现者依据这些定义来完成该ADT各种操作的具体实现。

ADT 抽象数据类型名{
Data
数据元素之间逻辑关系的定义
Operation
操作1 (操作接口 (函数))
输 入:执行此操作所需要的输入
功 能:该操作将完成的功能
输 出:执行该操作后产生的输出
操作2……
操作n……
}endADT

抽象数据类型分类

**原子类型:**属原子类型的变量的值是不可分割,例如整型。

**固定聚合类型:**属该类型的变量,其值由确定数目的成分按某种结构组成,例如复数。

**可变聚合类型:**构成可变聚合类型“值”的成分的数目不确定,例如:一个“有序整数序列”,长度可变。

**多形数据类型:**其值的成分不确定的数据类型。
在这里插入图片描述


算法及算法分析

1.见识算法

图灵将与算法
这里是引用

算法是计算机科学的基石

算法的起源

算法的中文名称出自《周髀算经》(西周~秦汉)

今有三分之一,五分之二。问合之得几何? 答曰:十五分之十一。
又有三分之二,七分之四,九分之五。问合之得几何? 答曰:得一、六十三分之五十。 又
有二分之一,三分之二,四分之三,五分之四。问合之得几何? 答曰:得二、六十分 之
四十三。
合分(分数相加)术(算法)曰:母(分母)互乘子(分子),并以为实(被除数),
母相乘为法(除数),实如(除以)法而一。不满法者,以法命之,其母同者,直相从
(加)之。

世界数学的两大体系
张仓《九章算术》创立的机械化算法体系
欧几里德《几何原本》创立的逻辑演绎体系

算法的英文名称来自于波斯数学家阿勒·霍瓦里松《代数
对话录》(公元825年)

欧几里德算法被人们认为是史上第一个算法

Algorithm在Webster’s New World Dictionary(1957版)中尚未出现
Algorithm——算法
Logarithm——对数
Algorism——算术

算法的概念
1.算法(Algorithm):是对特定问题求解步骤的
一种描述,是指令的有限序列。

在这里插入图片描述
1. 柿子切块,鸡蛋加适量盐搅拌
2. 锅里放油
3. 把鸡蛋倒进去炒熟
4. 加入葱花
5. 把柿子放进去放少许盐和味精
6. 翻炒几下出锅装盘

算法不是问题的答案,而是解决问题的操作步骤

  1. 算法的五大特性:
    ⑴ 输入:一个算法有零个或多个输入。
    ⑵ 输出:一个算法有一个或多个输出。
    ⑶ 有穷性:一个算法必须总是在执行有穷步之后结束,且每一步都在有穷时间内完成。
    ⑷ 确定性:算法中的每一条指令必须有确切的含义,对于相同的输入只能得到相同的输出。
    ⑸ 可行性:算法描述的操作可以通过已经实现的基本操作执行有限次来实现

好算法的特性
一个算法满足什么特性才能称之为好算法呢?

1.正确性:算法能满足具体问题的需求,即对于任何合法的输入,算法都 会得出正确的结果。
2.健壮性:算法对非法输入的抵抗能力,即对于错误的输入,算法应能识 别并做出处理,而不是产生错误动作或陷入瘫痪。
3.可理解性:算法容易理解和实现。
4.抽象分级:用合适的抽象分级来组织表达算法的思想, 启发式规则7±2。
5.高效性:具有较短的执行时间并占用较少的辅助空间。

米勒原则:人类的短期记忆能力一般限于一次记忆 5~9 个对象


例:欧几里德算法——辗转相除法求两个自然数 m和 n 的最大公约数
在这里插入图片描述
算法的描述方法——自然语言
优点:容易理解
缺点:冗长、二义性
使用方法:粗线条描述算法思想
注意事项:避免写成自然段

步骤1:将m除以n得到余数r;
步骤2:若r等于0,则n为最大公约数, 算法结束;否则执行步骤3;
步骤3:将n的值放在m中,将r的值放在n中, 重新执行步骤1;

算法的描述方法——流程图
优点:流程直观
缺点:缺少严密性、灵活性
使用方法:描述简单算法
注意事项:注意抽象层次

在这里插入图片描述
算法的描述方法——程序设计语言
优点:能由计算机执行
缺点:抽象性差,对语言要求高
使用方法:算法需要验证
注意事项:将算法写成子函数

例:欧几里德算法
#include <iostream.h>
int CommonFactor(int m, int n)
{
	int r = m % n;
	while (r != 0)
	{
	m = n;
	n = r;
	r = m % n;
	}
	return n;
}

void main( )
{
	cout<<CommonFactor(63, 54)<<endl;
}

算法的描述方法——伪代码
伪代码(Pseudocode):介于自然语言和程序设计语言之间的方法,它采用某一程序设计语言的基本语法,操作指令可以结合自然语言来设计。
优点:表达能力强,抽象性强,容易理解
使用方法:7 ± 2

例:欧几里德算法
1. r = m % n;
2. 循环直到 r 等于0
	2.1 m = n;
	2.2 n = r;
	2.3 r = m % n;
3. 输出 n ;

上述伪代码再具体一些,用C++的函数来描述。
int CommonFactor(int m, int n)
{
	r = m % n;
	while (r != 0)
	{
	m = n;
	n = r;
	r = m % n;
	}
	return n;
}

对C++语言进行了如下简化:
⑴ 局部变量可以不声明;
⑵ 写出子函数即可,子函数不用在主函数中调用,省略主函数;
⑶ 所有的包含函数(头函数.h)可以省略;
⑷ 交换两个变量的语句可以简写为a←→b。


什么是算法分析?

在这里插入图片描述
算法分析
如何评价算法?
易读性
健壮(容错)性
可维护性
可扩展性
……
效率(速度)——算法的核心和灵魂

度量算法效率的方法:
事后统计:将算法实现,测算其时间和空间开销。

缺点:
⑴ 编写程序实现算法将花费较多的时间和精力;
⑵ 所得实验结果依赖于计算机的软硬件等环境因素。

事前分析:对算法所消耗资源的一种估算方法。

算法分析(Algorithm Analysis):对算法所需要的计算机资源——时间和空间进行估算。
在这里插入图片描述

空间分析
算法在运行过程中需要哪些存储空间?
1.输入/输出数据占用的空间 ---------取决于问题,与算法无关
2.算法本身占用的空间决于问题----------与算法无关与算法相关,大小固定

3.执行算法需要的辅助空间取决于问题-------与算法无关与算法相关,大小固定与算法相关,体现效率

代码示例:

1.
int CommonFactor(int m, int n)
{
}
2.
void BubbleSort(int r[ ], int n)
{
}
3.
void Equation(double a, double b, double c, double *p, double *q)
{
}

空间复杂度:算法在执行过程中需要的辅助空间数量
除算法本身和输入输出数据所占用的空间外,算法临时开辟的存储空间

空间复杂度也是问题规模的函数,通常记作:S(n) = O(f(n))

代码示例:

**空间复杂度:**
O(1)
void BubbleSort(int r[ ], int n)
{
	int j, temp, bound, exchange = n;
	while (exchange != 0)
	{
		bound =exchange;
		exchange = 0;
		for (j = 1; j < bound; j++)
		if (r[j] >r[j+1]){ 
			temp = r[j];
			r[j] =r[j+1];
			r[j+1] =temp;
			exchang
			e=j;
	}
}

O(n)
void Merge(int r[ ], int s, int m, intt)
{
	int r1[n];
	int i = s, j = m + 1, k =s;
{while (i <= m && j <= t)
	if (r[i] <= r[j]) r1[k++] =r[i++];
	
	else r1[k++] = r[j++];
}
	while (i <= m)
		r1[k++]=r[i++];
	while (j <= t)
		r1[k++]=r[j++];
	for (i = s; i < t; i++)
	r[i] = r1[i]; 
}

算法的时间复杂度分析

流程如下:
在这里插入图片描述

问题规模:输入量的多少?
基本语句:是执行次数与整个算法的执行次数成正比的操作指令。

代码示例:

for (i=1; i<=n; i++)
for (j=1; j<=n; j++)
x++;
问题规模:n
基本语句:x++

时间复杂度

算法的运行时间 = 基本语句的执行次数

如何计算算法中基本语句的执行次数呢?

1.注意到,几乎所有算法,对于规模更大的输入需要运行更长的时间
2.运行算法所需要的时间 T 是问题规模 n 的函数,记作T(n)
3.问题规模可以是多个变量 多元函数

如何表示算法的运行时间函数呢?
时间复杂度:当问题规模充分大时,算法中基本语句的执行
次数在 渐近意义下的阶——关注的是增长趋势

算法分析: 大O符号
定义 若存在两个正的常数c和n0,对于任意n≥n0,都有T(n)≤c×f(n),则称T(n)=O(f(n))。

如下:
在这里插入图片描述
T(n)和f(n)具有相同的增长趋势,T(n)的增长至多趋同于函数f(n)的增长

算法分析:增长率
定理1-1:若T(n) = amnm + am-1nm-1 + + a1n + a0是一个m次多项式, 则T(n) = O(nm)

如下:
在这里插入图片描述
关注增长率——忽略所有低次幂和最高次幂的系数


非递归算法分析

代码示例如下:
在这里插入图片描述
分析的策略是从内部(或最深层部分)向外展开

代码示例:
在这里插入图片描述
分析的策略是设其执行次数为T(n),则有2T(n) ≤ n,即T(n) ≤ log2n

常见的时间复杂度:

如下:
在这里插入图片描述
时间复杂度是在不同数量级的层面上比较算法
时间复杂度是一种估算技术(信封背面的技术)

最好情况、最坏情况、平均情况
例:在一维整型数组A[n]中顺序查找与给定值k相等
的元素(假设该数组中有且仅有一个元素值为k)。

代码示例:

int Find(int A[ ], int n)
{
for (i = 0; i < n; i++)
if (A[i] == k) break;
return i;
}

基本语句的执行次数是否只和问题规模有关?
结论:
如果问题规模相同,时间代价与输入数据有关,则需要分析最好情况、最坏情况、平均情况。
最好情况:出现概率较大时分析
最差情况:实时系统
平均情况:已知输入数据是如何分布的,通常假设等概率分布


总结

提示:知识构图
在这里插入图片描述

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值