数据-算法

数据结构

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、数据结构的定义

数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及他们之间的关系和操作等相关问题的学科

二、结构

1.逻辑结构和物理结构

	逻辑结构:是指数据对象中数据元素之间的相互关系,也是我们今后最需要关注和讨论的问题
	物理结构:是指数据的逻辑结构在计算机中的存储形式

2.数据元素的存储结构形式

	1.顺序存储结构:是把数据元素存放在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的。
	2.链式存储结构:是把数据元素存放在任意的存储单元里,这组存储单元可以是连续的,也可以是不连续的。

代码如下(示例):

算法

前言

算法的五个特性:
	1、有穷性:有限时间内能执行完(算法是又穷的   程序可以是无穷的)
	2、确定性:相同输入智慧产生相同输出
	3、可行性:可以用已有的基本操作实现算法
	4、输入:丢给算法处理的数据
	5、输出:算法处理的结果
好算法的特质:
	1、.正确性:能正确解决问题
	2、可读性:对算法的描述要让其他人也看得懂
	3、健壮性:算法能处理一些异常状况
	4、高效率与低存储量需求:省内存   时间空间复杂度低

一、算法效率的度量

1.算法时间复杂度定义

:在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析随T(n)的变化情况并确定T(n)的数量级。记作:T(n)=O(f(n))

① 线性阶
例子:1+2+…+100=?

//第一种算法:
int i,sum = 0,n = 100;		//执行1次
for(i = 1;i <= n;i++)		//执行了n+1次(if判断)
{
	sum sum + i;			//执行n次
}
//第一种算法执行了1+(n+1)+n=2n+2次

② 平方阶

int i,j,n = 100;
for( i = 0; i < n; i++)
{
	for(j = i;j < n; j++)
	{
		printf("a");
	}
}
//分析:由于当i=0时,内村换执行了n次,当i=1时,内循环执行n-1次....所以总的次数:n+(n-1)+(n-2)+..1=n(n+1)/2=n*2/2+n/2

保留最高项O(n^2)
③ 对数阶

int i = 1, n = 100;
while(i < n){
	i = i * 2
}	
//分析:由于每次i*2之后,就离n更近一步,假设有x个2相乘后大于或等于n,则会退出循环。
于是2^x=n得到x=log(2)n所以时间复杂度为O(logn).

O(logn)

注:常用的时间复杂度所耗费的时间从小到大依此是:
O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n)

2、算法的空间复杂度:
通过计算算法所需的存储空间实现,算法的空间复杂度的计算公式:S(n)=O(f(n)),其中,n为问题的规模,f(n)为语句关于n所占存储空间的函数。

二、线性表

定义:由零个或多个数据元素组成的有限序列
注:
①首先是一个序列,也就是说元素之间由先来后到
②若元素存在多个,则第一个元素无前屈,最后一个元素无后继,其他元素都有且只有一个前驱和后继。
③另外,线性表强调是有限的。

1.线性表的存储结构
①线性表的顺序存储结构
定义:指的是用一段地址连续的存储单元依次存储线性表的数据元素。
②线性表的链式存储结构
定义:是用一组任意的存储单元存储线性表的数据元素,这组存储单元可以存在内存种未被占用的任意位置
注:链表的第一个结点的存储位置叫头指针,最后一个结点指针为NULL

基本操作

InitList(&L):初始化表。构造一个空的线性表L,分配内存空间。
DestroyList(&L):销毁操作。销毁线性表,并释放线性表L所占用的内存空间

ListInsert(&L,i,e):插入操作。在表L种的第i个位置上插入指定元素e.

在这里插入图片描述
在这里插入图片描述

插入操作的时间复杂度
在这里插入图片描述

ListDelete(&L,i,&e):删除操作。删除表L种的第i个位置的元素,并用e返回删除元素的值。

在这里插入图片描述
删除操作的时间复杂度

在这里插入图片描述

LocateElem(L,e):按值查找操作。在表L种查找具有给定关键字值的元素。

在这里插入图片描述
按值查找复杂度:

在这里插入图片描述

GetElem(L,i):按位查找操作。获取表L种第i个位置的元素的值。

在这里插入图片描述
按位查找的时间复杂度O(1)

其他常用操作:

Length(L):求表长。返回线性表L的长度,即L种数据元素的个数。
PrintList(L):输出操作。按前后顺序输出线性表L的所有元素值。
Empty(L):判空操作。诺L为空表,则返回true,否则返回false.

1、顺序表

定义:用顺序存储的方式实现线性表顺序存储。

实现—静态分配
在这里插入图片描述
实现—动态分配
在这里插入图片描述

C   函数:
	malloc(sizeof(ElemType)*InitSize)//申请  InitSize初始大小
   	free  //释放

2、单链表

定义:
在这里插入图片描述
在这里插入图片描述

按位序插入(带头节点)
在这里插入图片描述
按位序插入(不带头节点)
在这里插入图片描述
按位序删除(带头节点)
在这里插入图片描述

按位查找
在这里插入图片描述

按值查找
在这里插入图片描述

红黑树

性质

①每个结点不是红色就是黑色
②不可能有连在一起的红色结点
③根结点都是黑色 root
④每个红色结点的两个子结点都是黑色,叶子节点都是黑色:出度为0满足了性质就可以近似的平衡了,不一定要红黑,可以为其他的

注:旋转和颜色变换规则:所有插入的点默认为红色
1.变颜色的情况:当前结点的父亲是红色,且她的祖父结点的另一个子节点也是红色(叔叔结点):
(1)把父节点设为黑色
(2)把叔叔也设为黑色
(3)把祖父也就是父亲的父亲设为红色(爷爷)
(4)把指针定义到祖父结点设为当前要操作的(爷爷)分析的点变换的规则

2.左旋

条件:当前父节点是红色,叔叔是黑色的时候,且当前

3.右旋

条件:当父节点是红色,叔叔是黑色的时候,且当前的结点是左子树,右旋
(1)把父节点变成黑色
(2)把祖父节点变成红色(爷爷)
  (3)	 以祖父结点旋转(爷爷)	

的结点是左子树,左旋以父节点作为左旋

例子

在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值