一.算法
算法是解题方案的完整且准确的描述,是一系列解决问题的清晰指令.算法不等于数学上的计算方法,也不等于程序.
常见的算法设计方法有列举法,归纳法,递推法和递归法等.
在算法设计时,不能只考虑算法的效率,还要考虑其他因素.
算法的特性:
可行性:算法的每一个步骤必须能够实现,且执行的效果能够达到预期的目的.
确定性:算法的每一个步骤都有他确定的含义,不存在一个步骤有多个含义的情况.不允许有模棱两可的解释,也不允许有多义性.
有穷性:算法必须在有限时间内完成,即算法必须能在执行有限个步骤之后终止.
拥有足够的情报:一个有效的算法应该有足够多的,正确的输入信息或初始化信息,并且至少有一个输出结果.
算法的复杂度:
算法的复杂度主要包括时间复杂度和空间复杂度,但两者之间没有直接的联系
时间复杂度:执行算法所需要的计算工作量,即算法语句的执行次数.
空间复杂度:算法在执行过程中所需要的计算机存储空间.包括程序本身所占的存储空间,输入数据所占的存储空间,算法执行过程中所需要的额外空间.
如果额外空间量相对于问题规模(即输入数据所占的存储空间)来说是常数,即额外空间量不随问题规模的变化而变化,则称该算法是原地工作的.
二.数据结构
数据结构,即带有"结构"的数据元素的集合.一般来说,现实世界中客观存在的一切个体都可以是数据元素.例如,"春,夏,秋,冬"可以作为季节的数据元素.
在数据处理时,通常把元素之间的特殊关系称为前后件关系.以季节为例,在考虑一年四季的时间顺序关系时,"春"就是"夏"的前件,"夏"是"春"的后件
数据结构的两种表示方法:
二元组表示: B=(D,R)
D=(春,夏,秋,冬)
R={(春,夏),(夏,秋),(秋,冬)}
图形表示:春->夏->秋->冬
二元组表示: B=(D,R)
D={司令员,军长,师长,旅长}
R={(司令员,军长),(军长,师长),(师长,旅长)}
图形表示:
逻辑结构:
数据的逻辑结构是指反映数据元素之间逻辑关系(前后件关系)的数据结构.
数据的逻辑结构分为线性结构和非线性结构
存储结构:
数据的逻辑结构在计算机存储空间中的存放形式被称为数据的存在结构,也可以称为数据的物理结构.
常见的数据结构有顺序结构,链式结构,索引结构和散列存储等
简单记忆:顺着链子索引小三
数据结构的分类:
->线性结构 例:线性表,栈,队列,矩阵,二维表
->逻辑结构 ->非线性结构 例:树,二叉树,图,广义表
数据结构:
->存储结构 ->顺序存储 例:顺序表
->链式结构 例:线性链表,带链的栈,带链的队
->索引存储
->散列式存储
三.线性表
线性表概念:
线性表是一种逻辑结构,它是最简单,最常用的一种数据结构.在线性表中,数据元素之间是一对一的关系.
a1 | a2 | a3 | a4 | ... | an | |
1 | 2 | 3 | 4 | n |
线性表是由n(n>=0)个相同数据元素组成的一个有限序列,将其表示为:(a1,a2,a3....an)
其中a1,a2,a3....an表示n个数据元素,a1为表头元素,也叫根节点,an表尾元素,也叫终端节点
线性表的特性:
非空线性表的结构特征:
①有且只有一个根结点a,他无前件
②有且只有一个终端结点an,他无后件
③线性表的结点个数就是该线性表的长度.
当n=0时,线性表为空表.
线性表的顺序存储----顺序表
将线性表的数据元素存储在一组地址连续的存储单元里,使得逻辑上相邻的两个元素在物理位置上也相邻,称为线性表的顺序存储,又称顺序表.
在顺序表中可以进行插入,删除,修改和查询数据元素等操作,常用的操作是插入和删除
顺序表的插入操作:
在顺序表中插入元素时,首先需找到要插入元素的位置.如果该位置上没有其他元素,则直接插入新元素;若该位置上有元素,需将该位置上的元素及其后面的元素向后移动,空出需要插入元素的位置,最后将新元素插入到指定的位置上.
当线性表的存储空间已满时,不能再继续插入新元素.若继续插入,则会产生"上溢"错误
顺序表的删除操作:
在线性中删除已有的元素,然后将删除元素之后的所有元素依次向前移动相应个位置,并减少线性表的结点数.
若线性表为空时,不能再进行数据元素的删除,如继续删除,则会缠上"下溢"错误
线性表的链式存储--线性链表
线性表的链式存储结构称为线性链表,用一组地址任意的存储单元存放线性表中各个数据元素,不要求逻辑上相邻的两个元素在物理位置也相邻.
链式存储结构中的结点通常由两部分组成,用于存放数据的部分称为数据域,用于存放指针的部分称为指针域.
线性链表又分为了单向链表,双向链表,循环链表
单向链表
单向链表是链表的一种,它的指向是单向的,对链表的访问是从头部开始顺序读取元素,其每个结点都是指针成员变量指向列表中的下一个结点.单项链表的head指针指向第一个成为表头结点,而终止于最后一个指向NULL的指针.
示意图:head->a1 ->a2 ->a3 ->a4^
双向链表:
双向链表有两个指针域,一个指向前件结点,一个指向后件结点.指向前件结点的指针称为左指针(Llink),指向后件结点的指针称为右指针(Rlink).
示意图:head->a1->a2->a3->a4^
<- <- <- -<
循环链表:
循环链表是将表中最后一个结点的指针域指向结点,使整个链表形成一个环.
在循环链表中,只要知道任意结点的位置,都可以从该结点位置出发,访问表由所有的结点.
循环链表插入和删除元素比单向链表更加简单.表头结点是循环链表中固有的结点,即使表中没有数据,表中至少都还有一个表头结点,这样就实现了空表和非空表运算的统一.
示意图:
head-> ->a1->a2->a3->a4->这里指向
线性链表常用的基本运算操作有插入,删除,查找.