数据结构与算法基础

article/2025/11/10 15:11:42

来源: bilibili数据结构与算法基础(青岛大学-王卓)

  1.2 基本概念和术语

 数据结构

数据元素之间的关系称为结构,数据结构是相互之间存在一种或多种特定关系的数据元素的集合。

数据结构的两个层次:逻辑结构和物理结构

逻辑结构:描述数据元素之间的逻辑关系,与数据的存储无关,独立于计算机,是数据结构的抽象

物理结构(存储结构):数据元素及其关系在计算机内存中的存储方式,是数据结构的实现

逻辑结构的种类

 划分方式二——四种基本逻辑结构

 线性结构(一对一)、树(一对多)、图(多对多)

存储结构的种类: 顺序,链式,索引,散列

 

 索引存储结构:存储结点信息时,建立附加的索引表,例如通讯录中根据首字母查找联系人

散列存储结构:根据结点的关键字直接计算出结点的存储地址

 1.3 基本概念与术语

 算法的时间复杂度

 

 

 

 时间复杂度T(n)按数量级递增顺序为:

 算法的空间复杂度

2.1 线性表的定义和特点

 同一线性表中的元素必有相同特性,数据元素之间的关系是线性的。

2.4 线性表的顺序表示和实现

 线性表顺序存储结构必须占用一片连续的存储空间。

#define max 10000
#define true 1
#define false -1
#define OVERFLOW -2//顺序表类型
typedef int eletype;
typedef struct{eletype* data;int length;
}sqlist;//初始化
int initlist(sqlist& l){l.data = new eletype[max];l.length = 0;if (!l.data)exit(OVERFLOW);return true;
}
//销毁
void destroylist(sqlist& l){if (l.data)delete l.data;
}
//清空
void clearlist(sqlist& l){l.length = 0;
}
//在线性表第i个位置插入新元素e
int listinsert(sqlist& l, int i, eletype e){if (i<1 || i>l.length + 1)return false;if (l.length == max)return OVERFLOW;for (int j = l.length - 1; j >= i-1;j--)l.data[j + 1] = l.data[j];l.data[i - 1] = e;l.length++;return true;
}
//删除第i个元素,返回删除元素的值
int listdelete(sqlist& l, int i){if (i<1 || i>l.length || l.length == 0)return false;for (int j = i; j <= l.length-1; j++)l.data[j-1] = l.data[j];l.length--;return true;
}
//顺序表是否为空
int isempty(sqlist& l){if (l.length == 0)return true;elsereturn false;
}
//返回顺序表长度
int getlength(sqlist& l){return l.length;
}
//查找与给定值相等的元素,返回该元素在表中的序号
int getlocation(sqlist& l, eletype e){for (int i = 0; i < l.length; i++){if (l.data[i] == e)return i + 1;}return false;
}
//将顺序表的第i个位置的元素返回给e
int getvalue(sqlist& l, int i, eletype& e){if (i<1 || i>l.length)return false;e = l.data[i - 1];return true;
}
void listshow(sqlist& l){for (int i = 0; i < l.length; i++)cout << l.data[i] << " ";cout << endl;
}

 顺序表查找、插入和删除算法的平均时间复杂度为O(n),顺序表操作算法的空间复杂度为O(1)

2.5 线性表的链式表示和实现

 

 

 

 

 顺序表(数组)是随机存取,链表是顺序存取

 

 

 

 

 销毁单链表L:

Status DestroyList_L(LinkList &L){Lnode* p;while(L){p=L;    //p指向头结点L=L->next;delete p;}return OK;
}

 

 

 求单链表的表长:

int ListLength(LinkList L){Lnode* p;p=L->next;//p指向第一个结点i=0;while(p) //遍历单链表,统计结点数{i++;p=p->next;}return i;
}

 单链表取值操作:

 如果p指向的结点为NULL( i 超出链表结点长度)或者 i=0,-1的情况出现,返回0

按值查找:1.返回值为e的数据元素地址;2.返回值为e的数据元素序号

 

 插入新结点:

 

  

 

   

 2.5.3 循环链表

 

  

 2.5.3 循环链表-两个链表合并

 

 2.5.4 双向链表

  

 

 

双向链表的插入

 双向链表的删除

 

 

 2.6 顺序表和链表的比较

 

 

 顺序表的存储密度=1,链表的存储密度<1,存储空间利用率较低

2.7 线性表的应用

线性表的合并

 

 有序表的合并-用顺序表实现

 

  

 

有序表合并-用链表实现

 

 2.8 案例分析与实现

实现两个多项式相加

 稀疏多项式的运算

 

 3.1 栈和队列的定义和特点

 栈只能在表尾插入和删除-后进先出,队列在队尾插入,在队头删除-先进先出

  3.2 案例引入

进制转换

 将十进制整数转换为其他进制数d,转换法则:除以d倒取余

括号匹配的检验 

 表达式求值

 

舞伴问题 

 3.3 栈的表示和实现

顺序栈的表示和实现

 

 上溢(overflow):栈满还要压入元素;下溢(underflow):栈空还要弹出元素

 

 初始化操作

 判断栈是否为空

求顺序栈的长度

 

 清空顺序栈

 销毁顺序栈

 顺序栈的入栈

顺序栈的出栈

链栈的表示与实现

 链栈的初始化

 判断链栈是否为空

 链栈的入栈

 链栈的出栈

取栈顶元素

 

 3.4 栈和递归

递归:一个过程直接或间接的调用自己

递归定义的数学函数

 具有递归性质的数据结构

 

 递归遵循——后调用先返回,要实现递归需要栈 

3.5 队列的表示与实现

队列——头删尾插

队列的顺序表示

 解决假溢出的方法——引入循环队列

队空队满都为front==rear

 

 判断队空队满——少用一个元素空间

队列的初始化

 求队列的长度

 入队操作

 出队操作

取队头元素

 队列的链式表示和实现

 

 链队列初始化

 销毁链队列

 链队列入队

 链队列出队

 求链队列的队头元素

 4.1 串的定义

 

 

4.3 串的类型定义、存储结构及运算

 

 4.3.3 串的模式匹配算法

BF算法

 

 

 

若主串长度为n,子串长度为m, BT算法的时间复杂度为O(n*m)

 

 

 


http://chatgpt.dhexx.cn/article/ShotsQ4U.shtml

相关文章

数据结构与算法基础(一)

大家好 我是makasa 这个栏目呢&#xff0c;我会按照我之前通过视频学习的一个笔记来记录. 同时,通过写这几篇blog来巩固一下我的基础 数据结构与算法&#xff0c;顾名思义&#xff0c;分为两个部分&#xff1a;数据结构、算法。那它们各自具体概述是什么呢。让我们看以下两个图…

【算法】算法基础

文章目录 1. 字符串1.1LeetCode151 Reverse Words in a String1.2LeetCode557 Reverse Words in a String III1.3统计字符串字母&#xff0c;数字&#xff0c;空格和其他字符个数1.4把字符串转换成整数1.5回文字符串 2.整数2.1LeetCode7 Reverse Integer2.2判断一个数是不是质数…

算法基础---基础算法

文章目录 快速排序归并排序二分 整数二分浮点数二分高精度 高精度加法高精度减法高精度乘法高精度除法前缀和 一维前缀和二维前缀和差分 一维差分二维差分双指针位运算离散化区间合并 一、快速排序 思想&#xff1a;1.首先确定一个分界点&#xff08;随机取任意一点为…

算法基础知识总结(基础算法)

算法基础知识总结 Efficient procedures for solving problems on large inputs. 一、基础算法 1、快速排序 1、类别&#xff1a;快速排序是一种 交换排序&#xff0c;冒泡排序也是一种交换排序。 2、原理&#xff1a;将未排序的元素根据一个作为基准的主元&#xff08;Pi…

算法基础知识

一、算法的定义 算法&#xff1a;对特定问题求解步骤的一种描述&#xff0c;是为解决一个或一类问题给出的一个确定的、有限长的操作序列。 二、算法与程序的区别与联系 区别&#xff1a; 程序&#xff1a;与某种编程语言有关&#xff0c;能直接在机器上运行。 算法&#xff1a…

算法基础简介

一、什么是算法 在数学领域&#xff0c;算法是为了解决某一类问题的公式和思想。 在计算机领域&#xff0c;本质是一些计算机指令&#xff0c;解决特定运算和逻辑问题。 算法的掌握程度&#xff0c;一方面可以检验程序员对计算机底层的了解&#xff0c;一方面也…

Unity 移动的几种方法(从某一点移动到另外一点)

对于unity的几种移动方法,在以下给出整理 1 方向*速度 2 vector.lerp 与目标点永远不会重合 3 vector.MoveTowards 会与目标点重合 4 translate方法 纯移动 5 WASD键盘方法 刚 体方法 7.鼠标方法 捕鱼达人 8.射线方法(指哪到哪) Controll…

Unity 控制物体移动

目录 1、通过改变物体的位置使物体移动 2、通过给物体施加力使物体移动 3、移动characterController以及碰撞检测 一、相关代码展示 1、通过改变物体的位置使物体移动 using System.Collections; using System.Collections.Generic; using UnityEngine;public class move …

unity3D人物移动的实现(一)

人物的移动&#xff0c;首先要考虑人物与地面的碰撞&#xff0c;碰撞发生的条件是&#xff0c;两者必须都为碰撞体&#xff0c;且至少有一方为刚体&#xff0c;为了方便&#xff0c;我们就给人物加上刚体属性和碰撞体。 1首先是碰撞体属性&#xff0c;人形使用胶囊碰撞体&#…

Unity让物体跟随鼠标移动

前言 最近在学习Unity&#xff0c;记录下学习的成果吧。本文最终结果是要实现一个小飞机跟随鼠标移动的效果。看下图片。 向量 在Unity中&#xff0c;每个对象都有自己的位置属性&#xff0c;组件叫做Transform,通过Transform可以获取对象的位置属性。在上面的实例中&#…

01_Unity常用的移动方法

文章目录 基础框架匀速移动变速移动自定义变速运动总结&#xff1a; 在制作一款游戏的时候&#xff0c;经常需要对物体的位置进行移动&#xff0c;我们希望这个移动是具有多样性的&#xff0c;并且可操作的。 C#中提供了非常丰富的移动代码工具&#xff0c;通过这些工具我们可以…

Unity点击物体后,移动到物体所在位置

Unity点击物体后&#xff0c;移动到物体所在位置 方法一&#xff1a;OnMouse检测&#xff08;需要Collider组件&#xff09; 脚本挂在被点击的物体上 using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement;/// <summary> /// 缺点…

Unity2D教程:人物移动

关注专栏&#xff0c;持续更新哦 教程总目录 按键 自带的Input有GetAxisRaw来获取按下按键后所对应的值&#xff0c;Input.GetAxisRaw(“Horizontal”)在按下D或右箭头返回1&#xff0c;A或左箭头返回-1&#xff1b;Input.GetAxisRaw(“Vertical”)同理。 Input.GetAxis会根…

Unity物体跟随鼠标移动

刚开始在将鼠标点转换为世界坐标时&#xff0c;我以为可以直接使用Unity的Camera.main.ScreenToWorldPoint( Input.mousePosition ) 就完事了&#xff0c;事实证明我想的太简单了。在我们使用这个API将鼠标屏幕点&#xff08;Screen&#xff09;转换成世界坐标&#xff08;Worl…

Unity中物体移动方法详解

一&#xff1a;Transform ——transform.Translate&#xff1a;不会考虑到碰撞transform.Translate(Vector3 targetPos&#xff0c;指定参照坐标系(默认为Space.Self)) ——transform.position&#xff1a;直接改变物体的坐标 二&#xff1a;刚体 ——MovePosition ——veloc…

【Unity】如何优雅地移动物体-8个方法

在游戏开发中&#xff0c;如何移动物体&#xff1f;是我们需要思考的事情。 Unity 引擎也提供了众多的方法&#xff0c;每个开发者的使用习惯也各不相同&#xff0c;所以往往不是很清楚在这种场景下哪种方式最好的或者最有效的。 那么&#xff0c;这篇文章&#xff0c;我想分享…

详解Unity的几种移动方式实现

前言 最近在学习如何制作 FPS 游戏&#xff0c;学习了如何使用角色控制器来控制角色的移动跳跃等等&#xff0c;结合之前学到的使用 transform&#xff0c;刚体等使物体移动&#xff0c;不同的移动方式适用于不同的场景&#xff0c;今天就来简要盘点一下各种移动方式以及其优劣…

unity物体四种移动方法总结

目录 一.通过修改位置来实现移动 二.通过物理系统实现位移 三.通过输入控制物体移动 一.通过修改位置来实现移动 利用修改Transform组件的position的两种常用方法。 1.使用Translate&#xff08;&#xff09;函数。 2.&#xff0c;直接指定新的位置 将上述两种方法在void …

详解Unity的移动控制实现

前言 上一篇写了数种Unity中的移动方式&#xff0c;有物理移动&#xff0c;有非物理移动等&#xff0c;这篇我们来谈谈Unity中的移动控制方式&#xff0c;来结合上一篇所说的方法&#xff0c;用起来。一般控制是通过获取用户输入来处理角色移动逻辑的&#xff0c;而用户输入的…

JSON数据和解析

JSON> JavaScript Object Notation JSON是一个字符串 常常用于网络传输数据的一种字符 json数据是一种轻量级的数据交换格式&#xff0c;它基于一个子集&#xff0c;采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语…