数据结构与算法总结(上)

开发工具与关键技术:

作者:Mr_恺

撰写时间:2020.5.6

 

1.1:即使是在广泛采用可视化程序设计的今天,借助于集成开发环境可以很快地生成程序,但要想成为一个专业的程序开发人员,至少需要以下三个条件

(1)能够熟练地选择和设计各种业务逻辑的数据结构和算法

(2)至少能够熟练地掌握一门程序设计语言

(3)熟知所涉及相关应用领域知识

  1. 算法+数据结构=程序

1.2:数据结构:

  1. 数据结构中,把数据结构从逻辑上分成线性结构和非线性结构。

一、逻辑结构

     (1)线性结构:结构中的数据元素之间存在着一对一的线性关系。

(除第一个和最后一个数据元素外,每个数据元素只有一个前驱和一个后续数据元素。)

     (2)树结构:结构中的数据元素之间存在着一对多的层次关系。

(除根节点外,每个元素只有一个前驱数据元素,可有0个或若干个后续数据元素。)

        (3)图结构:结构中的元素之间存在着多对多的任意关系。

(每个数据元素可有0个或若干个前驱数据元素和0个或若干个后续数据元素。)

二、逻辑结构的延伸基本算法

三、物理结构

四、运算集合(基本操作)

1.3:算法

算法是解决问题的方法,是程序设计的精髓,程序设计的实质就是构造解决问题的算法。算法的设计取决于数据的逻辑结构,算法的实现取决于数据的物理存储结构。

  • 算法的概念

算法是对特定问题求解步骤的一种描述,它是指令的有限序列。

  • 特征

五个特性(有穷性、确定性、可行性、输入、输出)

  • 设计要求

(正确性、可读性、健壮性、效率与地存储量需求)

四、算法分析

(1)算法效率的质量

(1.算法本身选用的策略、2.书写程序的语言、

3.编译产生的代码质量、4.机器执行指令的速度、5.问题的规模)

(2)算法的时间复杂度

(1.常量阶时间复杂度、2.线性阶时间复杂度、3.平方阶时间复杂度)

(3)算法的空间复杂度

2.1:线性表

一、特征:

1.在非空的线性表,有且仅有一个开始结点a1,它内有直接前趋,而仅有一个直接后继a2.

2.有且仅有一个终端结点an,它没有直接后继,而仅有一个直接前趋an-1;

3.其余的内部结点ai(2≦i≧n-1)都有且仅有一个直接前趋ai-1和一个直接后继ai+1。

 

二、线性表的基本运算:

  1. 求表长——求线性表中元素个数
  2. 遍历——从左到右(或从右到左)扫描(或读取)表中元素
  3. 按编号查找——找出表中第i个元素
  4. 按特征查找——按某个特定值查找线性表
  5. 插入——在第i个位置上(即原第i个元素前)插入一个新元素
  6. 删除——删除原表中的第i个元素
  7. 排序——按元素某特征值的递增(或递减)排序,重排表中各元素

2.2:线性表有两种存储方式

  1. 一种顺序的形式
  2. 一种链序的形式

2.3:顺序表

顺序表一般表现为数组,使用一组地址连续的存储单元依次存储数据元素

(1)长度固定,必须在分配内存之前确定数组的长度。

(2)存储空间连续,即允许元素的随机访问。

(3)存储密度大,内存中存储的全部是数据元素。

(4)要访问特定元素,可以使用索引访问,时间复杂度为O(1).

(5)要想在顺序表中插入或删除一个元素,都涉及到之后所有元素的移动,因此时间复杂度为O(n).

 

2.3:单链表的结构:

    1. 单链表组成有两个域:一个是数据域,一个是指针域。
    2. 单链表中构成链表的结点只有一个指向直接后继结点的指针域。
    3. 其结构特点:逻辑上相邻的数据元素在物理上不一定相邻。
    4. 单链表是只包含指向下一个节点的指针,只能单向遍历。5
    5. 双链表即包含指向下一个节点的指针,也包含指向前一个节点的指针,因此可以双向遍历。
    6. 循环单链表则是将尾节点与首节点链接起来,形成了一个环状结构,在某些情况下会非常有用。
    7. 由于链表是使用指针将节点连起来,因此无需使用连续的空间,它具有以下特点:

(1)长度不固定,可以任意增删。

(2)存储空间不连续,数据元素之间使用指针相连,每个数据元素只能访问周围的一个元素(根据单链表还是双链表有所不同)。

(3)存储密度小,因为每个数据元素,都需要额外存储一个指向下一元素的指针(双链表则需要两个指针)。

(4)要访问特定元素,只能从链表头开始,遍历到该元素,时间复杂度为O(n) 

(5)在特定的数据元素之后插入或删除元素,不涉及到其他元素的移动,因此时间复杂度为O(1)

(6)双链表还允许在特定的数据元素之前插入或删除元素

 

3.1:栈

(一)栈的定义:

  1. 堆栈简称为栈,是限定只能在表的一端进行插入和删除操作的线性表。
  2. 堆栈的特点是”后进先出“。

(二)栈的基本运算:

  1. StackInit()初始化堆栈
  2. StackEmpty(S)判定栈是否为空
  3. StackLength(s)求堆栈s的长度
  4. GetTop(S)获取栈顶元素的值
  5. Push(s,e)将元素e进栈
  6. Pop(S),出栈(删除栈顶元素)

(三)栈的存储结构:

  1. 顺序栈——采用顺序结构存储
  2. 链栈——采用链式结构存储

3.2:队列的定义:

  1. 队列简称为队,是限定只能在表烦人一端作插入运算,在另一端做作删除运算的线性表。
  2. 队列的存储结构:
  1. 顺序队列——采用顺序结构存储
  2. 链式队列——采用链式结构存储
  1. 判断队列为空:

初始化时:fornt=rear=0

循环队列为空的条件是:fornt=rear

 

  1. 循环队列为满的条件是:fornt==(rear+1)%MaxSize

 

 

4.1  串的定义

串是字符串的简称。在数据结构中,串是一种在数据元素的组成上具有一定约束条件的线性表,即要求组成线性表的所有数据元素都是字符,所以说串是一个有穷的字符序列

4.1.1  定义

串是由零个或多个字符组成的有限序列,记作s=s0s1sn-1(n0),其中s是串名,字符个数n称作串的长度,双撇号括起来的字符序列s0s1sn-1是串的值。每个字符可以是字母、数字或任何其它的符号。零个字符的串(即:””)称为空串,空串不包含任何字符。值得注意的是:

(1)长度为1的空格串" "不等同于空串""

(2)值为单个字符的字符串不等同于单个字符,如"a"与′a′;

(3)串值不包含双撇号,双撇号是串的定界符。

串中任意个连续的字符组成的子序列称为该串的子串。包含子串的串则称为主串。通常将字符在串中的序号称为该字符在串中的位置。子串在主串钟的位置则以该子串在主串中的第一个字符位置来表示。为了让大家更好的理解子串,举个简单的例子说明。如:

s="I am from Canada.";

s1="am.";

s2="am";

s3="I am";

s4="I am ";

s5="I am";

s2s3s4s5都是s的子串,或者说ss2s3s4s5的主串,而s1不是s的子串。s3等于s5s2不等于s4s的长度是17s3的长度是4s4的长度是5

 

4.1.2  串的基本算法

串的基本算法在串的应用中广泛使用,这些基本算法不仅加深了对串的理解,更简化了日后对串的应用。下面还是通过举例介绍串的常用基本算法。

假设有以下串:s1="I am a student"s2="teacher"s3="student",常用的串的基本运算有下列几种:

(1)Assign(s,t),将t的值赋给s

(2)Assign(s4,s3)Assign(s4,"student")后,s4"student"

(3)Length(s),求s的长度。

(4)Length(s1)14Length(s3)7

(5)Equal(s,t),判断st是否相等。

(6)Equal(s2,s3)falseEqual("student",s3)true

(7)Concat(s,t),将t连接到s的末尾。如:Concat(s3, " number")= "student number"

(8)Substr(s,i,len),求子串。如:Substr(s1,7,7)= student”,Substr(s1,10,0)= “”, Substr(s1,0,14)= "I am a student"

(9)Insert(s,i,t),在s的第i个位置之前插入串t。 Insert(s3,0,"good_")后,s3"good_student"

(10)Delete(s,i,len),删除子串。ss=“good_student”,Delete (ss,0,5)后,ss"student"

(11)Replace(s,u,v),子串替换,即将s中的子串u替换为串v。 Replace(s1,s3,s2)后,s1=I am a teacher”,Replace(s1,worker,s2)s1的值不变。 若ss=“abcbcbc”,则:Replace(ss,cbc,x)后,ss"abxbc"Replace(ss,"cb","z")后,ss"abzzc"

(12)index(s,t),子串定位,即求子串t在主串s中的位置。 index(s1,s3)=7index(s1,s2)=1index(s1, "I")=0

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值