当前位置: 首页 > 编程日记 > 正文

数据结构与算法:01 绪论

绪论

知识结构:

知识结构


一、什么是数据结构

例1:电话号码薄的查询问题。

(a1,b1),(a2,b2),…,(an,bn)(a_1,b_1),(a_2,b_2),\dots,(a_n,b_n) (a1,b1),(a2,b2),,(an,bn)

aia_iai:表示姓名,bib_ibi:表示电话号码,i=1,2,…,ni=1,2,\dots,ni=1,2,,n

思考:

  • 怎样组织数据?
  • 怎样存储数据?
  • 怎样操作数据?
    • 添加操作
    • 删除操作
    • 修改操作
    • 查询操作
    • 排序操作
  • 怎样代码实现?

解决方案

例2:学生自然情况查询问题。

思考:

  • 怎样组织数据?
  • 怎样存储数据?
  • 怎样操作数据?
    • 添加操作
    • 删除操作
    • 修改操作
    • 查询操作
    • 排序操作
  • 怎样代码实现?

解决方案

数据结构的定义(Data Structure)

语言描述:数据结构是研究数据的逻辑结构,存储结构(物理结构)以及它们之间的关系,并对这种结构定义相适应的运算,设计出相应的算法。

形式化描述:数据结构是一个二元组

Data_Struct=(D,R)Data\_Struct=(D,R) Data_Struct=(D,R)

其中,DDD:是数据元素的有限集合, RRR:是DDD上关系的有限集合。

例3:集合结构。

Set=(D,R)Set=(D,R)Set=(D,R) 其中,D={item1,item2,item3,item4,itme5}D=\lbrace item_1,item_2,item_3,item_4,itme_5 \rbraceD={item1,item2,item3,item4,itme5}R={}R=\lbrace \rbraceR={} (元素之间没有关系)。

比如:

  • Python语言中的 Set
  • C#语言中的 HashSet

例4:线性结构。

Line=(D,R)Line=(D,R)Line=(D,R)其中,R={<itme5,item1>,<item1,item3>,<item3,item4>,<item4,item2>}R=\lbrace <itme_5,item_1>,<item_1,item_3>,<item_3,item_4>,<item_4,item_2> \rbraceR={<itme5,item1>,<item1,item3>,<item3,item4>,<item4,item2>}(除了首尾结点,其余结点只有一个直接前驱,一个直接后继)。

比如:

  • Numpy 中的ndarray
  • C#语言中的数组
  • Matlab中的矩阵

二、基本概念与术语

1、数据(Data)

指所有能输入计算机中并被计算机程序处理的符号集合。

可以是数值数据,如整数、实数;也可以是非数值数据,如字符、文字、图形、声音等。

2、数据元素(Data Element)

数据的基本单位,也称为结点,顶点,记录。

在计算机程序中,通常被作为一个整体进行考虑和处理。

3、数据项(Data Item)

具有独立含义的最小标识单位,也称为字段(Field)。

例如:在数据库信息处理系统中,数据表中的一条记录就是一个数据元素。这条记录中的学生学号、姓名、性别、籍贯、出生年月、成绩等字段就是数据项。

可见:数据由数据元素组成,数据元素由数据项组成。

4、逻辑结构(Logic Structure)

对数据之间逻辑关系的描述。(独立于计算机)

逻辑结构

5、存储结构(Storage Structure)

逻辑结构在计算机存储器中的实现,即数据在计算机中的存放方式。

  • 顺序:利用数组对数据进行存储。
  • 链式:利用指针对数据进行存储。
  • 索引:利用索引表来定位数据的存储。
  • 散列:利用散列函数,根据数据元素关键字来定位数据的存储。

6、数据类型(Data Type)

数据类型是数据的取值范围和对数据进行操作的总和。

如:int、long、float、double、bool、char等

7、抽象数据类型(Abstract Data Type)

抽象数据类型由一组数据以及在该组数据上的一组操作组成。

抽象数据类型的格式定义如下:

ADT Name isData构成该抽象数据类型所必须的基本数据项OperationsConstructorInitial Values:赋给基本数据项的值Press:初始化对象Operation1Input:操作1要求用户输入的值PreCondition:系统执行操作1前的数据状态Press:操作1的解释说明Output:操作1结束后返回的数据PostCondition:系统执行操作1后的数据状态Operation2… …OperationN… …
End ADT Name

例5:矩形结构的ADT描述。

ADT Rectangle isDatafloat Lengthfloat WidthOperationsConstructorInitial Values:构造矩形时,赋长和宽的值。Press:初始化对象,给矩形的长和宽赋值。SetLengthInput:赋给变量Length的新值PreCondition:无Press:将矩形的长度值修改为新值Output:无PostCondition:矩形的长度值被修改SetWidthInput:赋给变量Width的新值PreCondition:无Press:将矩形宽度值修改为新值Output:无PostCondition:矩形的宽度值被修改GetAreaInput:无PreCondition:矩形的长度和宽度都大于零Press:得到矩形的面积Output:返回矩形面积的值PostCondition:无GetPerimeterInput:无PreCondition:矩形的长度和宽度都大于零Press:得到矩形的周长Output:返回矩形的周长PostCondition:无
End ADT Rectangle

一旦定义了矩形结构的ADT描述,就可以用代码进行实现了。

public class Rectangle
{public float Length;public float Width;public Rectangle(float length, float width){Length = length > 0 ? length : 0f;Width = width > 0 ? width : 0f;}public void SetLength(float length){Length = length > 0 ? length : 0f;}public void SetWidth(float width){Width = width > 0 ? width : 0f;}public float GetArea(){if (Length * Width == 0)throw new ArgumentOutOfRangeException("长度或宽度为零。");return Length * Width;}public float GetPerimeter(){if (Length * Width == 0)throw new ArgumentOutOfRangeException("长度或宽度为零。");return (Length + Width) * 2;}
}

三、算法与算法分析

1、算法的基本概念

1.1 算法的定义

为了解决某类特定问题而提出的一组有穷规则,即以某些值或值的集合为输入并产生某些值或值的集合为输出的一系列运算步骤。

1.2 算法的五个重要特性

  • 有穷性(Finity):经过有限的时间可以完成。
  • 确定性或无二义性(Unambiguousness):给相同的输入,即得到相同的输出。
  • 可行性(Realizability)
  • 输入(Input):至少有0个输入。
  • 输出(Output):至少1个。

1.3 算法设计的五点要求

  • 正确性(Correctness)
  • 可读性(Readability)
  • 健壮性(Robustness):具有很强的容错能力,对边界情况和异常情况做出处理。
  • 运行时间(Running Time)
  • 占用空间(Storage Space):完成功能的前提下,时间越少,空间越小,越好。

1.4 算法与程序的区别

  • 表现形式不同
    • 算法:自然语言、伪计算机语言等
    • 程序:计算机语言
  • 是否具备有穷性

2、算法分析

2.1 时间复杂度(Time Complexity)

1)算法耗费的时间

一个算法耗费的时间 = 算法中每条语句的执行时间之和

每条语句的执行时间 = 语句的执行次数×\times×语句执行一次所需的时间

一般认为每条语句执行一次所需的时间是单位时间,即:一个算法耗费的时间 = 所有语句的执行频数之和

例6:计算方阵An×n×Bn×nA_{n\times n}\times B_{n \times n}An×n×Bn×n 算法耗费的时间。

static double[,] MatrixMultiply(double[,] A, double[,] B, uint n)
{double[,] C = new double[n, n];             // 1for (int i = 0; i < n; i++)                 // n+1{for (int j = 0; j < n; j++)             // n*(n+1){C[i, j] = 0;                        // n*nfor (int k = 0; k < n; k++)         // n*n*(n+1){C[i, j] += A[i, k] * B[k, j];   // n*n*n}}}return C;                                   // 1
}

T(n)=2n3+3n2+2n+3T(n)=2n^3+3n^2+2n+3T(n)=2n3+3n2+2n+3

2)问题的规模

算法求解问题的输入量,一般用一个整数表示。

  • 矩阵求解问题,矩阵的阶数。
  • 图论问题,图的结点个数,边的条数。

3)算法的时间复杂度 T(n)T(n)T(n)

就是该算法的时间耗费,是关于问题规模nnn的函数。

n→∞n\to\inftyn时,与T(n)T(n)T(n)的同阶的简单函数称为算法的渐进时间复杂度。

例7: T(n)=2n3+3n2+2n+3T(n)=2n^3+3n^2+2n+3T(n)=2n3+3n2+2n+3

lim⁡n→∞2n3+3n2+2n+3n3=2\displaystyle \lim_{n \to \infty}{\frac{2n^3+3n^2+2n+3} {n^3}=2}nlimn32n3+3n2+2n+3=2

所以 T(n)=O(n3)T(n)=O(n^3)T(n)=O(n3)

例8:针对一个问题,设计算法A1A_1A1A2A_2A2其耗费时间T1(n)=100n2T_1(n)=100n^2T1(n)=100n2T2(n)=n3+n+1T_2(n)=n^3+n+1T2(n)=n3+n+1,当n→∞n\to\inftyn时,T1(n)=O(n2)T_1(n)=O(n^2)T1(n)=O(n2)T2(n)=O(n3)T_2(n)=O(n^3)T2(n)=O(n3),即算法A1A_1A1所耗费的时间远小于算法A2A_2A2,在宏观上可通过渐进时间复杂度表示算法的优劣。

一般,我们把渐进时间复杂度T(n)=O(f(n))T(n)=O(f(n))T(n)=O(f(n))简称为时间复杂度。f(n)f(n)f(n)表示算法中频数最大语句的频数。

例9:

int x = 0;
int y = 0;
for (int i = 0; i < n; i++)x++;
for (int j = 0; j < n; j++)for (int k = 0; k < n; k++)y++;

T(n)=O(n2)T(n)=O(n^2)T(n)=O(n2)

例10:

int i = 50;
int j = 60;
int temp = i;
i = j;
j = temp;

T(n)=O(1)T(n)=O(1)T(n)=O(1)

4)常见的时间复杂度

  • 常数阶:O(1)O(1)O(1)
  • 对数阶:O(log(n))O(log(n))O(log(n))
  • 线性阶:O(n)O(n)O(n)
  • 线性对数阶:O(nlog(n))O(nlog(n))O(nlog(n))
  • 平方阶:O(n2)O(n^2)O(n2)
  • 立方阶:O(n3)O(n^3)O(n3)
  • kkk方阶:O(nk)O(n^k)O(nk)
  • 指数阶:O(2n)O(2^n)O(2n)

5)最坏时间复杂度

例11:在数组A[n]中查找给定值k

static int Find(int[] A, int k)
{int i;for (i = 0; i < A.Length; i++) //(#)if (A[i] == k)break;return i == A.Length ? -1 : i;
}
  • A中没有与k相等的元素,则(#)的频数f(n)=n+1f(n)=n+1f(n)=n+1
  • A中第1个元素与k相等,则(#)的频数f(n)=1f(n)=1f(n)=1

最坏时间复杂度:最坏情况下的时间复杂度。

一般不特别说明,所讨论的时间复杂度,都指最坏时间复杂度。

2.2 空间复杂度(Space Complexity)

指该算法所耗费的存储空间,也是问题规模nnn的函数,渐进空间复杂度也常常称为空间复杂度。


后台回复「搜搜搜」,随机获取电子资源!
欢迎关注,请扫描二维码:



相关文章:

rar for linux缺少GLIBC_2.7

今天安装rar4.0 for linux&#xff0c;遇到了一个缺少GLIBC_2.7的问题&#xff0c;弄了好久才成功&#xff0c;记录一下&#xff0c;以备不时之需。 系统版本为CentOS 5.5。下载了rar4.0 for linux源码包&#xff0c;解压后&#xff0c;按照makfile文件的提示&#xff0c;进行安…

硅谷产学研的创新循环

在现代社会形态形成的几百年历史中&#xff0c;大学与产业界在分化的体制轨道中形成了各自不同的目标、结构和文化&#xff0c;有关大学与产业合作的种种争议无不缘自于此。今天当知识和技术逐步取代了自然资源和简单劳动力资源而成为首要的创造财富的源泉时&#xff0c;产业界…

java技术培训之File类中常用的构造方法

File类用于封装一个路径&#xff0c;这个路径可以是从系统盘符开始的绝对路径&#xff0c;如&#xff1a;“D:\file\a.txt”&#xff0c;也可以是相对于当前目录而言的相对路径&#xff0c;如&#xff1a;“src\Hello.java”。File类内部封装的路径可以指向一个文件&#xff0c…

数据结构与算法:02 C#语言基本语法结构

02 C#语言基本语法结构 知识结构&#xff1a; 1、数据类型 第一种分类&#xff1a; 简单数据类型&#xff1a;byte、short、int、long、float、double、char、bool组合数据类型&#xff1a;struct、enum、class、interface 类型描述byte无符号8位整型(ushort) short&#x…

积少成多 Flash(ActionScript 3.0 Flex 3.0) 系列文章索引

[源码下载]积少成多 Flash(ActionScript 3.0 & Flex 3.0) 系列文章索引作者&#xff1a;webabcdFlash 之 ActionScript 3.0 1、积少成多Flash(1) - ActionScript 3.0 基础之数据类型、操作符和流程控制语句介绍Flash ActionScript 3.0 中所有的数据类型都是对象&#xff0c…

WPF Snoop 2.7 源码研究

转载于:https://www.cnblogs.com/puncha/archive/2012/04/01/3877001.html

java培训基础知识都学哪些

很多人都开始学习java技术&#xff0c;觉得java语言在未来的发展前景空间非常大&#xff0c;事实却是如此&#xff0c;那么针对于零基础的同学&#xff0c; 学习java技术需要学哪些呢?下面我们就来看看java培训基础知识都学哪些? java培训基础知识都学哪些? 1.JavaWeb Linux…

数据结构与算法:03 C#面向对象设计 I

03 C#面向对象设计 I 知识结构&#xff1a; 1、类与对象 类&#xff1a;用高级程序语言实现的一个ADT描述。对象&#xff1a;通过类声明的变量。 2、封装 2.1 什么是封装 把类的内部隐藏起来以防止外部看到内部的实现过程。 2.2 怎样封装 通过限制修饰符private、protect…

Centos7安装编译安装zabbix2.219及mariadb-5.5.46

mariadb-5.5.46的安装&#xff1a; 首先下载mariadb-5.5.46-linux-x86_64.tar.gz&#xff0c;然后使用tar -xf mariadb-5.5.46-linux-x86_64.tar.gz -C /usr/local目录下 添加数据库组 # groupadd mysql 添加数据库用户 # useradd -g mysql mysql cd /usr/local ln -sv…

软件测试开发:常见测试类型概念

软件测试是软件开发中非常重要的一个环节&#xff0c;软件测试工程师需要对每个环节进行严格把控&#xff0c;才能保证系统在每个阶段得以控制。下面小编就为大家详细介绍一下软件测试开发:常见测试类型概念的相关内容。 软件测试开发:常见测试类型概念&#xff1a; (1)边界测试…

技术图文:C#语言中的泛型 I

C#语言中的泛型 I 知识结构&#xff1a; 1. 泛型概述 泛型广泛应用于容器&#xff08;Collections&#xff09;和对容器操作的方法中。 从 .NET Framework2.0 开始&#xff0c;微软提供了一个新的命名空间System.Collections.Generic&#xff0c;其中包含了一些新的基于泛型…

ubuntu搭建svn、git遇到的问题及解决办法

不错的git笔记博客&#xff1a; http://www.cnblogs.com/wanqieddy/category/406859.html http://blog.csdn.net/zxncvb/article/details/22153019 Git学习教程&#xff08;六&#xff09;Git日志 http://fsjoy.blog.51cto.com/318484/245261/ 图解git http://my.oschina.net/x…

webstorm同时打开多个project方法

曾经多次碰到过想要打开多个project的时候&#xff0c;可每次打开其他项目时&#xff0c;必须选择新窗口还是替换次窗口&#xff0c;如果新窗口的话就无法跟现在的项目在同一个webstorm中同时进行编辑&#xff0c;需要来回切换窗口&#xff0c;很是不方便&#xff0c;今天无意中…

什么业务场景适合使用Redis?

Redis(Remote Dictionary Server )&#xff0c;即远程字典服务&#xff0c;是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。从2010年3月15日起&#xff0c;Redis的开发工作由VMware主持。从2013年…

Linux基础知识汇总(2)...持续更新中

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566软件安装: {软件安装的几种形式 rpm 由厂商提供二进制包 yum rpm源的前端管理器 src 源码包configure安装 bin 包含rpm和shell将安装一步执…

技术图文:C#语言中的泛型 II

C#语言中的泛型 II 知识结构&#xff1a; 6. 泛型接口 泛型类与泛型接口结合使用是很好的编程习惯&#xff0c;比如用IComparable<T>而非IComparable&#xff0c;以避免值类型上的装箱和拆箱操作。若将接口指定为类型参数的约束&#xff08;接口约束&#xff09;&#…

linux档案权限

Linux 下的档案当你对一个档案具有w权限时&#xff0c;你可以具有写入/编辑/新增/修改档案的内容的权限&#xff0c; 但并丌具备有删除该档案本身的权限&#xff01;对二档案的rwx来说&#xff0c; 主要都是针对『档案的内容』而觊&#xff0c;不档案档名的存在不否没有关系喔&…

新手UI设计师需要掌握的知识和技能

UI设计岗位在近几年的需求是越来越高的&#xff0c;很多零基础学员都开始学习UI设计技术&#xff0c;那么想要成为一名合格的UI设计师&#xff0c;新手UI设计师需要掌握的知识和技能是比较要会的&#xff0c;来看看下面的详细介绍。 新手UI设计师需要掌握的知识和技能&#xff…

数据结构与算法:04 C#面向对象设计 II

04 C#面向对象设计 II 知识结构&#xff1a; 5、属性 例1&#xff1a;属性概念的引入&#xff08;问题&#xff09; public class Animal {public int Age;public double Weight;public bool Sex;public Animal(int age, double weight, bool sex){Age age;Weight weight;S…

SharePoint迁移和升级方案

这是之前针对SharePoint迁移和升级写的方案&#xff0c;去掉了敏感的部分&#xff0c;共大家交流吧。SharePointMigrationSolution转载于:https://www.cnblogs.com/zhaojunqi/archive/2012/04/12/2444803.html

零基础如何掌握web前端开发技能

很多零基础学员想要进入到互联网行业都会选择web前端做首选技术语言来学习&#xff0c;但是学习web前端不是那么容易的&#xff0c;想要成为一名合格的web前端工程师&#xff0c;所要掌握的技能一定要会&#xff0c;下面小编就为大家详细的介绍一下零基础如何掌握web前端开发技…

数据结构与算法:05 Leetcode同步练习(一)

Leetcode同步练习&#xff08;一&#xff09; 题目01&#xff1a;两数之和 题号&#xff1a;1难度&#xff1a;简单https://leetcode-cn.com/problems/two-sum/ 给定一个整数数组 nums 和一个目标值 target&#xff0c;请你在该数组中找出和为目标值的那 两个整数&#xff0c;…

用Asp.net实现简单的文字水印

经常看见MOP上有人贴那种动态的图片&#xff0c;就是把一个字符串作为参数传给一个动态网页&#xff0c;就会生成一个带有这个字符串的图片&#xff0c;这个叫做文字水印。像什么原来的熊猫系列&#xff0c;还有后来的大树和金条&#xff0c;都挺有意思。这东西看着挺好玩的&am…

yum国内镜像

Centos-7修改yum源为国内的yum源 国外地址yum源下载慢,下到一半就断了,就这个原因就修改它为国内yum源地址 国内也就是ali 与 网易 以centos7为例 ,以 修改为阿里的yum源 先确定有wget 备份本地yum源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo_…

HTML的标签分为哪几类?各标签语法格式是怎样的?

HTML的标签分为哪几类?各标签语法格式是怎样的?相信大家在学习HTML课程的时候&#xff0c;有讲到这方面的知识&#xff0c;根据标签的组成特点&#xff0c;通常将HTML标签分为两大类&#xff0c;分别是“双标签”、“单标签”&#xff0c;对它们的具体介绍如下。 1.双标签 双…

数据结构与算法:06 线性表

06 线性表 知识结构&#xff1a; 1. 线性表的定义与操作 1.1 线性表的定义 线性表&#xff08;Linear List&#xff09;是由n(n≥0)n (n≥0)n(n≥0)个相同类型的数据元素a0,a1,⋯,an−1a_0,a_1,⋯,a_{n-1}a0​,a1​,⋯,an−1​组成的序列。即表中除首尾元素外&#xff0c;其…

MySQL提权简单方法

前不久网上公开了一个MySQL Func的漏洞,讲的是使用MySQL创建一个自定义的函数,然后通过这个函数来攻击服务器。最早看到相关的报道是在o-otik上,但是公布的是针对 Unix系统的Exploit,并且成功率也不是很高.而近期,国内有高手放出针对Win系统的相关文章,于是我马上找来与朋友一同…

转载LINQ优点 自己学习用的

这几天在读一本LINQ方面的书《Essential LINQ》,在这里和大家分享下。 由于对LINQ的深入总结需要大量的篇幅&#xff0c;因此在这里分成几个部分来讲。 &#xff08;*我看《Essential LINQ》是英文版的&#xff0c;有些名词不能翻译成正统的中文解释请给予谅解&#xff09; LIN…

什么是Python?好学吗?

互联网IT行业是很多人都比较关注的行业&#xff0c;大部分都想学习IT技术进入到这个行业&#xff0c;Python编程语言在近几年是多数人的选择&#xff0c;那么什么是Python?好学吗?具体来看看下面的详细介绍吧。 一、什么是python 网络上对python的解释是一门解释型、面向对象…

数据结构与算法:07 Leetcode同步练习(二)

目录 题目01&#xff1a;回文数题目02&#xff1a;x 的平方根题目03&#xff1a;爬楼梯题目04&#xff1a;买卖股票的最佳时机题目05&#xff1a;买卖股票的最佳时机 II题目06&#xff1a;跳跃游戏题目07&#xff1a;三数之和题目08&#xff1a;最接近的三数之和题目09&#x…