【Hello算法】 > 第 2 关 >数据结构 之 数组与链表

news2024/11/25 6:29:21

数据结构 之 数组与链表

    • 1:Understanding data structures !
    • ——了解数据结构——
      • 1.1:Classification-分类-
      • 1.2:Type-类型-
    • 2:Arrays are the bricks that make up the wall of data structures *
    • ——数组是组成数据结构这堵墙的一块块砖——
      • 2.1:Common operations-常用操作-
      • 2.2:A&D-优缺点-
      • 2.3:Applicationg-应用-
    • 3:A linked list is a vine that shuttles between these bricks *
    • ——链表是穿梭在这些砖块间的藤蔓——
      • 3.1:Common operations-常用操作-
      • 3.2:Arrays VS Linked list-数组 VS 链表-
      • 3.3:Applicationg-应用-
    • 4:小结Tips:

———————————————————————————————————————————————————————————-
————————————————————Hello算法—速通笔记—第二集—start———————–———————————————-

1:Understanding data structures !

——了解数据结构——

1.1:Classification-分类-

常见的数据结构包括数组、链表、栈、队列、哈希表、树、堆、图,它们从 逻辑结构 和 物理结构 两个维度进行分类。

逻辑结构揭示了数据元素之间的逻辑关系:

  • 线性数据结构:数组、链表、栈、队列、哈希表,元素之间是一对一的顺序关系。
  • 非线性数据结构:树、堆、图、哈希表。(进一步划分为树形结构和网状结构)
    • 树形结构:树、堆、哈希表,元素之间是一对多的关系。
    • 网状结构:图,元素之间是多对多的关系。

物理结构反映了数据在计算机内存中的存储方式:

  • 当算法程序运行时,正在处理的数据主要存储在内存中。
  • 系统通过内存地址来访问目标位置的数据。
  • 内存是所有程序的共享资源。因此在数据结构与算法的设计中,内存资源是一个重要的考虑因素。
  • 所有数据结构都是基于数组、链表或二者的组合实现的。
    例如,栈和队列既可以使用数组实现,也可以使用链表实现;而哈希表的实现可能同时包含数组和链表。
    • 基于数组可实现:栈、队列、哈希表、树、堆、图、矩阵、张量(维度 >=3 的数组)等。
    • 基于链表可实现:栈、队列、哈希表、树、堆、图等。

1.2:Type-类型-

基本数据类型:
是 CPU 可以直接进行运算的类型,在算法中直接被使用,主要包括以下几种。

  • 整数类型 byte、short、int、long 。
  • 浮点数类型 float、double ,用于表示小数。
  • 字符类型 char ,用于表示各种语言的字母、标点符号甚至表情符号等。
  • 布尔类型 bool ,用于表示“是”与“否”判断。

基本数据类型以二进制的形式存储在计算机中。
基本数据类型提供了数据的 内容类型,而数据结构提供了数据的 组织方式

2:Arrays are the bricks that make up the wall of data structures *

——数组是组成数据结构这堵墙的一块块砖——

数组(array)是一种线性数据结构,其将相同类型的元素存储在连续的内存空间中。元素在数组中的位置称为该元素的索引(index)

2.1:Common operations-常用操作-

1:初始化数组 2:访问元素 3:插入元素 4:删除元素 5:遍历数组 6:查找元素 7:扩容数组

代码示例:

/*1------ 初始化数组 */
int arr[5];
int nums[5] = { 1, 3, 2, 5, 4 };// 存储在栈上
int* arr1 = new int[5];// 存储在堆上(需要手动释放空间)
int* nums1 = new int[5] { 1, 3, 2, 5, 4 };

/*2------ 随机访问元素 */
int randomAccess(int *nums, int size) {
    int randomIndex = rand() % size;// 在区间 [0, size) 中随机抽取一个数字
    int randomNum = nums[randomIndex];// 获取并返回随机元素
    return randomNum;
}

/*3------ 在数组的索引 index 处插入元素 num */
void insert(int *nums, int size, int num, int index) {
    for (int i = size - 1; i > index; i--) {// 把索引 index 以及之后的所有元素向后移动一位
        nums[i] = nums[i - 1];
    }
    nums[index] = num;// 将 num 赋给 index 处的元素
}

/*4------ 删除索引 index 处的元素 */
void remove(int *nums, int size, int index) {
    for (int i = index; i < size - 1; i++) {// 把索引 index 之后的所有元素向前移动一位
        nums[i] = nums[i + 1];
    }
}

/*5------ 遍历数组 */
void traverse(int *nums, int size) {
    int count = 0;
    for (int i = 0; i < size; i++) {// 通过索引遍历数组
        count += nums[i];
    }
}

/*6------ 在数组中查找指定元素 */
int find(int *nums, int size, int target) {
    for (int i = 0; i < size; i++) {
        if (nums[i] == target)
            return i;
    }
    return -1;
}

/*7------ 扩展数组长度 */
int *extend(int *nums, int size, int enlarge) {
    int *res = new int[size + enlarge]; // 初始化一个扩展长度后的数组
    for (int i = 0; i < size; i++) {// 将原数组中的所有元素复制到新数组
        res[i] = nums[i];
    }
    delete[] nums;// 释放内存
    return res;// 返回扩展后的新数组
}

2.2:A&D-优缺点-

A—Advantages:

  • 空间效率高:数组为数据分配了连续的内存块,无须额外的结构开销。
  • 支持随机访问:数组允许在 O(1) 时间内访问任何元素。
  • 缓存局部性:当访问数组元素时,计算机不仅会加载它,还会缓存其周围的其他数据,从而借助高速缓存来提升后续操作的执行速度。

连续空间存储是一把双刃剑。

D—Disadvantages:

  • 插入与删除效率低:当数组中元素较多时,插入与删除操作需要移动大量的元素。
  • 长度不可变:数组在初始化后长度就固定了,扩容数组开销很大。
  • 空间浪费:如果数组分配的大小超过实际所需,多余的空间就被浪费。

2.3:Applicationg-应用-

随机访问:随机抽取一些样本,可以用数组存储,并生成一个随机序列,根据索引实现随机抽样。
排序和搜索:快速排序、归并排序、二分查找等都主要在数组上进行。
查找表:当需要快速查找一个元素或其对应关系时,可以使用数组作为查找表。
假如我们想实现字符到 ASCII 码的映射,则可以将字符的 ASCII 码值作为索引,对应的元素存放在数组中的对应位置。
机器学习:神经网络中大量使用了向量、矩阵、张量之间的线性代数运算,这些数据都是以数组的形式构建的。
数组是神经网络编程中最常使用的数据结构。
数据结构实现:数组可以用于实现栈、队列、哈希表、堆、图等数据结构。例如,图的邻接矩阵表示实际上是一个二维数组。

3:A linked list is a vine that shuttles between these bricks *

——链表是穿梭在这些砖块间的藤蔓——

链表(linked list)是一种线性数据结构,其中的每个元素都是一个节点对象,各个节点通过“引用”相连接。
链表的组成单位是节点(node)对象。每个节点都包含两项数据:节点的“值”和指向下一节点的“引用”。节点有 头节点 和 尾节点 。
尾节点指向的是“空”,在 Java、C++ 和 Python 中分别被记为 null、nullptr 和 None 。
链表节点 ListNode 除了包含值,还需额外保存一个引用(指针)。因此在相同数据量下链表比数组占用更多的内存空间

3.1:Common operations-常用操作-

1:初始化链表 2:插入节点 3:删除节点 4:访问节点 5:查找节点

代码示例:

/*1------ 初始化链表 1 -> 3 -> 2 -> 5 -> 4 */
ListNode* n0 = new ListNode(1);// 初始化各个节点
ListNode* n1 = new ListNode(3);
ListNode* n2 = new ListNode(2);
ListNode* n3 = new ListNode(5);
ListNode* n4 = new ListNode(4);
n0->next = n1;// 构建节点之间的引用
n1->next = n2;
n2->next = n3;
n3->next = n4;

/*2------ 在链表的节点 n0 之后插入节点 P ------只需改变两个节点引用(指针)即可*/
void insert(ListNode *n0, ListNode *P) {
    ListNode *n1 = n0->next;
    P->next = n1;
    n0->next = P;
}

/*3------ 删除链表的节点 n0 之后的首个节点 ------只需改变一个节点的引用(指针)即可*/
void remove(ListNode *n0) {
    if (n0->next == nullptr)
        return;
    ListNode *P = n0->next; // n0 -> P -> n1
    ListNode *n1 = P->next;
    n0->next = n1;
    delete P;// 释放内存
}

/*4------ 访问链表中索引为 index 的节点 ------在链表中访问节点的效率较低*/
ListNode *access(ListNode *head, int index) {
    for (int i = 0; i < index; i++) {
        if (head == nullptr)
            return nullptr;
        head = head->next;
    }
    return head;
}

/*5------ 在链表中查找值为 target 的首个节点 ------属于线性查找*/
int find(ListNode *head, int target) {
    int index = 0;
    while (head != nullptr) {
        if (head->val == target)
            return index;
        head = head->next;
        index++;
    }
    return -1;
}

3.2:Arrays VS Linked list-数组 VS 链表-

在这里插入图片描述

3.3:Applicationg-应用-

常见的链表类型包括三种:
单向链表:即普通链表。
环形链表:令单向链表的尾节点指向头节点(首尾相接),得到一个环形链表。其任意节点都可以视作头节点。
双向链表:与单向链表相比,双向链表记录了两个方向的引用。双向链表更灵活,可以朝两个方向遍历链表,但也占用更多的内存空间。

  • 单向链表通常用于实现 栈、队列、哈希表和图等数据结构

  • 双向链表常用于需要快速查找前一个和后一个元素的场景。

    • 高级数据结构:比如在红黑树、B 树中,我们需要访问节点的父节点,这可以通过在节点中保存一个指向父节点的引用来实现。
    • 浏览器历史:在网页浏览器中,当用户点击前进或后退按钮时,浏览器需要知道用户访问过的前一个和后一个网页。
    • LRU 算法:在缓存淘汰(LRU)算法中,我们需要快速找到最近最少使用的数据,以及支持快速添加和删除节点。
  • 环形链表常用于需要周期性操作的场景,比如操作系统的资源调度。

    • 时间片轮转调度算法在操作系统中,时间片轮转调度算法是一种常见的 CPU 调度算法,需要对一组进程进行循环。
    • 数据缓冲区:在某些数据缓冲区的实现中,也可能会使用环形链表。

4:小结Tips:

  • 哈希表可能同时包含线性数据结构(数组、链表)和非线性数据结构(树)。
  • char类型的长度由编程语言采用的编码方法决定,可能为1字节或2字节。
  • 栈(队列)可以实现动态的数据操作,但数据结构仍然是“静态”(长度不可变)的。
  • 原码和补码的相互转换实际上是计算“补数”的过程。
  • res = [0] * self.size() 操作,列表不会导致 res 的每个元素引用相同的地址,但二维列表会。
  • C++ STL 里面的 std::list 已经实现了双向链表,但不常被使用,因为空间开销与缓存不友好。
  • 数组中存储的是节点的引用,而非节点本身。
  • 数组要求相同类型的元素,在链表中没有强调相同类型。

————————————————————————————————————————————————————————————
—————————————————————Hello算法—速通笔记—第二集—end—————————————————————–—-

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

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

相关文章

软件开发有那些陷阱?如何避坑?

引言 在当今数字化时代&#xff0c;软件开发已成为推动科技进步和商业发展的重要引擎。然而&#xff0c;软件开发并非一帆风顺&#xff0c;其中蕴藏着许多陷阱和挑战。如何避免这些陷阱&#xff0c;提高软件开发的效率和质量&#xff0c;成为开发者们面临的重要问题 本文将深入…

UltraScale 架构 SelectIO 资源之IODELAY与IOSERDES仿真与使用

平台&#xff1a;vivado2018.3 具体内容见ug571-ultrascale-selectio IDELAYE3 在调试超高速信号的时候&#xff0c;需要使用iodelayiserdes来调试校准输入信号。例如外部某ADC采样率为5GHZ&#xff0c;外部ADC使用2.5GHZ的时钟去采集输入信号。为了实现采集&#xff0c;adc芯…

【python】python基于Pygame扫雷游戏设计实现(源码+报告)【独一无二】

> &#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博…

AD7685BRMZRL7 16位 2.3V 低功耗模数转换器芯片 ADI

AD7685BRMZRL7是一款由ADI&#xff08;亚德诺&#xff09;公司生产的模数转换器&#xff08;ADC&#xff09;芯片。该芯片的主要功能是将模拟信号转换为数字信号&#xff0c;以便在数字系统中处理. AD7685BRMZRL7 规格信息&#xff1a; 制造商:Analog Devices Inc. 产品种类:模…

volatile是如何禁止指令进行重排序的

Further Reading &#xff1a; 内存屏障类型介绍&#xff08;StoreStore&#xff0c;StoreLoad&#xff0c;LoadLoad&#xff0c;LoadStore&#xff09; Further Reading &#xff1a; 什么是指令重排 重排序分为编译器重排序和处理器重排序。 为了实现volatile内存语义&#x…

本地开发nginx代理服务器(2024-04-10)

1、nginx 解释 nginx 是一个高性能的HTTP和反向代理服务器&#xff0c;同时也是一个IMAP/POP3/SMTP 代理服务器。 在性能上&#xff0c;Nginx占用很少的系统资源&#xff0c;能支持更多的并发连接&#xff0c;达到更高的访问效率&#xff1b; 在功能上&#xff0c;Nginx是优…

展厅装修设计中合理的使用颜色

一、选择合适的主题是最重要的一点 一个引人注目的主题可以立即吸引到游客的注意力&#xff0c;成功的将展厅的主题和产品联系在一起。这个主题应该是与你的产品或服务密切相关的&#xff0c;同时又足够具有吸引力&#xff0c;以吸引消费者对你的展厅产生好奇心。 二、合理的使…

武汉星起航领航跨境电商风潮,一站式服务赋能创业者翱翔

在全球化浪潮的推动下&#xff0c;跨境电商行业如日中天&#xff0c;成为外贸领域的新宠。众多企业纷纷涉足这一领域&#xff0c;寻求新的增长点。然而&#xff0c;在这个竞争激烈的市场中&#xff0c;武汉星起航电子商务有限公司以其独特的服务理念和一站式解决方案&#xff0…

Windows系统本地部署Jupyter Notebook并实现公网访问编辑笔记

文章目录 1.前言2.Jupyter Notebook的安装2.1 Jupyter Notebook下载安装2.2 Jupyter Notebook的配置2.3 Cpolar下载安装 3.Cpolar端口设置3.1 Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 在数据分析工作中&#xff0c;使用最多的无疑就是各种函数、图表、…

正向代理是什么?为什么要使用它?

在跨境行业中&#xff0c;会有跨境用户会询问到一个词&#xff1a;正向代理&#xff1b;正向代理是什么意思&#xff0c;它又有什么作用&#xff0c;为什么要使用它呢&#xff1f;为大家来解答。 正向代理是一种网络架构模式&#xff0c;它位于客户端和互联网之间&#xff0c;…

DedeCMS 未授权远程命令执行漏洞分析

dedecms介绍 DedeCMS是国内专业的PHP网站内容管理系统-织梦内容管理系统&#xff0c;采用XML名字空间风格核心模板&#xff1a;模板全部使用文件形式保存&#xff0c;对用户设计模板、网站升级转移均提供很大的便利&#xff0c;健壮的模板标签为站长DIY自己的网站提供了强有力…

【微服务】------常见模型的分析与比较

DDD 分层架构 整洁架构 整洁架构又名“洋葱架构”。为什么叫它洋葱架构&#xff1f;看看下面这张图你就明白了。整洁架构的层就像洋葱片一样&#xff0c;它体现了分层的设计思想。 整洁架构最主要的原则是依赖原则&#xff0c;它定义了各层的依赖关系&#xff0c;越往里依赖越…

Python单元测试pytest捕获日志输出

使用pytest进行单元测试时&#xff0c;遇到了需要测试日志输出的情况&#xff0c;查看了文档 https://docs.pytest.org/en/latest/how-to/capture-stdout-stderr.html https://docs.pytest.org/en/latest/how-to/logging.html 然后试了一下&#xff0c;捕捉logger.info可以用…

2024妈妈杯数学建模D题思路分析-量子计算在矿山设备配置及运营中的建模应用

# 1 赛题 D 题 量子计算在矿山设备配置及运营中的建模应用 随着智能技术的发展&#xff0c;智慧矿山的概念越来越受到重视。越来越多的 设备供应商正在向智慧矿山整体解决方案供应商转型&#xff0c;是否具备提供整体 解决方案的能力&#xff0c;也逐步成为众多矿山设备企业的核…

蓝桥杯 每天2题 day6

碎碎念&#xff1a;哇咔咔 要不是中间缺勤一天就圆满day7了&#xff01;最后一晚上&#xff01;写题复习哇咔咔 唉&#xff0c;睡了一觉就看不下去了&#xff0c;&#xff0c;&#xff0c;看看之前的笔记洗洗睡觉&#xff0c;&#xff0c;&#xff0c; 记得打印准考证带好东西…

(学习日记)2024.04.15:UCOSIII第四十三节:任务消息队列

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

Pandas部分应掌握的重要知识点

目录 Pandas部分应掌握的重要知识点一、DataFrame数据框的创建1、直接基于二维数据创建&#xff08;同时使用index和columns参数&#xff09;2、基于excel文件中的数据来创建 二、查看数据框中的数据和联机帮助信息1、查看特殊行的数据2、查看联机帮助的两种常见方法&#xff0…

Harbor镜像仓库报错“Harbor被设置为只读模式,在此模式下,不能删除仓库、标签及推送镜像。”

由于Harbor镜像仓库空间不足&#xff0c;今天扩容的磁盘空间&#xff0c;扩容前做了垃圾清理操作&#xff0c;然后直接停止了服务。估计清理任务没完成&#xff0c;导致服务启动后Harbor被设置为只读模式&#xff0c;无法使用。下面是解决方法。 1、报错信息&#xff1a; “Ha…

【Linux】基础IO----理解缓冲区

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;理解缓冲区 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会坚持。早安! > 专栏选自&#xff1a;Linux初阶 > 望…

开源模型应用落地-chatglm3-6b-zero/one/few-shot-入门篇(五)

一、前言 Zero-Shot、One-Shot和Few-Shot是机器学习领域中重要的概念&#xff0c;特别是在自然语言处理和计算机视觉领域。通过Zero-Shot、One-Shot和Few-Shot学习&#xff0c;模型可以更好地处理未知的情况和新任务&#xff0c;减少对大量标注数据的依赖&#xff0c;提高模型的…