数据结构+算法

news2024/12/23 14:54:57

一、数据结构

1、线性结构

  • 数组:
    • 访问:O(1)访问特定位置的元素;
    • 插入:O(n)最坏的情况发生在插入发生在数组的首部并需要移动所有元素时;
    • 删除:O(n)最坏的情况发生在删除数组的开头发生并需要移动第一元素后面所有的元素时
  • 链表:使用的不是连续的内存空间来存储数据。
    • 链表的插入和删除操作的复杂度为 O(1) ,只需要知道目标位置元素的上一个元素即可。但是,在查找一个节点或者访问特定位置的节点的时候复杂度为 O(n) 。
  • 数组链表比较:
    • 数组支持随机访问,而链表不支持。
    • 数组使用的是连续内存空间对 CPU 的缓存机制友好,链表则相反。
    • 数组的大小固定,而链表则天然支持动态扩容。如果声明的数组过小,需要另外申请一个更大的内存空间存放数组元素,然后将原数组拷贝进去,这个操作是比较耗时的
    • 允许在有序的线性数据集合的一端(称为栈顶 top)进行加入数据(push)和移除数据(pop),后进先出(LIFO, Last In First Out)push 和 pop 的操作都发生在栈顶。
  • 队列
    • 先进先出 (FIFO,First In, First Out) 的线性表。通常用链表或者数组来实现,用数组实现的队列叫作 顺序队列 ,用链表实现的队列叫作 链式队列队列只允许在后端(rear)进行插入操作也就是入队 enqueue,在前端(front)进行删除操作也就是出队 dequeue

2、图

  • 概念
    • 顶点:图中的数据元素,图至少有一个顶点(非空有穷集合)
    • 边:顶点之间的关系用边表示
    • 度:表示一个顶点包含多少条边,在有向图中,还分为出度和入度,出度表示从该顶点出去的边的条数,入度表示进入该顶点的边的条数。
    • 无向图、有向图:边表示的是顶点之间的关系,有的关系是双向的,有的是单向的
    • 无权图、带权图:边是否具有权重
  • 图的存储
    • 邻接矩阵存储:邻接矩阵将图用二维矩阵存储,是一种较为直观的表示方式。如果第 i 个顶点和第 j 个顶点之间有关系,且关系权值为 n,则 A[i][j]=n在无向图中,当顶点 i 和顶点 j 有关系时,A[i][j]=1,无关系时,A[i][j]=0。(比较浪费空间)
      • 无向图的邻接矩阵是一个对称矩阵,因为在无向图中,顶点 i 和顶点 j 有关系,则顶点 j 和顶点 i 必有关系。
    • 邻接表存储:使用一个链表来存储某个顶点的所有后继相邻顶点。对于图中每个顶点 Vi,把所有邻接于 Vi 的顶点 Vj 链成一个单链表,这个单链表称为顶点 Vi 的 邻接表

      • 在无向图中,邻接表元素个数等于边的条数的两倍;在有向图中,邻接表元素个数等于边的条数
  • 图的搜索:BFS、DFS

3、堆

  • 定义:堆是一种满足以下条件的树:堆中的每一个节点值都大于等于(或小于等于)子树中所有节点的值。或者说,任意一个节点的值都大于等于(或小于等于)所有子节点的值。(可以看成是近似的完全二叉树)
  • 用途:当我们只关心所有数据中的最大值或者最小值,存在多次获取最大值或者最小值,多次插入或删除数据时,就可以使用堆。
  • 时间复杂度:插入和删除操作O(lgn),堆初始化时间复杂度O(n)
  • 分类:大根堆、小根堆
  • 存储:由于完全二叉树的性质,利用数组存储二叉树即节省空间,又方便索引(若根结点的序号为0,那么对于树中任意节点 i,其左子节点序号为 2*i + 1,右子节点序号为 2*i+2
  • 堆的操作(大根堆):
    • 插入:先将元素放至数组末尾,再自底向上堆化,将末尾元素上浮

    • 删除堆顶:删除堆顶元素,将末尾元素放至堆顶,再自顶向下堆化,将堆顶元素下沉
  • 堆排序:
    • 第一步是建堆,将一个无序的数组建立为一个堆
      • 最后一个节点的父结点及它之前的元素,都是非叶节点。即节点个数为 n,只需对 (n - 1) / 2 到 0 的节点进行自顶向下(沉底)堆化(顺序是从后往前堆化)

    • 第二步是排序,将堆顶元素与最后位置元素交换,然后对剩下元素进行堆化,反复迭代
  • 堆以及堆排序
    class Solution {
        public int[] sortArray(int[] nums) {
    //若根结点的序号为0,那么对于树中任意节点 i,其左子节点序号为 2*i + 1,右子节点序号为 2*i+2
    //初始堆化:从(n - 1)/2 到0,自顶向下堆化
            heapify(nums);
    //将堆顶元素与最后位置元素交换,然后对0位置进行堆化,反复迭代
            for (int j = nums.length - 1; j > 0; j--) {
                swap(j, 0, nums);
                siftDown(0, j, nums);
            }
            return nums;
        }
    
        private void heapify(int[] nums) {
            for (int i = (nums.length >>> 1) - 1; i >= 0; i--) {
                siftDown(i, nums.length, nums);
            }
        }
    
        //大根堆
        private void siftDown(int index, int len, int[] nums) {
            int half = len >>> 1;
            while (index < half) {
                int child = (index << 1) + 1;//左移运算符优先级低于加号
                int right = 1 + child;
                //获取左右节点中较大的子节点
                if (right < len && nums[child] < nums[right]) {
                    child = right;
                }
                if (nums[index] >= nums[child]) {
                   break;
                }
                //跟较大的子节点交换
                swap(index, child, nums);
                index = child;
            }
        }
    
        private void siftUp(int index, int[] nums) {
            while (index > 0) {
                int father = (index - 1) >>> 1;
                if (nums[father] > nums[index]) {
                    break;
                }
                swap(father, index, nums);
                index = father;
            }
        }
    
        private void swap(int a, int b, int[] nums) {
            nums[a] ^= nums[b];
            nums[b] ^= nums[a];
            nums[a] ^= nums[b];
        }
    
    }

4、树

  • 定义
  • 二叉树分类
    • 满二叉树:每一个层的结点数都达到最大值。或者如果一个二叉树的层数为 K,且结点总数是(2^k) -1 ,则它就是 满二叉树

    • 完全二叉树:最后一层外,若其余层都是满的,并且最后一层是满的或者是在右边缺少连续若干节点。当根节点的值为 1 的情况下,若父结点的序号是 i,那么左子节点的序号就是 2i,右子节点的序号是 2i+1。

    • 平衡二叉树:可以是一棵空树;如果不是空树,它的左右两个子树的高度差的绝对值不超过 1,并且左右两个子树都是一棵平衡二叉树。(红黑树、AVL数)
  • 存储
    • 链式存储:

    • 数组存储:顺序存储就是利用数组进行存储,数组中的每一个位置仅存储节点的 data,不存储左右子节点的指针,子节点的索引通过数组下标完成。根结点的序号为 0,对于每个节点 Node,假设它存储在数组中下标为 i 的位置,那么它的左子节点就存储在 2i + 1 的位置,它的右子节点存储在下标为 2i+2 的位置。
      • 如果存储的二叉树不是完全二叉树,在数组中就会出现空隙,导致内存利用率降低
  • 遍历
    • 层序遍历:bfs
    • 先序遍历

    • 中序遍历

    • 后序遍历

    • morris遍历

5、红黑树

二、算法

1、算法思想

  • 贪心:局部最优-->全局最优
  • 动态规划:动态规划中每一个状态一定是由上一个状态推导出来
    • 确定dp数组(dp table)以及下标的含义
    • 确定递推公式
    • dp数组如何初始化
    • 确定遍历顺序
  • 回溯-穷举
    • 回溯函数返回值以及参数
    • 回溯函数终止条件
    • 回溯函数终止条件
  • 分治
    • 将一个规模为 N 的问题分解为 K 个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。

2、常见数据结构算法题目

3、字符串算法

4、常见链表算法

5、十大经典排序

6、经典剑指offer题目

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

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

相关文章

go 聊天系统项目-1

1、登录界面 说明&#xff1a;这一节的内容采用 go mod 管理【GO111MODULE‘’】的模块&#xff0c;从第二节开始使用【GO111MODULE‘off’】GOPATH 管理模块。具体参见 go 包相关知识 1.1登录界面代码目录结构 代码所在目录/Users/zld/Go-project/day8/chatroom/ 1.2登录…

Steam deck 倒腾日记 - 安装Windows软件,玩上黑神话悟空

Steam deck 倒腾日记 关于Steam Deck基本信息性能特点游戏兼容性 问题一: 软键盘输入问题二: 系统切换问题三: 安装运行Window 软件关于Proton如何运行 问题四: 优化网络问题黑神话.悟空PS参考 关于Steam Deck Steam Deck是一款由Valve开发的便携式游戏PC&#xff0c;它搭载了A…

【内网渗透】最保姆级的2022网鼎杯半决赛复盘打靶笔记

目录 flag1 flag2 flag3 flag4 flag1 fscan什么也没扫到 访问是个web dirsearch开扫 访问./wp-admin 弱口令admin:123456登录 编辑主题文件 在header.php中插入一句话木马 header.php位置&#xff1a;https://tw.godaddy.com/help/change-the-header-in-wordpress-264…

Python 实现斐波那契数列的方法

以下是使用 Python 实现斐波那契数列的方法&#xff1a; def fibonacci(n): if n < 1: return n else: return fibonacci(n - 1) fibonacci(n - 2) # 打印前 10 个斐波那契数 for i in range(10): print(fibonacci(i)) 在这个代码中&#xff0c;定义了一个函数 fibonacc…

IntelliJ IDEA 中上传项目到 Gitee 的完整指南

博主主页:【南鸢1.0】 本文专栏&#xff1a;git 目录 简介 1.插入intellij-gitee 2.导入下载插件 3.选择导航栏中的VCS->Share Project on Gitee 4.登录gitee 6.验证gitee仓库是否创建成功 7.上传分享项目 8.验证仓库代码是否上传成功 总结 简介 Gitee 是一个代码…

【p2p、分布式,区块链笔记 分布式容错算法】: 拜占庭将军问题+实用拜占庭容错算法PBFT

papercodehttps://pmg.csail.mit.edu/papers/osdi99.pdfhttps://github.com/luckydonald/pbft 其他相关实现&#xff1a;This is an implementation of the Pracltical Byzantine Fault Tolerance protocol using PythonAn implementation of the PBFT consensus algorithm us…

简单的kafkaredis学习之redis

简单的kafka&redis学习之redis 2. Redis 2.1 什么是Redis Redis是一种面向 “Key-Value” 数据类型的内存数据库&#xff0c;可以满足我们对海量数据的快速读写需求&#xff0c;Redis是一个 NoSQL 数据库&#xff0c;NoSQL的全称是not only sql&#xff0c;不仅仅是SQL&…

无人机之卫星通信技术篇

无人机的卫星通信技术是一种利用人造地球卫星作为中继站来转发无线电波&#xff0c;从而实现无人机与地面控制站之间通信的技术。 一、技术概述 卫星通信系统主要由通信卫星和经该卫星连通的地球站两部分组成。在无人机应用中&#xff0c;卫星通信技术能够确保无人机在全球范围…

网鼎杯 misc -好久不见4

不嘻嘻&#xff0c;没见过这种题&#xff0c;需要把这个红线还原重组成二维码&#xff0c;搜索一个是这个Peano曲线 from PIL import Image from tqdm import tqdmdef peano(n):if n 0:return [[0, 0]]else:in_lst peano(n - 1)lst in_lst.copy()px, py lst[-1]lst.extend(…

ARM base instruction -- adcs

Add with Carry, setting flags, adds two register values and the Carry flag value, and writes the result to the destination register. It updates the condition flags based on the result. 带进位加法&#xff0c;设置标志&#xff0c;将两个寄存器值和进位标志值相…

笔记本双系统win10+Ubuntu 20.04 无法调节亮度亲测解决

sudo add-apt-repository ppa:apandada1/brightness-controller sudo apt-get update sudo apt-get install brightness-controller-simple 安装好后找到一个太阳的图标&#xff0c;就是这个软件&#xff0c;打开后调整brightness&#xff0c;就可以调整亮度&#xff0c;可…

vue版本太低无法执行vue ui命令

连接 ui和create目前都只支持3.0以后得版本才能使用 https://blog.csdn.net/m0_67318913/article/details/136775252?utm_mediumdistribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0-136775252-blog-121204604.235v43pc_blog_bottom_relevance…

萤石私有化设备视频平台EasyCVR视频融合平台如何构建农业综合监控监管系统?

现代农业的迅速发展中&#xff0c;集成监控管理系统已成为提高农业生产效率和优化管理的关键工具。萤石私有化设备视频平台EasyCVR&#xff0c;作为一个具有高度可扩展性、灵活的视频处理能力和便捷的部署方式的视频监控解决方案&#xff0c;为农业监控系统的建设提供了坚实的技…

Pr 视频效果:闪光灯

视频效果/风格化/闪光灯 Stylize/Strobe Light 闪光灯 Strobe Light效果可用于在视频中创建闪烁或频闪的效果&#xff0c;类似于舞台上的频闪灯或摄影中的闪光灯。 ◆ ◆ ◆ 效果选项说明 通过调整各种参数&#xff0c;可以自定义闪光的颜色、频率、持续时间和混合模式&#…

FreeRTOS确定任务栈大小

一、FreeRTOS内存分配 所有任务共用一个堆空间&#xff0c;所以当调用xPortGetFreeHeapSize这个函数时&#xff0c;返回的就是现在所有可用堆空间的消息 所有任务都有自己的栈空间&#xff0c;比如在任务中定义一个uint32_t data[100]的数组&#xff0c;此时调用uxTaskGetSt…

计算机毕业设计Hadoop+Spark+Hive抖音情感分析 抖音可视化 抖音舆情监测 预测算法 抖音爬虫 抖音大数据 情感分析 NLP 自然语言处理

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; HadoopSparkHive抖音情感分…

tcp shutdown, fin_wait1, fin_wait2, close_wait, last_ack, 谢特!

TCP 作为双向传输协议&#xff0c;如果你想只收不发&#xff0c;可以单向关掉发&#xff0c;shutdown(socket.SHUT_WR)&#xff0c;但不建议这么做。 看以下代码&#xff1a; #!/Users/zhaoya/myenv/bin/python3 # client import socketclient_socket socket.socket(socket.…

redis安装使用

1. 下载地址 :::color1 下载最新稳定版本的 redis-windows 7.x 版本(本实例以 7.2.3 为例) ::: # 下载地址 https://download.csdn.net/download/qq827245563/899238402. 解压文件 ![](https://img-blog.csdnimg.cn/img_convert/c094d561f7f8ed6e9d139d07be1271cb.png) 3. …

如果在 Ubuntu 24.04 上安装 Yarn ?

Yarn 是一种快速、可靠、安全的 JavaScript 项目依赖管理工具&#xff0c;它提供了比同类产品更好的缓存机制、网络性能和更直观的用户界面。作为现代 web 开发的基本工具&#xff0c;在系统上安装 Yarn 可以确保您可以有效地管理项目依赖关系。 他的文章将指导您通过 4 种有效…

【React 轮子】文本溢出后显示展开/收起按钮

/** hooks* 用于文本展示时判断是否展示 展开/收起按钮 &#xff08;包含监听 文本变化/页面尺寸变换&#xff09;* param { string } text 需要展示的文本* param { number } maxLength 文本最大展示行数* param { number } lineHeight 文本行高 (单位 px) */ import React, …