首页 > 编程语言 >数据结构与算法

数据结构与算法

时间:2024-05-28 22:46:41浏览次数:16  
标签:线性表 算法 查找 二叉树 数据结构 节点

数据结构与算法

导航

目录

一、数据结构与算法概念

数据结构的定义

数据结构的概念:数据元素的集合,以及这些数据元素之间的关系,和它的构造方法

数据逻辑结构:

  • 线性结构(1对1)
  • 非线性结构(1对多)

算法

算法的5个重要特性

  1. 有穷性:执行有穷步之后结束,且每一步都可在有穷时间内完成。
  2. 确定性:算法中每一条指令都必须有确切的含义,不能含糊不清。
  3. 输入(>=0)
  4. 输出(>=1)
  5. 有效性(可行性):算法的每个步骤都能有效执行并能在执行有限次后例如a=0,b/a就无效得到确定的结果。

伪代码

伪代码:是一种算法描述语言,介于自然语言与编程语言之间,不用拘泥于具体的实现

二、线性表

线性表

线性表的概念:连续的序列(数据类型提相同)\(a_1,a_2,...,a_n\)

线性报常见的两种存储结构(物理结构)

  1. 顺序存储结构(顺序表)
    • 优点:查找效率高
    • 缺点:插入删除慢
    • 可以随机访问表中任意节点
  2. 链式存储结构(单链表、循环链表、双向链表)
    • image-20240505152707818
    • 适合删除、插入操作,且不会移动元素
    • 从头指针开始比对结点
  3. 链表的基本操作
    • 单链表删除结点
    • 单链表插入结点
    • 双向链表删除结点
    • 双向链表插入结点

三、队列与栈

  • 有栈顶和栈底
  • 先进后出

  • 有队尾和队头
  • 先进先出

循环队列

  • 为空head = tail
  • 为满
    1. 留一个空,head =tail%max *size +1

把握出栈、入栈不同顺序来判断有哪些入栈顺序(可以入俩个,出一个之后再入一个,最后全出)

四、窜

广义表

广义表是n个表元素组成的有限序列,是线性表的推广

广义表长度

  • 最外层括号去掉,逗号输+1就是长度(只需要数最外层的逗号)
    • LS1=(a, (b, c), (d, e))
      • =a, (b, c), (d, e)
      • 现在共有4个逗号,但是不用加括号里面的逗号,所以长度是2+1=3

广义表深度

  • 深度就是最里面的括号是属于被包着的第几层括号
    • LS1=(a, (b, c), (d, e))
      • 这里的(b, c)和(d, e))外面还有一层括号,再加上它们本身的括号,所以深度=1+1=2

串是仅有字符构成的有限序列,是取值范围受限的线性表。

五、数组

image-20240514110930725

  • 注意上面公式是从0开始的(如果是从1开始的,那么结果-1)
  • 巧记方法,题目说以行(或者列)存放的,那么就是用这个数据的行(或者列)*这个数组的列数(或者行数)+列数(或者行数)+起始地址
    • 注意一下对应关系,它说行就拿行乘以列数,很简单识别的

六、树与二叉树

  • 节点的度:它下边子树个数
  • 树的高度::除开最底下叶子节点后,树的层数
  • 叶子节点:树最下面的节点(不一定全在最下面的同一层)
  • 分支节点:度数不为零的
  • 内部节点:除开根节点以外的分支节点
  • 父节点:子节点对应的根节点就是父节点
  • 子节点子树就是子节点
  • 兄弟节点:
  • 层次

二叉树

image-20240517152753603

二叉树的重要特性:

  1. 在二叉树的第i层上最多有\(2^{k-1}\)个节点(\(i\geq1\))
  2. 深度为k的二叉树最多有\(2^{k-1}\)个节点(\(k\geq1\));
  3. 对任何一棵二叉树,如果其叶子节点数为\(n_0\),度为2的节点数为\(n_2\),则\(n_0\)=\(n_2\)+1。
  4. 如果对一颗有n个节点的完全二又树的节点按层序编号(从第1层到\(\lfloor log_2^{n}\rfloor+1\)层,每层从左到右),则对任一节点\(i(1\leq i\leq n)\),有
    • 如果i=1,则节点i无父节点,是二叉树的根;如果\(i> 1\),则父节点是\(\lfloor i/2\rfloor;\)
    • 如果\(2i>n\),则结点i为叶子节点,无左子节点;否则,其左子节点是节点2i;
    • 如果2i+1>n,则节点i无右叶子节点,否则,其右子节点是节点2i+1.

二叉树遍历

  • 前序遍历:根->左->右
  • 中序遍历:左->根->右
  • 后序遍历:左->右->根
  • 层次遍历:从第一层开始,每一层从左到右

七、图

图的存储

image-20240517155940155

image-20240517160248636

image-20240518094744527

八、查找

五大查找

  1. 顺序表查找
    • 顺序查找
    • 二分查找
    • 索引顺序查找
  2. 树表查找
    • 二叉排序树
  3. 散列表查找
    • 哈希查找

顺序查找

顺序查找的过程:将待查找的关键字为key的元素从头到尾与表中元素进行比较,如果中间存在关键字为key的元素,则返回成功;否则:则查找失败。

二分查找

image-20240518095911142

二叉查找树(排序)

image-20240518100932418

二叉平衡树

image-20240518101059405

哈夫曼树

image-20240518101335253

B-树

image-20240518165115144

B+树

image-20240518170311120

散列表

image-20240518170732398

image-20240518171023468

标签:线性表,算法,查找,二叉树,数据结构,节点
From: https://www.cnblogs.com/LiuYueSheng/p/18219114

相关文章

  • 数据结构-单向链表的实现(c语言)
    链表的定义:链表是由一系列的结点组成的,每个结点包含两个域,分别是指针域(*next)与数据域(data)。单向链表的实现//.h文件#ifndeDXLB_H#defineDXLB_H//定义结点结构体typedefstructLINKNODE{structLINKNODE*next;//指向下一个结点的指针intdata;......
  • 数据结构—线性表
    线性表的定义:    线性表是具有相同特性的数据元素的一个有限序列,类似于数组。    线性表中的元素都有一个直接前驱和直接后继,除了第一个首元素和最后一个元素线性表的实现:    使用线性表模拟动态数组的实现:                //.......
  • 旅行第三天【算法】双指针-----盛最多水的容器
    文章目录一、题目二、算法原理三、编写代码一、题目链接:盛最多水的容器二、算法原理首先,这种题可以用暴力解法(枚举每一种容器的大小情况),但是显然会超时(不用尝试啦,我已经试过啦!)其次还是咱们的主题----->利用双指针来求解下面先附上草稿图容器面积=高度(左......
  • 【LeetCode算法】第88题:合并两个有序数组
    目录一、题目描述二、初次解答三、官方解法四、总结一、题目描述二、初次解答1.思路:首次想到的解法:定义一个m+n长度的辅助数组,从头遍历这两个数组,谁小就放进辅助数组中并且对应往后走,最后使用memcpy函数将辅助数组内容拷贝到nums1中。这种解法容易想到,但是空间复杂......
  • 【LeetCode算法】第83题:删除排序链表中的重复元素
    目录一、题目描述二、初次解答三、官方解法四、总结一、题目描述二、初次解答1.思路:双指针法,只需遍历一遍。使用low指向前面的元素,high用于查找low后面与low不同内容的节点。将具有不同内容的节点链接在low后面,实现重复元素的删除。2.代码:/***Definitionfor......
  • 代码随想录算法训练营第七天|454(四数相加||),383(赎金信),15(三数之和),18(四数之和)
    哈希三数之和和四数之和,和两数之和一样,是对一个数组来进行检索。因为要求元组不能重复,需要用多指针的方法来遍历和判断。由于两数之和没有这个要求且要返回下标,所以用了哈希表。但哈希表难以检测是否重复,不如双指针直接。四数相加||是对四个数组来做相加,且不要求元组重复,可用哈......
  • 数据结构初阶 栈
    一.栈的基本介绍1.基本概念栈是一种线性表是一种特殊的数据结构栈顶:进行数据插入和删除操作的一端另一端叫做栈底压栈:插入数据叫做压栈压栈的数据在栈顶出栈:栈的删除操作叫做出栈出栈操作也是在栈顶栈遵循一个原则叫做后进先出(比如说子弹的弹夹其实就是一种设......
  • 实现双链表各种基本运算的算法
    实验三:实现双链表各种基本运算的算法一、实验目的与要求目的:领会双链表存储结构和掌握双链表中各种基本运算算法设计。内容:编写一个程序dlinklist.cpp,实现双链表的各种基本运算和整体建表算法(假设链表的元素类型ElemType为char),并在此基础上设计一个程序exp2-3.cPp,......
  • 算法题模版(C语言)
    自用总结一、最大公约数(gcd)函数法:递归法(最简):二、最小公倍数(lcm)函数法:算出最大公约数后无需递归三、斐波那契数列(fibonacci)(fib)递归法(最简):    ......
  • 代码随想录算法训练营day6(哈希表)
    代码随想录算法训练营day6(哈希表):学习内容:哈希表基础内容:哈希表定义:哈希表是根据关键码的值而直接进行访问的数据结构目的:一般哈希表都是用来快速判断一个元素是否出现集合里。哈希函数定义:通过hashCode把名字转化为数值,一般hashcode是通过特定编码方式,可以将其他数据......