数据结构——常见数据结构和应用

数据结构是计算机科学中的一个基本概念,它涉及数据的组织、管理和存储方式。以下是对数据结构的详细解释:

一、定义与组成

  1. 数据描述事物的符号记录,是计算机程序的输入和输出。它可以以多种形式存在,如数字、文字、图像、声音等。数据是信息的载体,具有可识别性、可存储性、可处理性和可传输性等特点。
  2. 数据对象必须由软件理解的复合信息表示。它可以是外部实体、事物、偶发事件或事件、角色、组织单位、地点或结构等的抽象表示。数据对象具有独立性、意义性和封装性等特点,只封装数据,没有对数据的操作。
  3. 数据元素数据的基本单位,也叫做结点或记录。在计算机程序中,数据元素通常作为一个整体进行考虑和处理。数据元素由数据项组成,数据项是构成数据元素的不可分割的最小单位。
  4. 数据结构相互之间存在一种或多种特定关系的数据元素的集合。这些关系定义了数据元素之间的逻辑结构和存储结构,以及可以对这些数据元素执行的操作。

二、逻辑结构

逻辑结构与数据的存储无关,独立于计算机,是从具体问题抽象出来的数学模型。常见的逻辑结构包括:

  1. 集合:数据结构中的元素之间除了“同属一个集合”的相互关系外,别无其他关系。
  2. 线性结构:数据结构中的元素存在一对一的相互关系。典型的线性表有链表、栈和队列。它们共同的特点就是数据之间的线性关系,除了头结点和尾结点之外,每个结点都有唯一的前驱和唯一的后继,也就是所谓的一对一的关系。
  3. 树形结构:数据结构中的元素存在一对多的相互关系。每个节点有0个或多个子节点,没有父节点的节点称为根节点,每一个非根节点有且只有一个父节点。除了根节点外,每个子节点可以分为多个不相交的子树。
  4. 图形结构:数据结构中的元素存在多对多的相互关系。

三、存储结构

存储结构依赖于计算机,是数据的物理视图。常见的存储结构有:

  1. 顺序存储:用一段物理地址连续的存储单元依次存储数据元素的线性结构。特点为空间连续,支持随机访问,但中间或前面部分的插入删除时间复杂度较高,且增容的代价比较大。
  2. 链式存储:一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。包括无头单向非循环链表、带头双向循环链表等。特点为插入和删除操作的时间复杂度为O(1),但需要额外的存储空间来保存指针;查找元素需要遍历整个链表,耗时较长。
  3. 索引存储:通过索引表来存储数据元素。索引表由若干索引项组成,每个索引项至少包含两个内容:关键字和该关键字所在数据的物理地址。
  4. 哈希存储:根据关键码值(key-value)直接访问的数据结构。特点为查找、插入和删除操作的时间复杂度通常为O(1),但需要额外的存储空间来保存哈希函数和哈希表。

四、运算

运算是定义在数据的逻辑结构上的一组操作,用于对数据元素进行处理以实现特定功能。每种数据结构都有一个运算的集合,如搜索、插入、删除、更新、排序等。

五、分类

数据结构可以根据其逻辑结构和存储结构的不同进行分类,例如:

  1. 线性数据结构:如数组、链表(单链表、双向链表、循环链表)、栈和队列()等。
  2. 非线性数据结构:如树(包括二叉树、平衡二叉树、红黑树等)、图(包括有向图和无向图)和堆(包括最大堆和最小堆)等。

六、常见数据结构及其应用

  1. 数组:用于存储和管理有序集合的数据,如列表。
    public class ArrayExample {public static void main(String[] args) {int[] array = {1, 2, 3, 4, 5};// 访问数组元素System.out.println(array[0]); // 输出 1// 修改数组元素array[0] = 10;System.out.println(array[0]); // 输出 10}
    }

  2. 链表:同样用于存储和管理有序集合的数据,如队列、栈等。链表允许在任意位置进行插入和删除操作,具有灵活性。
    class Node {int data;Node next;Node(int data) {this.data = data;this.next = null;}
    }public class LinkedListExample {Node head;public void add(int data) {Node newNode = new Node(data);if (head == null) {head = newNode;} else {Node temp = head;while (temp.next != null) {temp = temp.next;}temp.next = newNode;}}public void printList() {Node temp = head;while (temp != null) {System.out.print(temp.data + " ");temp = temp.next;}}public static void main(String[] args) {LinkedListExample list = new LinkedListExample();list.add(1);list.add(2);list.add(3);list.printList(); // 输出 1 2 3}
    }

  3. :一种特殊的线性表,只允许在固定的一端进行插入和删除元素操作。特点为后进先出(LIFO),通常用于递归调用、函数调用栈等场景。
    public class StackExample {private int maxSize;private int[] stackArray;private int top;public StackExample(int size) {this.maxSize = size;this.stackArray = new int[maxSize];this.top = -1;}public void push(int value) {if (isFull()) {System.out.println("Stack is full");return;}stackArray[++top] = value;}public int pop() {if (isEmpty()) {throw new RuntimeException("Stack is empty");}return stackArray[top--];}public boolean isEmpty() {return (top == -1);}public boolean isFull() {return (top == maxSize - 1);}public static void main(String[] args) {StackExample stack = new StackExample(3);stack.push(1);stack.push(2);stack.push(3);System.out.println(stack.pop()); // 输出 3System.out.println(stack.pop()); // 输出 2}
    }

  4. 队列:一种先进先出的线性表,允许在一端进行插入操作(入队),在另一端进行删除操作(出队)。特点为先进先出(FIFO),常用于缓冲区、任务调度等场景。
    public class QueueExample {private int front, rear, size;private int capacity;private int[] queue;public QueueExample(int capacity) {this.capacity = capacity;this.front = this.size = 0;this.rear = capacity - 1;this.queue = new int[capacity];}private boolean isFull() {return size == capacity;}private boolean isEmpty() {return size == 0;}public void enqueue(int item) {if (isFull())return;rear = (rear + 1) % capacity;queue[rear] = item;size = size + 1;}public int dequeue() {int item = -1;if (isEmpty())return item;item = queue[front];front = (front + 1) % capacity;size = size - 1;return item;}public int front() {if (isEmpty())return -1;return queue[front];}public int rear() {if (isEmpty())return -1;return queue[rear];}public static void main(String[] args) {QueueExample queue = new QueueExample(5);queue.enqueue(10);queue.enqueue(20);queue.enqueue(30);queue.enqueue(40);System.out.println(queue.dequeue()); // 输出 10System.out.println(queue.front());   // 输出 20System.out.println(queue.rear());    // 输出 40}
    }

  5. :由n(n≥1)个有限节点组成的一个具有层次关系的集合。常用于表示层次结构,如文件系统、组织结构图等。
    class TreeNode {int data;TreeNode left, right;TreeNode(int item) {data = item;left = right = null;}
    }// 二叉树的基本操作(如插入、遍历等)需要额外实现

  6. :一系列顶点(元素)的集合,这些顶点通过一系列边连接起来组成图这种数据结构。顶点用圆圈表示,边就是这些圆圈之间的连线。图用于表示网络结构,如社交网络、交通网络等。
    import java.util.*;class Graph {private int V; // 顶点数private LinkedList<Integer> adj[]; // 邻接表// 构造函数Graph(int v) {V = v;adj = new LinkedList[v];for (int i = 0; i < v; ++i)adj[i] = new LinkedList();}// 添加边void addEdge(int v, int w) {adj[v].add(w); // 添加w到v的列表}// 打印图(用于调试)void printGraph() {for (int v = 0; v < V; ++v) {System.out.print("\n Adjacency list of vertex " + v);for (Integer n : adj[v])System.out.print(" -> " + n);System.out.println();}}public static void main(String args[]) {Graph g1 = new Graph(5);g1.addEdge(0, 1);g1.addEdge(0, 4);g1.addEdge(1, 2);g1.addEdge(1, 3);g1.addEdge(1, 4);g1.addEdge(2, 3);g1.addEdge(3, 4);g1.printGraph();}
    }

  7. :一种特殊的完全二叉树结构,分为最大堆和最小堆。最大堆中每个节点的值都大于或等于其子节点的值;最小堆中每个节点的值都小于或等于其子节点的值。常用于实现优先队列等场景。
    import java.util.Arrays;public class MaxHeap {private int[] heap;private int size;private int capacity;// 构造函数,初始化堆public MaxHeap(int capacity) {this.capacity = capacity;this.heap = new int[capacity];this.size = 0;}// 堆化一个数组以构建最大堆public MaxHeap(int[] array) {this.capacity = array.length;this.heap = new int[capacity];this.size = capacity;System.arraycopy(array, 0, heap, 0, capacity);for (int i = size / 2 - 1; i >= 0; i--) {heapifyDown(i);}}// 插入一个新元素public void insert(int value) {if (size == capacity) {throw new IllegalStateException("Heap is full");}heap[size] = value;size++;heapifyUp(size - 1);}// 获取堆顶元素(最大值)public int getMax() {if (size == 0) {throw new IllegalStateException("Heap is empty");}return heap[0];}// 移除堆顶元素public int extractMax() {if (size == 0) {throw new IllegalStateException("Heap is empty");}int maxValue = heap[0];heap[0] = heap[size - 1];size--;heapifyDown(0);return maxValue;}// 上滤操作,用于插入新元素后维护堆的性质private void heapifyUp(int index) {while (index > 0) {int parentIndex = (index - 1) / 2;if (heap[parentIndex] < heap[index]) {swap(parentIndex, index);index = parentIndex;} else {break;}}}// 下滤操作,用于移除堆顶元素后维护堆的性质private void heapifyDown(int index) {int largest = index;int leftChild = 2 * index + 1;int rightChild = 2 * index + 2;if (leftChild < size && heap[leftChild] > heap[largest]) {largest = leftChild;}if (rightChild < size && heap[rightChild] > heap[largest]) {largest = rightChild;}if (largest != index) {swap(index, largest);heapifyDown(largest);}}// 交换堆中两个元素的位置private void swap(int index1, int index2) {int temp = heap[index1];heap[index1] = heap[index2];heap[index2] = temp;}// 打印堆的内容public void printHeap() {System.out.println(Arrays.toString(Arrays.copyOfRange(heap, 0, size)));}// 主方法,用于测试public static void main(String[] args) {MaxHeap maxHeap = new MaxHeap(10);maxHeap.insert(3);maxHeap.insert(1);maxHeap.insert(6);maxHeap.insert(5);maxHeap.insert(2);maxHeap.insert(4);maxHeap.printHeap(); // 输出堆的内容System.out.println("Max: " + maxHeap.getMax()); // 输出最大值System.out.println("After extracting max:");maxHeap.extractMax();maxHeap.printHeap(); // 输出移除最大值后的堆内容}
    }

  8. 散列表:也叫哈希表,是根据键和值(key和value)直接进行访问的数据结构。通过key和value来映射到集合中的一个位置,从而可以很快找到集合中的对应元素。常用于实现快速查找、缓存等场景。
    import java.util.HashMap;
    import java.util.Map;public class HashTableExample {public static void main(String[] args) {// 创建一个HashMap实例Map<String, Integer> hashMap = new HashMap<>();// 插入键值对hashMap.put("apple", 1);hashMap.put("banana", 2);hashMap.put("orange", 3);// 访问元素System.out.println("Value for key 'apple': " + hashMap.get("apple"));// 检查键是否存在if (hashMap.containsKey("banana")) {System.out.println("Key 'banana' exists in the map.");}// 移除键值对hashMap.remove("orange");// 遍历HashMapfor (Map.Entry<String, Integer> entry : hashMap.entrySet()) {System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());}}
    }

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

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

相关文章

Linux正则化与三剑客速成(一)

目录 1.正则化 1.1正则表达式&#xff08;RE&#xff09; 1.2 正则表达式的注意事项 1.3正则表达式的分类 1.4 基本正则表达式 ^:表示匹配文本中以某个字符串开头的行。 $:表示匹配以某个字符串结尾的文件内的行 ^$:表示空行&#xff0c;但是在Linux中的实际的操作中一…

HarmonyOS 非线性容器LightWeightMap 常用的几个方法

LightWeightMap可用于存储具有关联关系的key-value键值对集合&#xff0c;存储元素中key值唯一&#xff0c;每个key对应一个value。 LightWeightMap依据泛型定义&#xff0c;采用轻量级结构&#xff0c;初始默认容量大小为8&#xff0c;每次扩容大小为原始容量的两倍。 集合中k…

Docker的容器

目录 1. 什么是容器&#xff1f;2. 容器的生命周期2.1 容器处理OOM事件2.2 容器异常退出2.3 容器暂停 3. 容器命令详解3.1 容器命令清单3.2 docker create命令3.3 docker run命令3.4 docker ps命令3.5 docker logs命令3.6 docker attach命令3.7 docker exec命令3.8 docker stat…

《红队蓝队在网络安全对抗演练中的运作模式》

在网络安全领域&#xff0c;红队与蓝队的对抗性演练是一个复杂且系统的过程&#xff0c;主要包括以下阶段&#xff1a; 一、演练规划阶段 确定目标和范围 组织首先要明确演练的目的&#xff0c;例如测试新部署的网络安全防御系统的有效性、评估员工对网络安全威胁的应对能力或者…

LearnOpenGL学习(高级OpenGL -> 高级GLSL,几何着色器)

完整代码见&#xff1a;zaizai77/Cherno-OpenGL: OpenGL 小白学习之路 高级GLSL 内建变量 顶点着色器 gl_PointSoze : float 输出变量&#xff0c;用于控制渲染 GL_POINTS 型图元时&#xff0c;点的大小。可用于粒子系统。将其设置为 gl_Position.z 时&#xff0c;可以使点…

Excel/VBA 正则表达式归纳汇总

1.with结构。以下语句用来提取A列中的“成品”两个字前面的部分的中文&#xff0c;不含成品两个字&#xff0c;结果存放在第2列。使用了On Error Resume Next&#xff0c;表示错误时继续下一条。 Sub 提取口味() Set regx CreateObject("vbscript.regexp") On Err…

CodeMirror 如何动态更新definemode

CodeMirror 如何动态更新definemode 问题描述&#xff1a;解决方法&#xff1a; 问题描述&#xff1a; 项目中有一部分用到了CodeMirror组件&#xff0c;其高亮显示的内容需要根据最新的json动态的更新&#xff0c;需要使用definemode自定义高亮内容。 想要的效果如下&#xf…

深度与视差的关系及其转换

深度与视差的关系及其转换 在计算机视觉和立体视觉中&#xff0c;深度和视差是两个重要的概念。理解这两者之间的关系对于实现立体图像处理、三维重建以及深度估计至关重要。在这篇博客中&#xff0c;我们将深入探讨深度和视差的概念&#xff0c;并介绍它们之间的转换关系。 …

用户发送请求后服务端i/o工作过程

华子目录 服务端i/o介绍磁盘i/o机械磁盘的寻道时间、旋转延迟和数据传输时间常见的机械磁盘平均寻道时间值常见磁盘的平均延迟时间每秒最大IOPS的计算方法 网络i/o网络I/O处理过程磁盘和网络i/o 一次完整的请求在内部的执行过程 服务端i/o介绍 i/o在计算机中指Input/Output&am…

http的MIME类型

在 HTTP 协议中&#xff0c;MIME 类型&#xff08;Multipurpose Internet Mail Extensions&#xff09;用于描述传输内容的类型和格式。MIME 类型通过 Content-Type 头字段来指定&#xff0c;告知客户端如何处理和显示接收到的数据。 常见的 MIME 类型 以下是一些常见的 MIME…

智能人体安全防护:3D 视觉技术原理、系统架构与代码实现剖析

随着工业化程度的提高&#xff0c;生产安全已成为企业关注的重点。尤其是在一些存在禁区的工业厂区和车间&#xff0c;人员误入或违规进入将带来严重的安全隐患。为了解决这一问题&#xff0c;迈尔微视推出了智能人体安全检测解决方案&#xff0c;为企业提供全方位的人员安全监…

sqlalchemy异步方法使用

建立模型 创建基类base.py from sqlalchemy.orm import DeclarativeBaseclass Base(DeclarativeBase):pass以用户为例&#xff0c;建立用户模型继承基类 from sqlalchemy import Integer, String, ForeignKey, DateTime, Boolean from sqlalchemy.orm import mapped_column, Ma…

暂停window11自动更新

window11 的自动更新功能&#xff0c;一方面在后台占用资源&#xff0c;容易导致电脑卡顿&#xff1b;另一方面&#xff0c;“更新并关机” 和 “更新并重启” 的设置令人极其反感。很多补丁兼容性很差&#xff0c;更新后极易引发电脑蓝屏、闪屏等意想不到的 bug。 1.winR打开运…

CTF-WEB: php-Session 文件利用 [第一届国城杯 n0ob_un4er 赛后学习笔记]

step 1 搭建容器 教程 A5rZ 题目 github.com Dockerfile 有点问题,手动修复一下 FROM php:7.2-apacheCOPY ./flag /root COPY ./readflag / COPY ./html/ /var/www/html/ COPY ./php.ini /usr/local/etc/php/php.ini COPY ./readflag /readsecretRUN chmod 755 /var/www…

在Win11系统上安装Android Studio

诸神缄默不语-个人CSDN博文目录 下载地址&#xff1a;https://developer.android.google.cn/studio?hlzh-cn 官方安装教程&#xff1a;https://developer.android.google.cn/studio/install?hlzh-cn 点击Next&#xff0c;默认会同时安装Android Studio和Android虚拟机&#…

网络基础概念

目录 一、计算机网络的发展背景1、网络的定义&#xff08;1&#xff09; 独立模式&#xff08;2&#xff09;网络互联 2、局域网 LAN3、广域网 WAN4、比较局域网和广域网5、扩展 —— 域域网和互联网 二、初识协议1、协议的概念2、协议的本质3、协议分层&#xff08;1&#xff…

基于docker安装-高斯DB(opengauss)

获取镜像 docker pull registry.cn-hangzhou.aliyuncs.com/qiluo-images/opengauss:latest启动并配置容器 docker run --name OpenGauss --privilegedtrue --restartalways -u root -p 15432:5432 -e GS_PASSWORDEnmo123 -v /etc/localtime:/etc/localtime -v /data/OpenGaus…

web网页前后端交互方式

参考该文&#xff0c; 一、前端通过表单<form>向后端发送数据 前端是通过html中的<form>表单&#xff0c;设置method属性定义发送表单数据的方式是get还是post。 如使用get方式&#xff0c;则提交的数据会在url中显示&#xff1b;如使用post方式&#xff0c;提交…

Android:展锐T760平台camera PDAF调试

一、平台PDAF流程 目前展锐平台主要支持Shield PD Sensor、Dual PD Sensor 1、Shield PD Sensor Type1相位差和信心度结果直接从Sensor输出,不经过平台算法库。 Type2Sensor端抽取PD信息, 放在一块buffer输出, PDAF算法库算出相位差和信心度。 Type3Sensor端直接输出将带有…

css中样式前加 css样式前面加个圆点

创建CSS样式,样式名称的前面需要加什么 1、我们只知道符号代表的意思是at&#xff0c;其翻译是 在... 例如media就是 在媒介上。没人规定本身具有什么意义&#xff0c;或者说就算规定了我们也改变不了&#xff0c;只需要知道其规定属性的用法即可。 2、px;}然后根据你自己索要…