【数据结构】实现方式、应用场景与优缺点的系统总结

以下是编程中常见的数据结构及其实现方式、应用场景与优缺点的系统总结:


一、线性数据结构

1. 数组 (Array)
  • 定义:连续内存空间存储相同类型元素。
  • 实现方式
    int[] arr = new int[10]; // Java
    
    arr = [0] * 10  # Python
    
  • 操作
    • 访问:O(1)(通过索引)
    • 插入/删除:O(n)(需移动元素)
  • 优点:内存连续,高速缓存友好。
  • 缺点:大小固定,动态扩容成本高。
  • 应用场景:频繁随机访问,如矩阵运算。

2. 链表 (Linked List)
  • 定义:通过指针连接的非连续内存节点。
  • 实现方式(单向链表):
    class Node {int val;Node next;Node(int val) { this.val = val; }
    }
    Node head = new Node(0); // Java
    
  • 操作
    • 插入/删除:O(1)(已知位置时)
    • 访问:O(n)
  • 优点:动态大小,高效插入删除。
  • 缺点:内存不连续,缓存不友好。
  • 变种:双向链表、循环链表。
  • 应用场景:LRU缓存、浏览器历史记录。

3. 栈 (Stack)
  • 定义:后进先出(LIFO)结构。
  • 实现方式
    • 数组实现:
      stack = []
      stack.append(1)  # Push
      stack.pop()      # Pop (Python)
      
    • 链表实现:
      class Stack {Node top;void push(int val) { /* 插入链表头部 */ }int pop() { /* 删除链表头部 */ }
      }
      
  • 应用场景:函数调用栈、括号匹配。

4. 队列 (Queue)
  • 定义:先进先出(FIFO)结构。
  • 实现方式
    • 数组实现(循环队列):
      class CircularQueue {int[] arr;int front, rear, size;// 实现enqueue、dequeue
      }
      
    • 链表实现:
      from collections import deque
      q = deque()  # Python双端队列
      q.append(1)  # 入队
      q.popleft()  # 出队
      
  • 变种:双端队列(Deque)、优先队列(Priority Queue)。
  • 应用场景:任务调度、BFS算法。

二、树形数据结构

1. 二叉树 (Binary Tree)
  • 定义:每个节点最多两个子节点。
  • 实现方式
    class TreeNode {int val;TreeNode left, right;TreeNode(int val) { this.val = val; }
    }
    
  • 变种
    • 二叉搜索树 (BST):左子树所有节点值 < 根 < 右子树。
    • 平衡树 (AVL/红黑树):自动调整高度平衡。
  • 操作:插入/删除/查找(BST平均 O(log n), 最差 O(n))。

2. 堆 (Heap)
  • 定义:完全二叉树,满足堆属性(最大堆/最小堆)。
  • 实现方式
    • 数组实现:
      # Python heapq模块(最小堆)
      import heapq
      heap = []
      heapq.heappush(heap, 3)
      heapq.heappop(heap)
      
  • 应用场景:优先队列、Top K问题。

三、散列表 (Hash Table)

  • 定义:通过哈希函数映射键到存储位置。
  • 实现方式(链地址法):
    class HashMap {LinkedList<Entry>[] buckets;class Entry { K key; V value; }void put(K key, V value) { /* 计算哈希并处理冲突 */ }V get(K key) { /* 查找链表 */ }
    }
    
  • 操作
    • 平均 O(1)(假设哈希函数均匀)。
    • 最差 O(n)(所有键冲突)。
  • 优点:高效查找、插入、删除。
  • 缺点:内存开销大,无序。
  • 应用场景:字典、缓存(如Redis)。

四、图 (Graph)

  • 定义:由顶点和边组成的非线性结构。
  • 实现方式
    • 邻接矩阵
      graph = [[0 for _ in range(n)] for _ in range(n)]
      graph[i][j] = weight  # 边权重
      
    • 邻接表
      class Graph {List<List<Integer>> adjList;Graph(int n) { adjList = new ArrayList<>(n); }void addEdge(int u, int v) { adjList.get(u).add(v); }
      }
      
  • 应用场景:社交网络、路径规划(Dijkstra算法)。

五、对比总结

数据结构优势劣势典型应用
数组快速随机访问大小固定,插入删除慢数值计算
链表动态扩展,高效插入删除随机访问慢实现栈/队列
哈希表平均O(1)操作内存占用大,无序缓存、去重
二叉搜索树有序数据存储,查找高效可能退化为链表数据库索引
快速获取极值仅支持极值访问任务调度
建模复杂关系算法复杂度高推荐系统

选择建议

  • 需要快速查询 → 哈希表。
  • 需要有序数据 → 平衡二叉搜索树(如TreeMap)。
  • 高频插入删除 → 链表。
  • 分层处理数据 → 树(如文件系统)。
  • 数据存在复杂关联 → 图。

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

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

相关文章

PyTorch中cdist和sum函数使用示例详解

以下是PyTorch中cdist与sum函数的联合使用详解: 1. cdist函数解析 功能:计算两个张量间的成对距离矩阵 输入格式: X1:形状为(B, P, M)的张量X2:形状为(B, R, M)的张量p:距离类型(默认2表示欧式距离)输出:形状为(B, P, R)的距离矩阵,其中元素 d i j d_{ij} dij​表示…

Ansible配置文件常用选项详解

Ansible 的配置文件采用 INI 格式&#xff0c;分为多个模块&#xff0c;每个模块包含特定功能的配置参数。 以下是ansible.cfg配置文件中对各部分的详细解析&#xff1a; [defaults]&#xff08;全局默认配置&#xff09; inventory 指定主机清单文件路径&#xff0c;默认值为 …

了解FTP搜索引擎

根据资料&#xff0c; FTP搜索引擎是专门搜集匿名FTP服务器提供的目录列表&#xff0c;并向用户提供文件信息的网站&#xff1b; FTP搜索引擎专门针对FTP服务器上的文件进行搜索&#xff1b; 就是它的搜索结果是一些FTP资源&#xff1b; 知名的FTP搜索引擎如下&#xff0c; …

【大模型面试每日一题】Day 28:AdamW 相比 Adam 的核心改进是什么?

【大模型面试每日一题】Day 28&#xff1a;AdamW 相比 Adam 的核心改进是什么&#xff1f; &#x1f4cc; 题目重现 &#x1f31f;&#x1f31f; 面试官&#xff1a;AdamW 相比 Adam 的核心改进是什么&#xff1f; #mermaid-svg-BJoVHwvOm7TY1VkZ {font-family:"trebuch…

C++系统IO

C系统IO 头文件的使用 1.使用系统IO必须包含相应的头文件&#xff0c;通常使用#include预处理指令。 2.头文件中包含了若干变量的声明&#xff0c;用于实现系统IO。 3.头文件的引用方式有双引号和尖括号两种&#xff0c;区别在于查找路径的不同。 4.C标准库提供的头文件通常没…

多模态理解大模型高性能优化丨前沿多模态模型开发与应用实战第七期

一、引言 在前序课程中&#xff0c;我们系统剖析了多模态理解大模型&#xff08;Qwen2.5-VL、DeepSeek-VL2&#xff09;的架构设计。鉴于此类模型训练需消耗千卡级算力与TB级数据&#xff0c;实际应用中绝大多数的用户场景均围绕推理部署展开&#xff0c;模型推理的效率影响着…

各个网络协议的依赖关系

网络协议的依赖关系 学习网络协议之间的依赖关系具有多方面重要作用&#xff0c;具体如下&#xff1a; 帮助理解网络工作原理 - 整体流程明晰&#xff1a;网络协议分层且相互依赖&#xff0c;如TCP/IP协议族&#xff0c;应用层协议依赖传输层的TCP或UDP协议来传输数据&#…

11.8 LangGraph生产级AI Agent开发:从节点定义到高并发架构的终极指南

使用 LangGraph 构建生产级 AI Agent:LangGraph 节点与边的实现 关键词:LangGraph 节点定义, 条件边实现, 状态管理, 多会话控制, 生产级 Agent 架构 1. LangGraph 核心设计解析 LangGraph 通过图结构抽象复杂 AI 工作流,其核心要素构成如下表所示: 组件作用描述代码对应…

相机--基础

在机器人开发领域&#xff0c;相机种类很多&#xff0c;作为一个机器人领域的开发人员&#xff0c;我们需要清楚几个问题&#xff1a; 1&#xff0c;相机的种类有哪些&#xff1f; 2&#xff0c;各种相机的功能&#xff0c;使用场景&#xff1f; 3&#xff0c;需要使用的相机…

【备忘】 windows 11安装 AdGuardHome,实现开机自启,使用 DoH

windows 11安装 AdGuardHome&#xff0c;实现开机自启&#xff0c;使用 DoH 下载 AdGuardHome解压 AdGuardHome启动 AdGuard Home设置 AdGuardHome设置开机自启安装 NSSM设置开机自启重启电脑后我们可以访问 **http://127.0.0.1/** 设置使用 AdGuardHome DNS 效果图 下载 AdGua…

安装部署配置jenkins

随着现代软件开发流程的不断演进,持续集成(CI)和持续交付(CD)已经成为了开发团队必不可少的工具。而Jenkins作为最为广泛应用的CI/CD工具,能够自动化执行构建、测试、部署等任务。Maven作为Java生态中广泛使用的构建工具,它能够帮助开发人员自动化管理项目的构建、依赖和…

How to balance work and personal life?

How to balance work and personal life? 1. Background2. How to balance work and personal life?References 1. Background Let me introduce /ˌɪntrəˈdjuːs/ the background /ˈbkɡraʊnd/ first. Today we will talk about this topic: How to balance work and …

存储引擎系列--LSM的Compaction研究方法论

本文主要包含以下内容: 1、Compaction 设计空间的四个原语:触发器、数据布局、压缩粒度、数据移动策略。任何已有的compaction策略和新的策略都可以由这个四个原语组建构成。 2、详细介绍这四个原语的定义,策略方法 3、现有的基于LSM的知名系统的compaction策略按照四个原语…

关系数据库基础入门

关系数据库概述 相关名词 1、关系&#xff1a;在关系数据库中&#xff0c;实体以及实体间的联系都是用关系来表示的。类似于程序设计语言中变量的概念。 2、关系模式&#xff1a;是对关系的描述。类似于程序设计语言中类型定义的概念。 3、关系模型&#xff1a;是由若干个关系…

图解BERT

图解 Bert 大家可以访问 图解Bert 获取更加优质的阅读体验。 图解BERT一文还在持续更新中。 环境搭建 按序执行以下命令完成环境搭建: git clone https://github.com/DA-southampton/Read_Bert_Code.git cd Read_Bert_Code conda create -n Read_Bert_Code python3.9.22 co…

【HarmonyOS 5】鸿蒙中的UIAbility详解(一)

【HarmonyOS 5】鸿蒙中的UIAbility详解&#xff08;一&#xff09; 一、UIAbility是什么&#xff1f; Stage模型中的组件类型名&#xff0c;即UIAbility组件&#xff0c;包含UI&#xff0c;提供展示UI的能力&#xff0c;主要用于和用户交互。 UIAbility类似于传统移动开发An…

Transformer预训练模型微调技术全解析

引言:Transformer预训练模型与微调的浪潮 近年来,人工智能领域取得了令人瞩目的成就,特别是在自然语言处理(NLP)方面。引领这场变革的核心技术之一便是Transformer架构。自2017年 Vaswani 等人在论文 "Attention Is All You Need" 中提出以来,Transformer凭借…

《算法笔记》12.2小节——字符串专题->KMP算法 问题 C: 剪花布条

题目描述 一块花布条&#xff0c;里面有些图案&#xff0c;另有一块直接可用的小饰条&#xff0c;里面也有一些图案。对于给定的花布条和小饰条&#xff0c;计算一下能从花布条中尽可能剪出几块小饰条来呢&#xff1f; 输入 输入中含有一些数据&#xff0c;分别是成对出现的…

实现一个前端动态模块组件(Vite+原生JS)

1. 引言 在前面的文章《使用Vite创建一个动态网页的前端项目》中我们实现了一个动态网页。不过这个动态网页的实用价值并不高&#xff0c;在真正实际的项目中我们希望的是能实现一个动态的模块组件。具体来说&#xff0c;就是有一个页面控件同时在多个页面中使用&#xff0c;那…

NTFS0x90属性和0xa0属性和0xb0属性的一一对应关系是index_entry中的index_node中VCN和runlist和bitmap

第一部分&#xff1a; 0: kd> dt _FILE_RECORD_SEGMENT_HEADER 0xc1241400 Ntfs!_FILE_RECORD_SEGMENT_HEADER 0x000 MultiSectorHeader : _MULTI_SECTOR_HEADER 0x008 Lsn : _LARGE_INTEGER 0x80e74aa 0x010 SequenceNumber : 5 0x012 Referen…