数据结构相关知识点(一)

news2024/11/14 15:33:33

一、线性表

1.什么是线性表?

线性表,全名为线性存储结构。使用线性表存储数据的方式可以理解理解为:把所有数据按照顺序(线性)的存储结构方式,存储在物理空间。

2.线性存储结构

顺序存储结构:数据依次存储在连续的物理空间中(顺序表);

链式存储结构:数据分散存储在不同的物理空间中,通过某种指向关系,来维持它们之间的逻辑关系(链表);

3.顺序表(数组)

        顺序表,就是顺序存储结构,是线性表的一种。顺序表对数据的物理存储结构有明确的要求:顺序表存储数据时,会提前申请一块足够大小的内存,然后将数据依次存储起来,元素的存储空间在内存中是连续存在的。

        优点:1.内存地址连续,数组元素进行遍历时,速度快。

                   2.根据下标,查找指定位置的元素时,速度快。

        缺点:1.长度固定,使用前余姚提前预估长度。

                   2.插入和删除元素时,时间复杂度相对较高。

    时间复杂度:读的时候是  O(1)   插入和删除的时候是O(n)

4.链表

        链表,全名是链式存储结构,也是线性表的一种。链表不限制数据的物理存储位置,使用链表存储的数据元素,其物理存储位置是随机的。由于链表节点之间根本无法体现出各数据之间的逻辑关系。

        链表的组成:

                                数据元素本身,其所在的区域称为数据域;

                                指向直接后继元素的指针,所在的区域称为指针域;

                                

        优点:使用链表结构,不需要提前预估长度,可以克服数组需要预先知道数据长度的缺点

                   链表使用不连续的内存空间,可以充分利用计算机内存空间,实现灵活的内存动态管理

        缺点:链表相比于数组会占用更多的空间,因为他不仅要存储数据本身还需要存储指针域。

                   不能随机的读取元素

                   遍历和查找元素更慢了。

时间复杂度:插入和删除时O(1),遍历查找时O (n); 

链表又有很多种类:单向链表双向链表循环链表双向循环链表。。。

5.链表中常见的问题(判断成环,相交)

判断链表是否有环

Linked.Node node1 = new Linked.Node(1);

Linked.Node node2 = new Linked.Node(2);

Linked.Node node3 = new Linked.Node(3);

Linked.Node node4 = new Linked.Node(4);

Linked.Node node5 = new Linked.Node(5);



node1.next = node2;

node2.next = node3;

node3.next = node4;

node4.next = node5;

node5.next = node3; // 链表产生环
方法一:使用Set集合
private static boolean hasCycle(Node node) {

// 定义Set集合,保存链表中的所有节点

Set<Node> nodeSet = new HashSet<Node>();

// 遍历链表中的每个节点

while(node != null) {

// 判断Set中是否存在该节点

// 如果存在,则代表该链表有环

if(nodeSet.contains(node)) {

return true; // 链表有环

}

// 如果不存在,则将节点加入Set集合,用于后续的判断

nodeSet.add(node);

// 移动链表节点

node = node.next;

}

return false; // 链表无环

}
方法二:快慢指针
private static boolean hasCycle(Node head) {

    if (head == null) {

        return false;

    }



    // 定义快指针和慢指针,从head头节点开始

    Node fast = head;

    Node slow = head;

    while (fast != null && fast.next != null && slow != null) {
    
    fast = fast.next.next; // 快指针移动2步

    slow = slow.next; // 慢指针移动1步



    // 判断fast和slow快慢指针指向的内存地址相同,如果相同,则代表碰面相遇
    
        if (fast == slow) {

        // 如果碰面,就代表链表有环
    
        return true;

        }

    }

    return false;

}

判断是否相交

方法一:使用双重循环判断
public static boolean isIntersect1(Linked link1, Linked link2) {

    for (Node p = link1.first; p != null; p = p.next) {

        for (Node q = link2.first; q != null; q = q.next) {

            if (p == q) {

                return true;

            }

        }

    }

    return false;

}
方法二:使用双指针判断
public static boolean isIntersect2(Linked link1, Linked link2) {
    // 安全检测
    if (link1 == null || link2 == null) {
        return false;
    }

    // p 指向长链表的第一个结点
    // q 指向短链表的第一个结点
    Node p = link1.size() > link2.size() ? link1.first : link2.first;
    Node q = link1.size() > link2.size() ? link2.first : link1.first;

    // 求两个链表长度差
    int diff = Math.abs(link1.size() - link2.size());

    // p先往后移动diff个结点
    while (diff-- > 0) {
        p = p.next;
    }

    // p 和 q 同时往后移动
    while (p != q) {
        p = p.next;
        q = q.next;
    }

    // 如果p(q)不为null,则两个链表相交,否则不相交
    if (p != null) {
        return true;
    } else {
        return false;
    }
}

栈&队列

1.栈

什么是栈

        栈(stack)是一种特殊的线性数据集合,只允许在栈顶top进行加入数据(push)贺移动数据(pop),按照后进先出LIFO的规则进行操作,也可以理解为先入后出FILO;

        栈的实现方式:

                栈的实现结构可以是一维数组或链表来实现,用数组实现的栈叫作顺序栈 ,用链表实现的栈叫作链式栈 。在Java中,顺序栈使用java.util.Stack类实现,链式栈使用java.util.LinkedList类实现。

                时间复杂度:访问指定元素:O(n)                入栈和出栈:O(1)

栈的常见操作

入栈:入栈操作就是把虚拟的元素放入栈中,只允许从栈顶一侧放入元素,新元素将会成为栈顶。

出栈:出栈操作就是把元素从栈中弹出,只有栈顶元素才允许出栈,出栈元素的前一个元素将会成为新的栈顶。

队列

队列是一种线性数据节后,特点类似:行驶车辆的单向隧道

队列中的元素按照先入先出的规则操作

队列的出口端叫做队头,队列的入口端叫做队尾

队列只允许在队头进行出队poll操作(删除

队列只允许在队尾进行入队offer操作(添加

实现方式

数组实现的队列叫作顺序队列
链表实现的队列叫作链式队列

时间复杂度

假设队列中有n个元素。
●访问指定元素的时间复杂度是O(n):最坏情况下,遍历整个队列
●插入删除元素的时间复杂度是O(1):只需要操作队头或队尾元素

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

建筑行业+办公领域低代码解决方案:创新、效率与商机的共赢

随着科技的不断进步和创新&#xff0c;建筑行业面临着技术创新和转型升级的压力。新的技术和工艺不断涌现&#xff0c;建筑企业需要紧跟技术趋势&#xff0c;引入新的技术和工艺&#xff0c;提高生产效率和质量&#xff0c;增强自身的核心竞争力。 而且建筑行业是一个高度竞争…

MongoDB副本集集群原理

文章目录 1、副本集-Replica Sets1.1、是什么1.2、副本集的三个角色1.3、副本集架构目标1.4、副本集的创建1.4.1 第一步&#xff1a;创建主节点1.4.2 第二步&#xff1a;创建副本节点1.4.3 第三步&#xff1a;创建仲裁节点1.4.4 第四步&#xff1a;初始化配置副本集和主节点1.4…

基于SSM的影视企业全渠道会员管理系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

计算机毕业设计选什么题目好?springboot 仓库在线管理系统

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

400电话是什么电话,和普通电话有什么不同

400电话是一种特殊的电话号码&#xff0c;通常用于企业或机构提供客户服务和咨询。与普通电话相比&#xff0c;400电话有以下几个不同之处。 首先&#xff0c;400电话是一种虚拟号码&#xff0c;不依赖于地理位置。普通电话号码通常与特定的地区或城市相关联&#xff0c;而400…

HP ENVY x360 Convert 15-bp002tx,15-bp106TX原厂Windows10系统

惠普笔记本ENVY X360原装出厂OEM预装Win10镜像文件 下载链接&#xff1a;https://pan.baidu.com/s/1GXoEIHaJtP752zYDJknrJg?pwdmq35 适用型号&#xff1a;15-bp001tx,15-bp002tx,15-bp003tx,15-bp004tx,15-bp005tx,15-bp006tx 15-bp101TX,15-bp102tx,15-bp103tx,15-bp104t…

跨境商城源码的终极秘密:寻找最佳解决方案的5个步骤!

在当今全球化的商业环境下&#xff0c;跨境电商已经成为许多企业拓展市场的重要战略之一。而搭建一个高效稳定的跨境商城平台是成功的关键所在。但是&#xff0c;要找到最佳解决方案并不容易。本文将详细介绍寻找跨境商城源码的最佳解决方案的五个步骤&#xff0c;帮助您在选择…

【ppt技巧】ppt里的图片如何提取出来?

之前分享过如何将PPT文件导出成图片&#xff0c;今天继续分享PPT技巧&#xff0c;如何提取出PPT文件里面的图片。 首先&#xff0c;我们将PPT文件的后缀名&#xff0c;修改为rar&#xff0c;将文件改为压缩包文件 然后我们将压缩包文件进行解压 最好是以文件夹的形式解压出来…

力扣 -- 1143. 最长公共子序列

解题步骤&#xff1a; 参考代码&#xff1a; class Solution { public:int longestCommonSubsequence(string s1, string s2) {int ms1.size();int ns2.size();s1 s1;s2 s2;vector<vector<int>> dp(m1,vector<int>(n1));for(int i1;i<m;i){for(int j1;j&…

【计算机毕设案例推荐】洋州影院购票管理系统SpringBoot+Vue

前言&#xff1a;我是IT源码社&#xff0c;从事计算机开发行业数年&#xff0c;专注Java领域&#xff0c;专业提供程序设计开发、源码分享、技术指导讲解、定制和毕业设计服务 项目名 基于SpringBoot的洋州影院购票管理系统 技术栈 SpringBootVueMySQLMaven 文章目录 一、洋州…

windows cmd下查看环境变量的信息

在windows cmd窗口下&#xff0c;怎么查看环境变量的值&#xff1f; 直接输入set命令然后回车&#xff0c;即可看到所有环境变量的信息&#xff0c;例如&#xff1a; 输入set <变量名>然后回车&#xff0c;可以查看某个环境变量的值&#xff0c;例如set path&#xff1a…

【网络安全】「漏洞原理」(二)SQL 注入漏洞之理论讲解

前言 严正声明&#xff1a;本博文所讨论的技术仅用于研究学习&#xff0c;旨在增强读者的信息安全意识&#xff0c;提高信息安全防护技能&#xff0c;严禁用于非法活动。任何个人、团体、组织不得用于非法目的&#xff0c;违法犯罪必将受到法律的严厉制裁。 【点击此处即可获…

Python使用MySQL,无记录则插入,有记录则更新 - ON DUPLICATE KEY UPDATE

一、基本语法 ON DUPLICATE KEY UPDATE 语句基本功能是&#xff1a;当表中没有原来记录时&#xff0c;就插入&#xff0c;有的话就更新。 使用注意事项如下&#xff1a; ON DUPLICATE KEY UPDATE语句根据主键id或唯一键来判断当前插入是否已存在。记录已存在时&#xff0c;只…

antd pro form 数组套数组 form数组动态赋值 shouldUpdate 使用

antd form中数组套数组 form数组动态变化 动态赋值 需求如上&#xff0c;同时添加多个产品&#xff0c;同时每个产品可以增加多台设备&#xff0c;根据设备增加相应编号&#xff0c;所以存在数组套数组&#xff0c;根据数组值动态变化 使用的知识点 form.list form中的数组…

力扣第617题 合并二叉树 c++ 前中后序 完成 附加迭代版本

题目 617. 合并二叉树 简单 相关标签 树 深度优先搜索 广度优先搜索 二叉树 给你两棵二叉树&#xff1a; root1 和 root2 。 想象一下&#xff0c;当你将其中一棵覆盖到另一棵之上时&#xff0c;两棵树上的一些节点将会重叠&#xff08;而另一些不会&#xff09;。你需…

使用 nodejs,SpringBoot 两种方式实现 WebSocket

前言 WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议&#xff0c;它可以让浏览器和服务器之间实现实时双向数据传输。 WebSocket 的优点是&#xff1a; 可以节省服务器资源和带宽&#xff0c;提高性能和效率可以让服务器主动向客户端推送数据&#xff0c;实现实时响…

Nacos 小bug: application.properties配置未生效,导致端口未生效

最近用了下nacos 1.4.6 ,发现windows 中修改配置中的启动端口未生效&#xff0c;其实就是配置文件没读取到。 去github 逛了一下issue ,参考这个&#xff1a;https://github.com/alibaba/nacos/issues/10217 这哥们儿是nacos 1.4.5 Linux系统下的相同问题&#xff0c;shell 中…

发掘Linux世界的终极工具,推荐11款Linux桌面终端模拟器

发掘Linux世界的终极工具&#xff0c;推荐11款Linux桌面终端模拟器 广漂客家妹小关vlog2023-07-14 10:46广东 作为Linux使用者&#xff0c;我们深知终端的力量和灵活性。而选择一个适合自己需求的终端模拟器&#xff0c;则是提升工作效率和体验的关键。现如今&#xff0c;众多…

碰撞检测算法——分离轴算法在Unity中实现(一)

在实现分离轴算法前&#xff0c;需要做一些准备工作&#xff0c;在Unity中实现自定义多边形的显示&#xff0c;以及获取多边形的顶点和边的数据。 1.实现自定义多边形显示 Unity中MeshFilter是负责处理Mesh&#xff08;网格&#xff09;的信息的引用&#xff0c;MeshRender是渲…

电容如何能做升压?(电荷泵的工作原理及特性)

目录 一、电荷泵 二、电荷泵工作原理 1、 倍压型电荷泵 2、 稳压型电荷泵 1、 开关调整稳压型电荷泵 2、 LDO稳压型电荷泵 3、 反向型电荷泵 三、 电荷泵的优劣势 1&#xff09;成本 2&#xff09;效率 3&#xff09;噪声 4&#xff09;面积及EMI 5&#xff09;输…