01.数据结构和算法概述

news2024/9/21 4:25:37

前言

数据结构是一个古老的课题。他与程序开发息息相关,但是我们日常开发中,好像很少让我们自己设计一个数据结构。只求程序能跑,并不太关注性能。但是它是我们软件开发人员的基本功,也是拉开普通程序员和高级程序员的一个门槛,是大厂面试必不可少的一部分

本节,我们就数据结构和算法做个简单概述,后续会在数据结构专栏,逐一介绍。

1.数据结构简介

1.1 什么是数据结构

数据结构(data structure)是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。(百度百科)

通俗的讲,就是在内存中存储管理数据的方式。

1.2 数据结构分类

1.2.1 逻辑结构

逻辑结构是用来描述数据元素之间的逻辑关系,是一个抽象概念,与数据的实际存储无关,独立于计算机存在。

1.2.2 存储结构

存储结构是数据元素及其相互之间的关系在计算机存储器中的存储方式,简而言之存储结构就是实际的物理存储方式。

1.2.3 两者关系

逻辑结构是数据结构的抽象,物理结构是数据结构的实现,两者综合起来才建立了数据元素完整的结构关系,只有逻辑结构,数据无法实际存储;只有物理结构,数据不知道该用哪种合适的方式存储。

笔者认为,这个就像软件设计环节,先有概要设计,ER图维护实体之间的关系,类似逻辑结构,等详细设计的时候,具体定义表结构,要考虑表怎么加索引等,即存储结构数据在磁盘中怎么管理

1.3 逻辑结构分类

1.3.1 线性结构

数据结构中线性结构指的是数据元素之间存在着“一对一“的线性关系的数据结构。

1.3.2 集合结构

所有数据元素除了同属于一个集合外,并无其他关系。集合结构的集合中任何两个数据元素之间都没有逻辑关系,组织形式松散

1.3.3 树状结构

树状结构是一个或多个节点的有限集合,数据元素之间存在“一对多”的层次关系。

1.3.4 网状结构

数据元素之间存在“多对多的关系”(注:此时的“多对多”中的多表示,至少有一个)

1.4 存储结构分类

1.4.1 顺序存储结构

逻辑上相邻的节点存储在物理位置上相邻的存储单元里,节点之间的逻辑关系有存储单元的邻接关系来体现。

优点:节省存储空间
缺点:不便于修改

1.4.2 链式存储结构

不要求逻辑上相邻的节点在物理位置上也相邻,节点间的逻辑关系是由附加的指针字段表示的

优点:便于修改
缺点:存储空间的利用率低、不能对节点进行随机存取。

1.4.3 索引存储结构

在存储节点信息的同时,建立附件的索引表。

优点:大大提高了数据查找的速度
缺点:增加了索引表、因而降低了存储空间的利用率。

1.4.4 散列存储结构

根据节点的关键字通过哈希(或散列)函数直接计算出一个值,并将这个 值作为该节点的存储地址,适合于要求对数据进行快速查找和插入的场合

优点:查找速度快
缺点:由于哈希存储方法只存储节点的数据,不存储节点之间的逻辑关系。

1.5 常见数据结构

在这里插入图片描述
后续会在数据结构专栏详细逐个介绍相关数据结构。

2. 算法简介

2.1 什么是算法

算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。一句话描述:算法是一种解决特定问题的思路

2.2 时间复杂度

2.2.1 什么是时间复杂度

判断一个算法所编程序运行时间的多少,并不是将程序编写出来,通过在计算机上运行所消耗的时间来度量。原因很简单,一方面,解决一个问题的算法可能有很多种,一一实现的工作量无疑是巨大的,得不偿失;另一方面,不同计算机的软、硬件环境不同,即便使用同一台计算机,不同时间段其系统环境也不相同,程序的运行时间很可能会受影响,严重时甚至会导致误判。

实际场景中,我们更喜欢用一个估值来表示算法所编程序的运行时间。所谓估值,即估计的、并不准确的值。注意,虽然估值无法准确的表示算法所编程序的运行时间,但它的得来并非凭空揣测,需要经过缜密的计算后才能得出。

也就是说,表示一个算法所编程序运行时间的多少,用的并不是准确值(事实上也无法得出),而是根据合理方法得到的预估值。

计算的方式就是时间复杂度。时间复杂度是指执行算法所需要的计算工作量

2.2.2 复杂度计算方法

复杂度计算可以参考这篇博客

2.2.3 常用的时间复杂度

常数阶O(1)
对数阶O(logN)
线性阶O(n)
线性对数阶O(nlogN)
平方阶O(n²)
立方阶O(n³)
K次方阶O(n^k)
指数阶(2^n)

2.3 空间复杂度

空间复杂度全称是渐进空间复杂度,表示算法的存储空间与数据规模之间的增长关系。指执行这个算法所需要的内存空间。由于现在硬件相对比较便宜,所以在开发中常常会利用空间来换时间,比如缓存技术。典型的数据结构中空间换时间是:跳跃表

实际开发中会更关注代码的时间复杂度,而不是空间复杂度

2.4 常见算法

在这里插入图片描述
后续会在数据结构专栏详细逐个介绍相关算法。

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

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

相关文章

Selenium浏览器交互原理与应用,玩转Web自动化测试

目录 前言: 浏览器交互: Selenium的实现方式: Selenium WebDriver: WebDriver的等待机制: 总结: Web自动化测试: 前言: Web自动化测试是现代软件开发中必不可少的一个环节,它可以帮助开发人员快速自动…

ChatGPT4通道开放接入基于OPEN AI 平台你的任何APP 可一键接入AI 智能

你一定很好奇什么是 OPEN AI快速开发平台 顾名思义,开放的OPEN AI平台。 基于这个平台你的上层应用,如何 APP,小程序,H5,WEB, 公众号,任何一切终端都可以轻松接入,AI智能应用。 开发初衷 爆肝一周,我开源了ChatGPT 中文版接口&a…

Win11右键菜单选项变成英文了怎么恢复回来?

Win11右键菜单选项变成英文了怎么恢复回来?有用户在使用Win11系统的时候,遇到了右键菜单选项的一些选项变成英文的情况,导致自己的使用受到了影响。那么这个情况怎么去进行解决呢?来看看以下的解决方法吧。 方法一:直接…

零基础学网络安全?一般人我还是劝你算了吧

一、网络安全学习的误区 1.不要试图以编程为基础去学习网络安全 不要以编程为基础再开始学习网络安全,一般来说,学习编程不但学习周期长,且过渡到网络安全用到编程的用到的编程的关键点不多。一般人如果想要把编程学好再开始学习网络安全往…

mathtype公式符号显示不对

文章目录 问题解决方法结果 记录攥写论文遇到的问题及解决方法 问题 使用mathtype编辑公式过后,发现公式显示不对,出现两种问题: 1:部分符号变为方框 2:符号大小异常 例如: 解决方法 第一种&#xff1a…

KDZD5550系列电压击穿试验仪操作说明

一、产品概述 KDZD5550系列电压击穿试验仪根据国家GB1408.1-2006《绝缘材料电气强度试验方法》其作用可称为电气绝缘强度试验仪、介质强度测试仪等。其工作原理是:把一个高于正常工作的电压加在被测设备的绝缘体上,持续一段规定的时间,加在上…

优思学院|DOE试验设计在六西格玛项目的哪个阶段进行?

六西格玛DMAIC是一种用于现有流程改进的方法,其中包括五个阶段:定义阶段(D),测量阶段(M),分析阶段(A),改进阶段(I)和控制阶…

【C++动态内存管理】

目录 一、C/C内存分布二、C中动态内存管理2.1new/delete操作内置类型2.2new/delete操作自定义类型 四、new和delete的实现原理4.1内置类型4.2自定义类型 五、 定位new表达式(placement-new)六、总结 一、C/C内存分布 一张图重温一下C/C内存分布。 二、C中动态内存管理 C中的…

计算物理专题:高维Romberg数值积分方法

有话无话,先上代码,正确与否,先给结论,可信有无,先出文献计算物理,傅哥最强 真计算还得看SCU物拔(不是)(狗头)(骄傲)这种方法的思想是…

Springboot +Flowable,会签、或签简单使用(三)

一.简介 **会签:**在一个流程中的某一个 Task 上,这个 Task 需要多个用户审批,当多个用户全部审批通过,或者多个用户中的某几个用户审批通过,就算通过。 例如:之前的请假流程,假设这个请假流程…

【笔试强训选择题】Day15.习题(错题)解析

作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:笔试强训选择题 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!! 文章目录 前言 一、…

Linux Shell 实现一键部署二进制Python

python 前言 Python由荷兰数学和计算机科学研究学会的吉多范罗苏姆于1990年代初设计,作为一门叫做ABC语言的替代品。 Python提供了高效的高级数据结构,还能简单有效地面向对象编程。Python语法和动态类型,以及解释型语言的本质,使…

监控知识体系

从来没讲过运维,因为我觉得运维这种东西不需要太多的知识面,然后我一个做了运维朋友告诉我大错特错,他就是从3K的运维一步步到40K的,甚至笑着说:我现在感觉自己什么都能做。 既然讲,就讲最重要的吧。 监控…

接口自动化测试分层设计与实践总结

本文以笔者当前使用的自动化测试项目为例,浅谈分层设计的思路,不涉及到具体的代码细节和某个框架的实现原理,重点关注在分层前后的使用对比,可能会以一些伪代码为例来说明举例。 接口测试三要素: 参数构造 发起请求&a…

NA、商业和分销市场通盘布局,华为“四大角色”浮出水面

作者 | 曾响铃 文 | 响铃说 数字经济深化发展,谋求数字化转型的行业、企业客户,越来越渴望满足自身需求的产品或解决方案。 这给从事转型服务的ICT厂商们提出了新的挑战。 在客户面前,拥有核心技术与支持能力的企业,与进击数字…

yolov1

1、对precision(精确度)和recall(召回度)的理解 1、TP TN FP FN的概念 TP(True Positives)意思就是被分为了正样本,而且分对了。 TN(True Negatives)意思就是被分为了负…

原装美国Agilent安捷伦34970A数据采集仪

Agilent安捷伦34970A数据采集仪 3槽主机,内置GPIB和RS232接口 6 1/2 位(22 位)内部 DMM,每秒扫描多达 250 个通道(选件 001 不可用) 8个开关和控制插件模块可供选择 内置信号调理可测量热电偶、RTD 和热敏电…

linux基础(IO)中

目录: 1.回顾上一篇的文件系统调用接口 2.返回值文件描述符 3.文件描述符分配规则 ---------------------------------------------------------------------------------------------------------------------------- 1.回顾上一篇的文件系统调用接口 open &…

【数据结构】二叉树进阶题目练习

文章目录 二叉树创建字符串二叉树的分层遍历1二叉树的分层遍历2给定一个二叉树, 找到该树中两个指定节点的最近公共祖先二叉树搜索树转换成排序双向链表二叉树展开为链表根据一棵树的前序遍历与中序遍历构造二叉树根据一棵树的中序遍历与后序遍历构造二叉树二叉树的前序遍历 非…

学爬虫,吃牢饭,卑微前端小丑复制antd的icon图标真的太难啦,我用python几秒扒完

目标需求 最近用reactviteantd写了个后管项目,在菜单管理中,需要用户选择菜单的icon图标。 如下: 而在react中使用antd UI库,每个组件都是需要单独导入的,也就是说,如果我要用到所有icon,我需…