当前位置: 首页 > news >正文

数据结构--数据结构概述

一、数据结构三要素

1. 数据的逻辑结构

数据的逻辑结构是指数据元素之间的关系和组织方式,通常分为线性结构和非线性结构。

  • 线性结构:例如线性表,其中数据元素按照顺序排列,彼此之间存在一对一的关系。

  • 非线性结构:例如集合、树和图,这些结构中的数据元素之间的关系更加复杂,可能存在一对多或多对多的关系。

2. 数据的存储结构

1. 顺序存储

顺序存储是一种将数据元素按照线性顺序依次存放在一块连续的内存空间中的存储方式。它的优点在于可以通过简单的下标访问实现快速的随机访问,适合存储固定大小的数据结构,如数组。然而,顺序存储在插入和删除操作时可能会导致大量的数据移动,效率较低。

2. 链式存储

链式存储是一种将数据元素以节点的形式存放在不连续的内存空间中,每个节点包含数据部分和指向下一个节点的指针。该方式的优点在于动态内存分配,灵活性高,适合频繁插入和删除操作。链式存储的缺点是随机访问效率较低,因为需要从头节点开始逐个遍历。

3. 索引存储

索引存储是一种结合了顺序存储和链式存储优点的数据存储方式。它通过建立索引表来加速数据的查找,索引表中的每个条目指向数据存储的具体位置。该方式能够在保持较快查找速度的同时,支持高效的数据插入和删除操作。然而,索引存储需要额外的空间来维护索引,增加了存储的复杂性。

4. 散列存储

散列存储是一种通过散列函数将数据映射到固定大小的数组中存储的方式。它能够实现快速的查找、插入和删除操作,适合处理大量数据。散列存储的主要挑战在于处理哈希冲突,即不同的数据可能会被映射到相同的存储位置。常用的解决方法包括链式法和开放地址法。尽管散列存储在查找效率上表现优异,但在实现上相对复杂,并且需要合理设计散列函数以减少冲突。

3. 数据的运算

数据的运算是指对数据结构中的数据进行各种操作的过程,包括插入、删除、查找、更新等。这些运算的效率往往依赖于所选用的数据结构和存储方式,因此在设计数据结构时需充分考虑运算的需求和性能。

二、算法

1. 算法的五个重要特性

  • 确定性:每个算法的步骤必须是明确的,不能存在模糊或含糊的描述。每一步操作都应清晰、具体,确保在任何情况下都能被准确理解和执行。

  • 有穷性:算法必须在有限的步骤内终止。换句话说,算法不能无限循环,必须在经过有限的操作后得出结果。这一特性保证了算法的可执行性和有效性。

  • 输入:一个算法可以有零个或多个输入,这些输入是算法执行所需的数据。输入可以是外部提供的,也可以是算法内部生成的,但无论如何,算法必须能够接收并处理这些输入。

  • 输出:算法必须能够产生至少一个输出,输出是算法对输入进行处理后得到的结果。输出的形式和数量取决于算法的设计和具体问题的要求。

  • 可行性:算法中的每一步操作都必须是可行的,能够在合理的时间内执行。有效性确保了算法不仅在理论上可行,而且在实践中能够被实现,并在合理的时间内完成计算。

2. 算法应考虑的目标

  • 可读性:算法的可读性是指算法的清晰程度和易于理解的程度。一个可读性高的算法能够让其他开发者或用户轻松理解其逻辑和流程。这对于团队协作和后续维护非常重要。

  • 正确性:算法的正确性是指算法能够在所有有效输入下产生正确的输出。一个正确的算法应能准确解决所设计的问题,并满足预期的功能需求。确保正确性通常需要充分的测试和验证。

  • 健壮性:健壮性是指算法在面对异常输入或意外情况时的表现能力。一个健壮的算法能够处理各种边界情况、错误输入或系统故障,而不会导致崩溃或产生错误结果。这种特性对于提升用户体验和系统稳定性至关重要。

  • 高效率与低存储量需求:高效率指算法在执行时能够快速完成任务,通常涉及时间复杂度的优化。低存储量需求则是指算法在运行时对内存的占用要尽量少。一个高效且节省存储的算法能够在处理大规模数据时表现出色,降低资源消耗。

3. 时间复杂度

定义:时间复杂度是用来描述算法执行所需时间的一个函数,通常用大O符号表示。它表示输入规模(通常用 n 表示)增长时,算法执行时间的增长率。

分析方式

  • 最坏情况:考虑输入数据中最不利的情况,通常用于评估算法的上限。
  • 最好情况:考虑输入数据中最有利的情况,评估算法的下限。
  • 平均情况:考虑所有可能输入的平均执行时间,用于评估算法的期望性能。

常见时间复杂度的分类

  • 常数时间:O(1) - 不随输入规模变化而变化,例如访问数组中的某个元素。
  • 对数时间:O(log n) - 例如二分查找。
  • 线性时间:O(n) - 例如遍历数组。
  • 线性对数时间:O(nlogn) - 例如高效排序算法(如归并排序和快速排序)。
  • 平方时间:O(n^2) - 例如冒泡排序和选择排序。
  • 指数时间:O(2^n) - 例如某些递归算法(如斐波那契数列的朴素实现)。
  • 阶乘时间:O(n!) - 例如解决旅行商问题的某些算法。

重要性:时间复杂度帮助我们理解算法在处理不同规模输入时的性能表现,从而选择合适的算法以提高应用程序的响应速度和用户体验。

4. 空间复杂度

定义:空间复杂度是用来描述算法在执行过程中所需内存空间的一个函数,同样通常用大O符号表示。它表示随着输入规模的增加,算法所需的存储空间的增长率。

分析方式

  • 固定部分:与输入规模无关的空间需求,例如常量空间、固定大小的变量等。
  • 可变部分:与输入规模相关的空间需求,例如动态分配的数组、递归调用栈等。

常见空间复杂度的分类

  • 常数空间:O(1) - 例如只使用固定数量的变量。
  • 线性空间:O(n) - 例如使用一个数组来存储输入数据。
  • 平方空间:O(n^2) - 例如在某些算法中使用的二维数组。

重要性:空间复杂度帮助我们理解算法在内存使用方面的效率,尤其在处理大数据集时,合理的空间使用可以避免内存溢出和提高程序的运行效率。

相关文章:

数据结构--数据结构概述

一、数据结构三要素 1. 数据的逻辑结构 数据的逻辑结构是指数据元素之间的关系和组织方式,通常分为线性结构和非线性结构。 线性结构:例如线性表,其中数据元素按照顺序排列,彼此之间存在一对一的关系。 非线性结构:…...

Spring中的BeanFactoryAware

BeanFactoryAware 是 Spring 框架中的一个接口,用于在 Spring 容器中获取 BeanFactory 实例。实现这个接口的类可以在其属性被设置后获取到 BeanFactory,从而可以访问 Spring 容器中的其他 bean。 BeanFactoryAware 接口概述 BeanFactoryAware 接口位于…...

Neo4j service is not installed

问题: Starting Neo4j. Neo4j service is not installed Unable to start. See user log for details. Run with --verbose for a more detailed error message.解决: neo4j windows-service install neo4j start ok了...

LeetCode 3132.找出与数组相加的整数 II:排序+3次尝试(nlog n)

【LetMeFly】3132.找出与数组相加的整数 II:排序3次尝试(nlog n) 力扣题目链接:https://leetcode.cn/problems/find-the-integer-added-to-array-ii/ 给你两个整数数组 nums1 和 nums2。 从 nums1 中移除两个元素,并且所有其他元素都与变量…...

微信小程序--26(全局配置-1)

一、全局配置文件 1.标志 app.json 2.配置项 pages 记录当前小程序所有页面的存放路径 window 全局配置小程序窗口配置 tabBar 设置小程序底部的tabBar效果 style 是否启用新版本的组将样式 3.window 导航栏区域 navigationBar …...

汽车4S店管理系统-计算机毕设Java|springboot实战项目

🍊作者:计算机毕设残哥 🍊简介:毕业后就一直专业从事计算机软件程序开发,至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长:按照需求定制化开发项目、 源…...

bug的常见排查和分析思路以及相关的原因分类

作为开发人员,经常会收到来自用户和QA,领导反馈的各种问题。 为了快速问题,我们有时需要站在更高的角度,更全面的看待问题。才能更快锁定问题。 具体的bug还需要结合企业实际业务情况,相关的框架,依赖库&…...

Nature:7个提升科研产出的实用建议

我是娜姐 迪娜学姐 ,一个SCI医学期刊编辑,探索用AI工具提效论文写作和发表。 一个值得思考的问题是:层出不穷的效率工具到底是提升还是降低了科研产出? 大学教授萨拉 (Sara) 描述了她典型的工作日场景:"…...

react-native从入门到实战系列教程-页面之间的跳转

路由的跳转,是app开发中需要处理的问题,一个页面不可能装下那么多的内容。在react-native中,我们使用的路由组件跟reactjs中还是有区别的,这里贴出官网的文档:https://reactnavigation.org/docs/navigating 实现效果 安装 按照官网的指导安装即可。代码实现 app.jsx中改造…...

HarmonyOS应用开发者高级认证(一)

1、依次点击A、B、C、D四个按钮,其中不会触发UI刷新的是: 答案: Button("C").onClick(() > {this.nameList[0].name "Jim"})分析:直接更新非一级数据不会触发UI刷新 2、如果要实现Row组件内的子元素均匀…...

【网络】套接字(socket)编程——UDP版

1.socket 1.1.什么是socket Socket 的中文翻译过来就是“套接字”。 套接字是什么,我们先来看看它的英文含义:插座。 Socket 就像一个电话插座,负责连通两端的电话,进行点对点通信,让电话可以进行通信,端…...

一篇文章让你彻底掌握 Shell

大家好,这里是 Lucifer三思而后行,专注于提升数据库运维效率。 文章目录 一篇文章让你彻底掌握 Shell简介什么是 shell什么是 shell 脚本Shell 环境指定脚本解释器 模式交互模式非交互模式 基本语法解释器注释echoprintfprintf 的转义符 变量变量命名原则…...

Java中的Collection集合:深入理解与应用

在Java中,Collection接口是Java集合框架(Java Collections Framework)的基石之一,它定义了一系列操作对象集合的方法,如添加、删除、遍历等。Collection接口是List、Set和Queue等具体集合类型的父接口,为Ja…...

Kubernetes-K8S

Kubernetes由于单词太长,省略掉中间8个字母简称为K8S。它介于应用服务和服务器之间。能够通过策略协调和管理多个服务,只需要一个YAML文件配置。定义应用的部署顺序等信息,自动部署应用到各个服务器,还可以自动扩容缩容。 架构原理…...

简化文本处理流程,通用文字识别助力提升信息采集效率

随着信息技术的发展、移动设备使用的普及和全球化的商业需求,非结构化数据转换为结构化数据的需求日益增长,数字化成为信息存储和管理的主流趋势。在此背景下,OCR技术应运而生,该技术可以将图像中文本信息转化为计算机等设备可以使…...

【网络】TCP协议通信的重要策略——滑动窗口,快重传,流量控制,拥塞控制,延时应答

目录 MSS值 滑动窗口 滑动窗口与重发机制 快重传机制 滑动窗口与流量控制 滑动窗口与拥塞控制 延时应答 个人主页:东洛的克莱斯韦克-CSDN博客 相关文章 【网络】传输层TCP协议的报头和传输机制-CSDN博客 【网络】详解TCP协议通信时客户/服务端的状态-CSDN博…...

极狐GitLab CI/CD 如何构建镜像并推送到 azure 镜像仓库?

极狐GitLab 是 GitLab 在中国的发行版,专门面向中国程序员和企业提供企业级一体化 DevOps 平台,用来帮助用户实现需求管理、源代码托管、CI/CD、安全合规,而且所有的操作都是在一个平台上进行,省事省心省钱。可以一键安装极狐GitL…...

Leetcode—1143. 最长公共子序列【中等】

2024每日刷题&#xff08;155&#xff09; Leetcode—1143. 最长公共子序列 实现代码 class Solution { public:int longestCommonSubsequence(string text1, string text2) {int m text1.length();int n text2.length();vector<vector<int>> dp(m 1, vector&…...

ZBrush笔刷介绍

根据使用的方法和效果&#xff0c;ZBrush的笔刷可以分类如下&#xff1a; 基本功能笔刷 这些笔刷用于常规的雕刻、移动和平滑操作。 纹理应用笔刷 一般需要自己额外购买的是这三种笔刷 Alpha Brushes&#xff1a;使用灰度图&#xff08;alpha&#xff09;来定义笔刷形状和纹…...

React+AntDesign做一个日历,展示节假日,节气,并且在某几个时间上添加活动备注

直接贴效果图&#x1f604; 首先日历是用的AntDesign提供的Calendar组件&#xff0c;这个组件还是蛮强大的&#xff0c;可以自定义头部时间下拉&#xff1b;渲染每个时间段&#xff0c;或者重置时间段内容&#xff0c;玩的空间是很大的 直接贴代码&#xff0c;结尾最后我会将…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...

08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险

C#入门系列【类的基本概念】&#xff1a;开启编程世界的奇妙冒险 嘿&#xff0c;各位编程小白探险家&#xff01;欢迎来到 C# 的奇幻大陆&#xff01;今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类&#xff01;别害怕&#xff0c;跟着我&#xff0c;保准让你轻松搞…...