数据结构与算法第一课

news2024/11/16 12:51:07

文章目录

  • 数据结构
    • 什么是数据结构
    • 数据结构相关单位
    • 物理结构与逻辑结构
      • 物理结构
      • 逻辑结构
  • 算法
    • 一个案例认识算法的重要性
    • 时间复杂度与空间复杂度
      • 时间复杂度
        • 事前计算时间复杂度与事后判断时间复杂度
        • 函数的渐进式变化
        • 常见函数的时间复杂度
        • 最坏时间与平均时间
      • 空间复杂度

先看下目录,看下整体结构

程序 = 数据结构 + 算法。一般在学习到数据结构时都会出现另一个东西,它叫算法。在我看来二者还是有侧重点的,至于为什么学习数据结构时都要带点算法,我的答案是让大家更好的去理解,学习数据结构。因此这个专栏的定位还是主数据结构,辅以算法。

数据结构

什么是数据结构

我见过很多老师在教学时常常把数据结构比作容器。容器非常好理解就是装东西的呗,既然是装东西的,那么大家可以思考这样一个问题,String str = new String(“abc”);这行代码中str好像也存了一个字符串abc,那么它算不算数据结构?如果你没有答案,来看看数据结构的定义:
数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合
答案显而易见,str不是数据结构,它只符合定义中的存储。

数据结构相关单位

先阅读下图右侧的一个小故事,读完后可以将带颜色的字体与图左侧相关的概念联系起来,看看自己是否有种似曾相识的感觉。
image.png
实际开发中我们一般都要定义一个类,并给这个类定义一些属性,就像这样:

// 省去get,set方法等
public class Student{
    private String name;
    private Integer age;
    private String sex;
}

结合上述图片及代码是对图左侧概念的进一步解释:

  • 数据:这个概念在数据结构中是最大的单位,一般它指的是数据的集合。对应图里就是一屋子的学生,代码可以是List
  • 数据对象:大家理解为Java中的类型即可,诸如一些定义为数据的子集我并不觉得好理解。对应上图就是学生,也就是List里指定的类型Student
  • 数据元素:这就是具体的东西了,可以理解为Java中的对象。那么对应上图就是舒聚祥同学
  • 数据项:描述数据元素的一些属性。例如图中的头发,衣服,裤子,鞋子。警察叔叔找人一般都怎么问的大家都懂吧

物理结构与逻辑结构

物理结构

  • 顺序结构:线性结构指元素的存储位置是连续的
  • 链式结构:链式结构指元素的存储位置是不连续的

逻辑结构

数据结构的定义中提到了元素之间存在一种或多种数据关系,这里数据库的基本知识给了我很大启发,所以我总结了自己的记忆方式分享出来。既然是元素之间的关系,我们可以先把所有的关系枚举出来:无关系;一对一;一对多;多对多。根据四个枚举值可以帮助我们记忆以下四个逻辑结构

  • 集合结构:数据元素之间无关系
  • 线性结构:数据元素之间存在一对一的关系
  • 树结构:数据元素之间存在一对多的关系
  • 图结构:数据元素之间存在多对多的关系

附一张图,结合记忆方式更持久!不单独配图的原因是放在一起我觉得视觉冲撞会更好点,更容易产生联想,更好的记忆。
image.png

算法

我对算法的定义很简单,那就是算法=思路(不知道是否片面,好理解就行)。看似高深的东西,实际是我们解决问题的方式,甚至是crud都能称为算法。下面是比较专业的定义:
算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制

一个案例认识算法的重要性

从描述上可以看到算法是解决一系列的问题的,著名的高斯算法再科普一下,小时候高斯的数学老师出了一道题,谁能做出来就可以先回家。题目是1~100的加和,这个问题我们用代码来实现一下:

// 方式一
int result = 0;
for (int i = 1; i <= 100; i++) {
    result += i;
}
System.out.println("1~100的和是:"+result);

// 方式二
int result = 0;
result = (1 + 100) * (100 / 2);
System.out.println("1~100的和是:" + result);

这里例子我想突出的重点是同一个问题,不同的解决方案的效率是不一样的,假设题目变成求1~n的和,那么哪种解决方式更优,算的更快呢?

时间复杂度与空间复杂度

时间复杂度

事前计算时间复杂度与事后判断时间复杂度

上面的案例我没有给出答案,因为没有具体的数据支撑,比如方式一执行用了多少秒,方式二执行用了多少秒。还有一个因素是案例求的是1100的和,这个具象的问题并不能代表1n的和(定义中说的一系列问题)。在算法中用时间复杂度来衡量一个算法的好坏。有两种方式,分别是事前分析与事后判断:

  • 事后判断:所谓事后是记录程序的运行时间,这种方式可以比较准确的得出结论。但存在一个致命的问题,如果它很慢,是否需要重写一个?重写的还是慢,又应当如何?
  • 事前判断:事前也就是在程序执行之前进行分析,得出一个理论的值来评估算法的好坏,凡事预则立不预则废用在这再合适不过了。一般判断依据有以下几个:
    • 硬件(你的程序在哪里跑的)
    • 软件(编译后的代码质量)
    • 算法自身的结构,逻辑
    • 问题的具体数据量(案例中的n到底是多少?)

硬件软件视具体情况而定,暂时抛开算法逻辑本身,我们依据算法的**数据量(输入量)**分析,就能得到一个不错的理论值,它就是事前计算要做的事

函数的渐进式变化

这部分的内容想要通过图片让大家来进一步理解时间复杂度。
image.png
图中共有5个函数的曲线,分别是logx,x,x2,x3,1(常数函数),假设x无限大,那么对应的函数值也会非常的大。上一小节中我们说的输入量跟这里的x是差不多的,这样我们能得出这样一个时间复杂度排序:x3>x2>x>logx>常数函数

image.png
从这个图上可以直观的看出了,当x无限大时,三个函数的函数值是相近的,从图像上来看函数后半段甚至达到了重重合的情况,所以说计算时间复杂度时,常数项是我们可以忽略的

image.png
从这个图中可以看出,只要x足够大,那么两个函数的函数值是差不多的。所以说我们不仅仅可以忽略常数,还可以忽略最高项以外的表达式,比如这里的2x

image.png两个函数最高次数项的系数不同,随着x的增大,函数值相差也会变大(开口越来越宽),相比于前面两种情况这里的差距会多一些。但是我们也是可以忽略的。

常见函数的时间复杂度

时间复杂度中小到大排序如下(可以从在线网站通过图像直观看出):
O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n3)<O(2n)<O(n!)<O(nn)

最坏时间与平均时间

通常我们所说的时间复杂度默认指的是最坏的情况,比如求1~n的和,那么最坏的情况就是算法执行了n次。平均时间就是指程序的平均执行时间。

空间复杂度

官方定义:空间复杂度通过计算算法所需的存储空间实现,算法空间复杂度的计算公式记作:S(n) = O(f(n)),其中n是问题的规模,f(n)为语句关于n所占的存储空间函数

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

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

相关文章

使用vite搭建前端项目

1、在vscode 终端那里执行创建前端工程项目&#xff0c;其中shop-admin为项目名称&#xff1a; npm init vite-app shop-admin 提示如需安装其他依赖执行npm install ....,否则忽略(第三步再讲)。 2、执行npm run dev 命令直接运行创建好的项目&#xff0c;在浏览器打开链接…

变量的引用

1、变量 和 数据 都是保存在 内存 中的 2、在 Python 中 函数的参数传递以及返回值都是靠引用传递的 引用的概念 在 Python 中变量 和 数据 是分开存储的&#xff1b;数据 保存在内存中的一个位置&#xff1b;变量 中保存着数据在内存中的地址&#xff1b;变量 中 记录数据的…

初步认识Java

文章目录 一、什么是Java1、Java语言的重要性2、Java语言的发展史3、Java语言的特性 二、初识Java的main方法1、main方法示例2、运行Java程序3、JDK、JRE、JVM之间的关系 三、注释四、标识符 一、什么是Java Java是一种优秀的程序设计语言&#xff0c;它具有令人赏心悦目的语法…

依靠继承与聚合,实现maven搭建分布式项目

简介聚合 对于复杂的Maven项目&#xff0c;一般建议采用多模块的方式来设计开发&#xff0c;便于后期维护管理。但是构建项目时&#xff0c;如果每次都需要按模块一个一个进行构建会十分麻烦&#xff0c;而Maven的聚合功能就可以很好的解决这个问题&#xff0c;当用户对聚合模…

软件企业知识库应用场景?如何搭建软件企业知识库?

想要减少人工干预、减少不必要的时间和人力成本、快速获取准确信息……这些应用场景对于我们企业来说是非常渴望在短期内实现的。 软件企业知识库 因为传统知识库仅仅是存储&#xff1a;知识只是“存储”&#xff0c;根本用不起来&#xff0c;缺乏有效的管理方式和储存载体&am…

【项目设计】网络对战五子棋(下)

我不再装模作样地拥有很多朋友&#xff0c;而是回到了孤单之中&#xff0c;以真正的我开始了独自的生活。有时我也会因为寂寞而难以忍受空虚的折磨&#xff0c;但我宁愿以这样的方式来维护自己的自尊&#xff0c;也不愿以耻辱为代价去换取那种表面的朋友。 文章目录 一、项目设…

理解Hash表

注&#xff1a;本文翻译自 https://www.baeldung.com/cs/hash-tables 1 介绍 有效管理数据的技术是计算机科学的传统热点。除了存储数据之外&#xff0c;从存储中高效地恢复数据是另一个相关问题。 即使使用最好的算法处理某些特定的数据&#xff0c;如果没有优化数据管理&a…

Linux C语言开发-D2vi编辑器使用

三种模式基础 命令行模式、插入模式和底行模式 :! [命令]&#xff1a;可在命令行模式下执行命令 :w test1.cc可备份当前编辑的文件 :r head.h可为当前文件引入头文件 u&#xff1a;撤销 命令行进入插入模式&#xff1a; i&#xff1a;从当前光标位置之前开始插入 …

mac安装+配置python3环境

一、python3下载 官网下载 https://www.python.org/ 二、python3安装 打开下载好的.pkg文件一直继续确认即可。 三、验证是否安装成功 打开终端&#xff0c;输入python3&#xff0c;如果返回python对应的版本信息&#xff0c;则安装成功。 四、python配置 如果需要输入…

c语言刷题(第8周)

输入整数m,n&#xff08;m&#xff1c;n&#xff09;&#xff0c;输出[m,n]之间所有能被3&#xff0c;不能被4整除的所有数并求和&#xff0c;输出时每行显示5个数。 题干输入整数m,n&#xff08;m&#xff1c;n&#xff09;&#xff0c;输出[m,n]之间所有能被3&#xff0c;不…

【深蓝学院】手写VIO第7章--VINS初始化和VIO系统--作业

0. 内容 1. T1 1. 下载EuRoc数据集&#xff08;optional&#xff09; 因为作业主要使用Ch2生成的数据&#xff0c;所以这一步也是可选的&#xff0c;但是为了整个系统的bring up&#xff0c;可以先用EuRoc数据集跑起来。 下载EuRoc数据集&#xff0c;SLAM相关数据集链接 2.…

windows平台下Qt Creator的下载与安装流程

下载 下载地址&#xff1a;https://download.qt.io/archive/ 下载界面 进入qt或者qtcreator都可以 版本选择 这里我选择进入qt进行下载&#xff0c;进入之后有多个版本可以选择。 注意&#xff1a;从Qt5.15版本开始&#xff0c;Qt公司不在提供开源离线安装程序&#xff0c;此…

2.6.C++项目:网络版五子棋对战之数据管理模块-游戏房间管理模块的设计

文章目录 一、意义二、功能三、作用四、游戏房间类基本框架五、游戏房间管理类基本框架七、游戏房间类代码八、游戏房间管理类代码 一、意义 对匹配成功的玩家创建房间&#xff0c;建立起一个小范围的玩家之间的关联关系&#xff01; 房间里一个玩家产生的动作将会广播给房间里…

寻找一罐app里的隐藏海

一、前言 &#xff08;一&#xff09;一罐app简介 一罐app 是一款小众交友软件&#xff0c;可以匿名or真身发布动态 &#xff08;二&#xff09;开发目的 因为某些原因&#xff0c;某些板块被隐藏起来了。&#xff08;一罐称板块为xxx海&#xff09; &#xff08;三&#…

常见面试题-Netty专栏(一)

typora-copy-images-to: imgs Netty 是什么呢&#xff1f;Netty 用于做什么呢&#xff1f; 答&#xff1a; Netty 是一个 NIO 客户服务端框架&#xff0c;可以快速开发网络应用程序&#xff0c;如协议服务端和客户端&#xff0c;极大简化了网络编程&#xff0c;如 TCP 和 UDP …

手搭手Ajax经典基础案例省市联动

环境介绍 技术栈 springbootmybatis-plusmysql 软件 版本 mysql 8 IDEA IntelliJ IDEA 2022.2.1 JDK 1.8 Spring Boot 2.7.13 mybatis-plus 3.5.3.2 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http:/…

MYSQL(事务+锁+MVCC+SQL执行流程)理解

一)事务的特性: 一致性:主要是在数据层面来说&#xff0c;不能说执行扣减库存的操作的时候用户订单数据却没有生成 原子性:主要是在操作层面来说&#xff0c;要么操作完成&#xff0c;要么操作全部回滚&#xff1b; 隔离性:是自己的事务操作自己的数据&#xff0c;不会受到到其…

有哪些好用的程序员接私活平台?

程序员如何在苦逼的生活中&#xff0c;呼吸一口富贵又自由的空气? 接单的话&#xff0c;如何脱颖而出&#xff1f; 又该用什么平台呢&#xff1f;哪些平台会更靠谱一点呢&#xff1f; 会不会被坑? balabalabalabala......太多问题了&#xff0c;核心还是不了解这里面的详情。…

从理解概念开始,彻底学会linux下的磁盘扩容操作

对于linux磁盘空间不足需要扩容的情况&#xff0c;其他文章一般只介绍要如何操作&#xff0c;使用什么样的命令&#xff0c;但是不去介绍为什么要这么做&#xff0c;搞得好多小白一头雾水。本文从linux的文件系统开始讲起&#xff0c;帮你彻底学会linux系统中的磁盘扩容操作。 …

科学指南针iThenticate自助查重系统重磅上线

科学指南针&#xff0c;一直致力于为科研工作者提供高效、专业的学术支持&#xff0c;近日推出了全新的iThenticate自助查重系统。这一系统的上线&#xff0c;旨在为广大科研工作者提供更加便捷、准确的论文查重服务&#xff0c;进一步规范英文使用&#xff0c;提升科研质量。 …