4《数据结构》

文章目录

    • 绪论
    • 逻辑结构
    • 存储结构【物理结构】
    • 顺序和链式存储区别
    • 顺序表和数组区别
    • 数组和链表的区别
    • 链表结点概念
    • 链表为空条件
    • 链表文章http://t.csdnimg.cn/dssVK
    • 二叉树
    • B树
    • B+树【MYSQL索引默认数据结构】
    • B树和B+树区别
    • 冒泡排序
    • 插排
    • 选排
    • 快排

绪论

  • 数据结构:研究非数值计算程序设计中的操作对象,以及这些对象之间的关系和操作
  • 数据:客观事物的符号表示,所有输入到计算机并被程序处理的符号总称
  • 算法:为了解决某类问题而规定的一串有限长的操作序列
  • 算法标准:健壮性、有穷性、可行性、及低存储量
  • 节点:实体,有处理能力,类似网络的计算机
  • 结点:逻辑,链表中的元素,包括数据域和存储下一个结点地址的指针域
  • 数据项:数据结构的最小单位
  • 数据元素:数据的基本单位,是数据项的集合

逻辑结构

  • 集合:无逻辑关系
  • 线性结构:有序数据元素的集合
    线性表,数组,栈,队列,串
  • 非线性结构:一个结点元素可能有多个直接前趋和多个直接后继
    多维数组,广义表,树、图

存储结构【物理结构】

  • 顺序存储
  • 链式存储
  • 索引存储
  • 散列存储

顺序和链式存储区别

顺序存储链式存储
数组链表
数据元素放在地址连续的存储单元中数据元素存储在任意的存储单元里
数据元素在存储器中的相对位置结点中指针
逻辑相邻逻辑相邻
物理相邻物理不一定相邻

顺序表和数组区别

顺序表数组
逻辑结构角度物理存储角度
顺序表 是由数组组成的线性表

数组和链表的区别

数组链表
连续内存分配动态内存分配
在栈上分配内存,自由度小【栈必须连续且固定大小,后进先出的取】在堆上分配内存,自由度大【堆是直接随意存取】
事先固定数组长度,不支持动态改变数组大小支持动态增加或删除元素
数组元素增加时,有可能会数组越界;数组元素减少时,会造成内存浪费;数组增删时需要移动其它元素使用malloc或者new来申请内存,不用时使用free或者delete来释放内存
下标访问,访问效率高访问需要从头遍历,访问效率低
数组的大小是固定的,所以存在访问越界的风险只要可以申请得到链表空间,链表就无越界风险

链表结点概念

  • 头结点:在第一个结点之前的结点
  • 首元结点:链表存储的第一个结点
  • 头指针:链表第一个结点的存储位置

链表为空条件

  • 带头结点不为空的单链表:L->next!=NULL
  • 带头结点为空的单链表:L->next==NULL
  • 不带头结点不为空的单链表:L!=NULL
  • 不带头结点为空的单链表:L==NULL
  • 带头结点的双循坏链表为空的条件:L->next==L->prior=L

链表文章http://t.csdnimg.cn/dssVK

二叉树

二叉树是一种常见的树状数据结构,它由节点组成,每个节点最多有两个子节点,分别称为左子节点和右子节点。
特点

  • 树形结构:二叉树是一种层次结构,由根节点开始,每个节点可以有零、一个或两个子节点。这种结构使得数据可以以分层的方式进行组织和存储。
  • 节点:二叉树的每个节点包含一个数据元素,通常表示某种值或对象,以及指向其左子节点和右子节点的指针(引用)。
  • 根节点:树的顶部节点称为根节点。它是整个二叉树的起始点,所有其他节点都通过它连接。
  • 叶节点:叶节点是没有子节点的节点,它们位于树的末端。
  • 子树:每个节点的左子节点和右子节点都可以看作是一个独立的子树,这些子树也是二叉树。

B树

  • 节点排序(节点存储:地址信息+索引+表结构中除了索引外的其他信息)
  • 一个节点可以存多个元素,元素也排序
  • b树和b+树及其区别? - 知乎用户的回答 - 知乎
    https://www.zhihu.com/question/57466414/answer/182514854

B+树【MYSQL索引默认数据结构】

  • 拥有B树的特点
  • 叶子节点之间有指针
  • 非叶子节点上的元素在叶子节点上都冗余了,也就是叶子节点中存储了所有的元素,并且排好顺序。
  • 非节点存储:地址信息+索引、叶子节点存储:索引+表结构中除了索引外的其他信息)

B树和B+树区别

B树B+树
key和value都在节点上。并且叶子节点之间没有关系非叶子节点没有存value。叶子节点之间有双向指针,有引用链路。
因为B树的key和value都存在节点上,因此在查找过程中,可能不用查找的叶子节点就找到了对应的值。B+树需要查找到叶子节点,才能获取值

冒泡排序

  • 比较相邻的元素。如果第一个比第二个大,就交换他们两个。

  • 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

  • 针对所有的元素重复以上的步骤,除了最后一个。

  • 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

package one;

public class Xu {

    public int[] sort_MAOPAO(int[] nums) {
        if (nums.length == 0 || nums.length == 1) return nums;
        for (int i = 0; i < nums.length; i++) {
            for (int j = 0; j < nums.length - 1 - i; j++) {
                if (nums[j] > nums[j + 1]) {
                    int temp = nums[j + 1];
                    nums[j + 1] = nums[j];
                    nums[j] = temp;
                }
            }
        }
        return nums;
    }

    public static void main(String[] args) {
        Xu xu = new Xu();
        int[] array = {11, 33, 44, 22, 55, 99, 88, 66, 77};
        System.out.println("从小到大排序后的结果是:");
        for(int i=0;i<xu.sort_MAOPAO(array).length;i++)
            System.out.print(xu.sort_MAOPAO(array)[i]+" ");
    }
}

在这里插入图片描述

插排

  • ​1.从第一个元素开始,该元素可以认为已经被排序; ​
  • 2.取出下一个元素,在已经排序的元素序列中从后向前扫描; ​
  • 3.如果该元素(已排序)大于新元素,将该元素移到下一位置; ​
  • 4.重复步骤3,直到找到已排序的元素小于或者等于新元素的位置; ​
  • 5.将新元素插入到该位置后;
  • 6.重复步骤2~5。
    在这里插入图片描述
    public static int[] sort_CHAOPAI(int[] nums) {//将最后一个元素作为插入元素与有序数列比较后插入正确位置
        if (nums.length == 0 || nums.length == 1) return nums;
        for (int i = 0; i < nums.length; i++) {//i是作为每一组比较数据的最后一个元素
            for (int j = i; j > 0; j--) {
                if (nums[j - 1] > nums[j]) {
                    int temp = nums[j];
                    nums[j] = nums[j - 1];
                    nums[j - 1] = temp;
                }
            }
        }
        return nums;
    }

选排

​ 1.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。
​ 2.再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
​ 3.重复第二步,直到所有元素均排序完毕。
在这里插入图片描述

    public static int[] sort_XUANPAI(int[] nums) {
        if (nums.length == 0 || nums.length == 1) return nums;
        for (int i = 0; i < nums.length; i++) {
            int minIndex = i;//每次循环假设第一个数最小
            for (int j = i; j < nums.length; j++) {
                if (nums[minIndex] > nums[j]) {//找到剩余未排序元素中找到最小元素,交换
                    int temp = nums[minIndex];
                    nums[minIndex] = nums[j];
                    nums[j] = temp;
                }
            }
        }
        return nums;
    }

快排

  • 从数列中挑出一个元素,称为 “基准”(pivot);
  • 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
  • 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序
    在这里插入图片描述
    public static void quickSort(int[] nums, int startIndex, int endIndex) {
        if(startIndex >= endIndex){//只剩一个元素不用处理直接结束。
            return;
        }
        int val = nums[startIndex];//基准值
        int left = startIndex;//比基准值小的放左边
        int right = endIndex;//比基准值大的放右边
        while (left < right) {
            while (left < right && nums[right] > val) right--;//右指针左移,遇到比基准值小的数
            if (left < right) {
                nums[left++] = nums[right];
            }
            while (left < right && nums[left] < val) left++;//做左指针右移,遇到比基准值大的数
            if (left < right) {
                nums[right--] = nums[left];
            }
        }

        //最后将基准与left和right相等位置的数字交换
        nums[left] = val;
        //递归调用左半数组
        quickSort(nums, startIndex, left - 1);
        //递归调用右半数组
        quickSort(nums, left + 1, endIndex);


    }

        public static void main (String[]args){
            Random rd = new Random();
            int[] num = new int[10];
            for (int i = 0; i < num.length; i++) {
                num[i] = rd.nextInt(100) + 1;
            }
            System.out.println(Arrays.toString(num));
            quickSort(num,0,num.length-1);
            System.out.println(Arrays.toString(num));

//            for (int i = 0; i < xu.sort_MAOPAO(array).length; i++)
//                System.out.print(xu.sort_MAOPAO(array)[i] + " ");

        }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/294563.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Html5实用个人博客留言板模板源码

文章目录 1.设计来源1.1 主界面1.2 认识我界面1.3 我的日记界面1.4 我的文章列表界面和文章内容界面1.5 我的留言板界面 2.演示效果和结构及源码2.1 效果演示2.2 目录结构2.3 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151…

关于MySQL Cluster

目录 1.MySQL Cluster2.MySQL Cluster架构3.MySQL Cluster 与 MySQL 主从架构有什么区别4.参考 MySQL Cluster是MySQL的一个高可用性&#xff0c;高性能的分布式数据库解决方案。它结合了内存数据库和共享无状态架构的技术&#xff0c;提供了99.999%的可用性&#xff0c;满足严…

经典目标检测YOLO系列(一)YOLOV1的复现(1)总体架构

经典目标检测YOLO系列(一)实现YOLOV1网络(1)总体架构 实现原版的YOLOv1并没有多大的意义&#xff0c;因此&#xff0c;根据《YOLO目标检测》(ISBN:9787115627094)一书&#xff0c;在不脱离YOLOv1的大部分核心理念的前提下&#xff0c;重构一款较新的YOLOv1检测器&#xff0c;来…

【EI会议征稿通知】第十届先进制造技术与应用材料国际学术会议(ICAMMT 2024)

第十届先进制造技术与应用材料国际学术会议&#xff08;ICAMMT 2024&#xff09; The 10th International Conference on Applied Materials and Manufacturing Technology 至今ICAMMT已连续举办九届&#xff0c;会议先后在三亚、杭州、清远等城市成功召开。每一届最终征集收…

K8S--部署SpringBoot项目实战

原文网址&#xff1a;K8S--部署SpringBoot项目实战-CSDN博客 简介 本文介绍K8S如何部署SpringBoot项目。 1.生成应用的docker镜像 把SpringBoot项目的jar包打包为docker镜像&#xff0c;见&#xff1a;Docker Compose--部署SpringBoot项目--实战-CSDN博客 创建后的镜像名称…

Django和Vue项目运行过程中遇到的问题及解决办法

这是我从CSDN上边买来的一个系统的资源&#xff0c;准备在此基础上改成自己的系统&#xff0c;但是在运行项目这一步上都把自己难为了好几天&#xff0c;经过不断的摸索&#xff0c;终于完成了第一步&#xff01;&#xff01;&#xff01; 如果大家也遇到同样的问题&#xff0…

Docker基础学习(配置、命令)

镜像加速 登录阿里云 docker run hello-world分析命令&#xff1a; 开始–>docker在本机中寻找镜像–>有–>以该镜像为模版生产容器实例运行&#xff1b; 开始–>docker在本机中寻找镜像–>无–>去远端下载镜像并运行&#xff0c;若远端无此镜像则返回错误…

【教育会议征稿】第五届教育、知识和信息管理国际学术会议(ICEKIM 2024)

第五届教育、知识和信息管理国际学术会议&#xff08;ICEKIM 2024&#xff09; 2024 5th International Conference on Education, Knowledge and Information Management 第五届教育、知识和信息管理国际学术会议&#xff08;ICEKIM 2024&#xff09;定于4月19至21日在中国成…

Vue-3、模板语法

1、插值语法 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>模板语法</title><!--引入vue--><script type"text/javascript" src"https://cdn.jsdelivr.net/npm/vue2…

Java程序设计——GUI设计

一、目的 通过用户图形界面设计&#xff0c;掌握JavaSwing开发的基本方法。 二、实验内容与设计思想 实验内容&#xff1a; 课本验证实验&#xff1a; Example10_6 图 1 Example10_7 图 2 图 3 Example10_15 图 4 设计思想&#xff1a; ①学生信息管理系统&#xff1a…

JS 手写 new 函数

工作中我们经常会用到 new 关键字&#xff0c;new 一个构造函数生成一个实例对象&#xff0c;那么new的过程中发生了什么呢&#xff0c;我们今天梳理下 创建一个对象对象原型继承绑定函数this返回对象 先创建一个构造函数&#xff0c;原型上添加一个方法 let Foo function (n…

Struts2 远程代码执行漏洞S2-001分析

自 Struts2 在 2007 年爆出第一个远程代码执行漏洞 S2-001 以来&#xff0c;在其后续的发展过程中不断爆出更多而且危害更大的远程代码执行漏洞&#xff0c;而造成 Struts2 这么多 RCE 漏洞的主要原因就是 OGNL 表达式。这里以 Struts2 的第一个漏洞 S2-001 为例来对 Struts2 远…

UE相关杂项笔记

1.PAK包解析 UE4如何反向查找Pak里面包含哪些文件 - 哔哩哔哩 CMD控制台命令输入 D:&quot;Epic Games&quot;\UE_5.1\Engine\Binaries\Win64\UnrealPak.exe 包路径 -list *文件夹带空格时 添加“ ”包裹住文件夹名 解包工具路径 UE引擎安装路径\UE_5.1\Engine\Binarie…

HarmoryOS Ability页面的生命周期

接入穿山甲SDK app示例&#xff1a; android 数独小游戏 经典数独休闲益智 广告接入示例: Android 个人开发者如何接入广告SDK&#xff0c;实现app流量变现 Ability页面的生命周期 学习前端&#xff0c;第一步最重要的是要理解&#xff0c;页面启动和不同场景下的生命周期的…

unity中0GC优化方案《zstring》

文章目录 序言简介GC带来的问题性能瓶颈玩家体验受损 使用方式 序言 游戏开发秉承遇到好东西要分享&#xff0c;下面介绍zstring&#xff0c;感谢作者开源无私奉献 源码地址&#xff1a;https://github.com/871041532/zstring 简介 GC带来的问题 性能瓶颈 GC暂停主线程执行…

c# 学习笔记 - 委托(Delegate)

文章目录 1. 委托1.1 委托概述1.2 委托使用1.3 委托的传播 2. 匿名方法2.1 匿名方法概述2.2 匿名方法 1. 委托 1.1 委托概述 委托简介 委托就是对方法的引用&#xff0c;可以理解为例如整型变量的容器可以存储整形数据&#xff0c;委托就是某种方法的容器&#xff0c;可以用来…

C语言算法(二分查找、文件读写)

二分查找 前提条件&#xff1a;数据有序&#xff0c;随机访问 #include <stdio.h>int binary_search(int arr[],int n,int key);int main(void) {}int search(int arr[],int left,int right,int key) {//边界条件if(left > right) return -1;//int mid (left righ…

全球海洋数据 (GLODAP) v2.2023(海洋碳数据产品)

全球海洋数据分析项目 (GLODAP) v2.2023 全球海洋数据分析项目 (GLODAP) v2.2023 代表了海洋生物地球化学瓶数据合成方面的重大进步。此更新主要关注海水无机碳化学&#xff0c;以 GLODAPv2.2022 为基础&#xff0c;包含多项关键增强功能。值得注意的是&#xff0c;增加了 43 …

test 系统学习-04-test converate 测试覆盖率 jacoco 原理介绍

测试覆盖率 测试覆盖率(test coverage)是衡量软件测试完整性的一个重要指标。掌握测试覆盖率数据&#xff0c;有利于客观认识软件质量&#xff0c;正确了解测试状态&#xff0c;有效改进测试工作。 当然&#xff0c;要发挥这些作用&#xff0c;前提是我们掌握了真实的测试覆盖…

如何使用Docker本地部署一个开源网址导航页并分享好友公网使用

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…