数据结构与算法导学

news2024/11/16 16:34:41

文章目录

  • 数据结构和算法导学
    • 认识数据结构
    • 认识算法
    • 总结

数据结构和算法导学

程序 = 数据结构 + 算法

认识数据结构

  • 什么是数据结构

    数据结构是一门研究计算机中数据存储数据操作的学科。

  • 为什么要学习数据结构

    学习数据结构能让我们写出更加优秀的代码。当我们熟悉了常见的数据结构后,我们再编写程序,就能够选择一种更加合理的数据结构,让我们的代码更加高效、简洁,节省大量的时间、内存。

  • 数据结构的组成数据的逻辑结构+数据的存储结构+数据的运算

    • 数据的逻辑结构:指从数据的逻辑角度1来观察数据、分析数据,本质就是数据间的关系

      主要有4种:集合线性结构树形结构图形结构

      数据的逻辑结构特点示例
      集合结构元素间关系松散,元素之间只存在是否同属一个集合的关系
      线性结构元素间存在一对一的关系
      树形结构元素间存在一对多的关系
      图形结构元素间存在多对多的关系

      这四种以又分为两大类,即:线性结构和非线性结构。线性结构常见的有:数组、队列、链表和栈;非线性结构包括:二维数组,多维数组,广义表,树结构,图结构

    • 数据的存储结构:是数据逻辑结构再计算机中的具体实现,我们也称之为数据的物理结构,本质就是数据存储的方式

      主要有4种:顺序存储链接存储索引存储散列存储

      数据的存储结构描述具体实现
      顺序存储把数据存放在地址连续的存储单元中的存储方式,逻辑关系和物理关系一致数组
      链接存储用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的),借用指针或引用来来确定逻辑关系链表
      索引存储分别存放数据元素和元素间关系的存储方式索引表
      散列存储又称hash存储,是一种力图将数据元素的存储位置与关键码之间建立确定对应关系的存储方式Hash表
    • 数据的运算:指对数据结构的操作(主要是针对存储在改数据结构中的元素),本质是对数据的操作

      常见的的数据运算有:

      1. 创建(create): 创建一个空的数据结构
      2. 清除(clear): 删除数据结构中的所有数据元素
      3. 插入(insert): 在数据结构指定的位置插入一个元素
      4. 删除(remove):将数据结构中的某个元素删除
      5. 搜索(search):在数据结构中搜索满足特定条件的数据元素
      6. 更新(update):修改数据结构中的某个数据元素的值
      7. 访问(visit):访问数据结构中的某个数据元素
      8. 遍历(traverse):按照某种次序访问数据结构中的每一数据元素,是每个数据元素恰好被访问一次
      注:每种数据结构还可包含一些特定的计算
      1. 树状结构中,找某个元素的儿子/父亲的操作
      2. 线形结构中,找某个元素的前驱或后继
      
  • 数据结构中的基本概念

    • 数据元素:是组成数据的、有一定意义的基本单位,也别称作记录、结点
    • 数据项:是组成数据元素的基本单位,是不可再分的最小数据单位了。一个数据元素可以由若干数据项组成

    image-20220812105931025

    数据元素是正真进行访问和处理的基本单位

    我对数据元素和数据项的理解:

    数据元素就类似于编程时的对象,数据项就是对象的属性,我们在编程时,一般是先确定对象,然后通过对象操作属性。


认识算法

  • 什么是算法

    官方定义:算法是对特点问题求解步骤的准确而完整的描述。

    我对理解:算法简而言之就是计算方法,是一种方法、一种策略,能够使用这种方法得到我们想要的结果,当我们遇到一个数学问题求根号2保留六位小数的近似解时,其中就可以使用二分法这种算法进行求解。

    (这个理解有失偏颇,计算方法≠计算方法,算法有时候不一定需要计算)

  • 算法的特征

    • 输入:一个算法可接受零个或多个输入参数
    • 输出:一个算法有至少一个或多个输出
    • 确定性:算法的每一步必须确定,无二义性,对于同类型输入,只能有一条执行路径,只能得到相同的结果
    • 有穷性:算法的执行步骤是有限的,每一个步骤都能在可接受的时间范围内
    • 可行性:算法可以使用代码实现,并在机器上运行并能够最终得到正确结果

一个简单的算法例子:

求解1~n之间所有整数的和。

方法一:暴力求解

Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int sum = 0;
for(int i=0;i<n;i++){
  sum += i;
}
System.out.pirntln(sum);

方法二:公式法(高斯求和算法)

Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int sum = 0;
sum = (1+n)*n/2;
System.out.pirntln(sum);

显然明显算法二要优于算法一!那么如何评判这两个算法的优劣呢?这就需要对算法进行性能分析了

  • 算法的性能分析:通常以算法的 空间复杂度时间复杂度 来评价一个算法的优劣(一般而言我们会更加注重算法的时间复杂度)

    • 空间复杂度:根据算法编写的程序所占计算机的内存

    • 时间复杂度:根据算法编写的程序从执行到得到正确结果,这一过程总共所花的时间

      时间复杂度分析

      • 事后分析法:编写一个测试程序运行时间的代码,去测试算法程序的运行时间

        例如:

        long start = System.currentTimeMillis();
        /*-------------待测试的代码---------------*/
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int sum = 0;
        sum = (1+n)*n/2;
        System.out.pirntln(sum);
        /*--------------------------------------*/
        long end = System.currentTimeMillis();
        System.out.println(end-start);
        

        优点:直观,简单

        缺点:不能够准确反映算法的时间复杂度,测试会受硬件环境影响

      • 事前分析法:可以根据以下几个主要因素分析算法

        1)编译产生的机器语言代码的质量(与编译器相关,难以干预)

        2)机器执行指令的速度(与机器硬件相关,难以干预)

        3)问题的输入规模(可以人为干预)

        4)算法的策略(可以人为干预)

        根据3)和4)可以构造一个 T ( n ) = O ( f ( n ) ) T(n) = O(f(n)) T(n)=O(f(n))的函数来分析算法的时间复杂度(其中n表示算法执行的次数)

总结

  • 数据的逻辑结构和物理结构之间的关系:数据的逻辑结构是一种比存储结构更大的概念,它注重的数据元素之间的关系,不在乎数据元素的存储方式,是十分抽象的;而存储结构注重的是数据的存储方式,是一个具体实在的东西,依靠存储结构能够实现元素间不同的关系,所以数据的一种逻辑结构可以由多种存储结构去实现,比如:线性结构可以由顺序存储、链式存储实现。

    举个不恰当的例子:在建房子时,建筑师绘制草图用于描述房屋各部分之间的结构,这个草图就相当于是房屋的逻辑结构;而包工头选择用什么材料去具体实现它,这个过程就是房屋的存储结构。

  • 算法和数据结构之间关系,在我看来数据结构就是让算法更好实现的一个工具。数据结构是一种存储数据的方式,由数据的存储结构实现;而算法是解决问题的方法,由代码实现;我们在实现算法的时候,需要选用一种合适的数据结构来让代码占用更小的内存、更少的时间。

数据结构分类


推荐阅读:

  • 图的几种存储方式
  • 数据结构-二维数组-存储结构

  1. 逻辑角度就是指,只注重数据之间的关系而忽略其它次要因素的一种观察方法。比如:从逻辑角度来讲,男女之间的关系就可能是夫妻关系、兄妹关系、姐弟关系,它更加注重关系,而非其它次要因素,诸如年龄、身高…… ↩︎

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

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

相关文章

关于在线帮助中心你需要思考以下几个问题

搭建帮助中心是大多数企业都在尝试做的事情&#xff0c;它的重要性对于企业来说不言而喻。现在对于企业来说&#xff0c;搭建帮助中心或许不是什么难事&#xff0c;但是关于帮助中心&#xff0c;有几个问题需要思考清楚&#xff0c;才能让其发挥最大的价值。 一、如何让用户养成…

CAS 原子操作类

CAS 原子类 java.util.concurrent.atomic 是什么 CAS compare and swap的缩写&#xff0c;中文翻译比较并交换&#xff0c;实现并发算法时常用的一种技术 它包含三个操作数–内存位置、预期原值及更新值 执行CAS操作时&#xff0c;将内存位置的值与预期原值比较 如果相匹…

网络协议与攻击模拟-05-ICMP协议

ICMP 协议 1、理解 ICMP 协议 2、理解 ICMP 重定向 3、会使用 wireshark 分析 ICMP 重定向流量实验 一、 ICMP 基本概念 1、 ICMP 协议 Internet 控制报文协议&#xff0c;用于在 IP 主机、路由器之间传递控制消息&#xff0c;控制消息指网络通不通、主机是否可达、路由是否…

荔枝派Zero(全志V3S)驱动开发之hello驱动程序

文章目录 前言一、设备驱动分类二、字符设备驱动简介三、字符设备驱动开发1、APP打开的文件在内核中如何表示2、编写驱动程序的步骤3、hello 驱动程序编写<1>、试验程序编写<2>、测试程序编写<3>、编写 Makefile<4>、编译 3、运行测试<1>、上传程…

PyTorch实战4:猴痘病识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f366; 参考文章&#xff1a;365天深度学习训练营-第P4周&#xff1a;猴痘病识别&#x1f356; 原作者&#xff1a;K同学啊|接辅导、项目定制 目录 一、搭建CNN网络结构1、原文网络结构1.1、网络…

4。计算机组成原理(2)存储系统

嵌入式软件开发&#xff0c;非科班专业必须掌握的基本计算机知识 核心知识点&#xff1a;数据表示和运算、存储系统、指令系统、总线系统、中央处理器、输入输出系统 这一部分主要讲解了CPU的组成和扩容、CPU与存储器&#xff08;主存、辅存、缓存&#xff09;的连接 一 存储…

C++笔记——第十六篇 异常

目录 1.C语言传统的处理错误的方式 2. C异常概念 3. 异常的使用 3.1 异常的抛出和捕获 在函数调用链中异常栈展开匹配原则 3.2异常安全 4.异常的优缺点 1.C语言传统的处理错误的方式 传统的错误处理机制&#xff1a; 1. 终止程序&#xff0c;如assert&#xff0c;缺陷&a…

飞腾ft2000-麒麟V10-SP1安装Docker、运行gitlab容器

目录 一、安装及配置docker 1、卸载docker相关包及删除相关配置文件 2、安装二进制docker 1.下载软件包 2.解压 3.修改镜像加速地址 4.修改profile文件 5.启动docker 6.docker常用命令 二、安装并启动gitlab镜像 1.安装gitlab镜像 1.查询满足使用需求的gitlab版本 2…

很佩服的一个Google大佬,离职了。。

这两天&#xff0c;科技圈又有一个突发的爆款新闻相信不少同学都已经看到了。 那就是75岁的计算机科学家Geoffrey Hinton从谷歌离职了&#xff0c;从而引起了科技界的广泛关注和讨论。 而Hinton自己也证实了这一消息。 提到Geoffrey Hinton这个名字&#xff0c;对于一些了解过…

使用 Mercury 直接从 Jupyter 构建 Web 程序

动动发财的小手&#xff0c;点个赞吧&#xff01; 有效的沟通在所有数据驱动的项目中都至关重要。数据专业人员通常需要将他们的发现和见解传达给利益相关者&#xff0c;包括业务领导、技术团队和其他数据科学家。 虽然传达数据见解的传统方法&#xff08;如 PowerPoint 演示文…

Oracle SQL优化相关数据项

要掌握SQL调优技术,就需要能读懂SQL语句的执行计划,要想读懂SQL语句的执行计划,不仅需要准确理解SQL语句执行计划中各操作及其含义,还需要准确理解SQL语句执行计划中各数据项的含义。本书第7章中,已经对SQL语句执行计划中各个操作的含义做了详尽的阐述,本章中,我们将对S…

爱普特APT32F110x系列时钟介绍

最近要用APT32F110x做一些开发&#xff0c;顺便学习一下。 APT32F110x 是由爱普特推出的基于平头哥&#xff08;T-Head Microsystems&#xff09;CPU 内核开发的 32 位高性能低成本单片机。 APT32F1104x基于嵌入式 Flash 工艺制造&#xff0c;内部丰富的模拟资源&#xff0c;包…

ShardingJDBC核心概念与快速实战

目录 ShardingSphere介绍 ShardingSphere特点 ShardingSphere简述 ShardingSphere产品区分 ShardingJDBC实战 核心概念 实战 ShardingJDBC的分片算法 ShardingSphere目前提供了一共五种分片策略&#xff1a; 分库分表带来的问题 ShardingSphere介绍 ShardingSphere特…

结合SSE实现实时位置展示与轨迹展示

概述 实时位置与实时轨迹的展示是webgis中非常常见的一个功能&#xff0c;本文结合SSE来实现实现此功能。 SSE简介 SSE是Sever-Sent Event的首字母缩写&#xff0c;它是基于HTTP协议的&#xff0c;在服务器和客户端之间打开一个单向通道&#xff0c;服务端响应的不再是一次性…

车牌输入框 封装 (小程序 vue)

车牌输入框 封装 小程序licenseNumber.jslicenseNumber.jsonlicenseNumber.wxmllicenseNumber.wxss样例 vuevnp-input-box.vuevnp-input.vuevnp-keyboard.vue样例 小程序 licenseNumber.js const INPUT_NUM 8;//车牌号输入框个数 const EmptyArray new Array(INPUT_NUM).fi…

6个「会议议程」实例和免费模板

我们都参加过一些团队会议&#xff0c;在这些会议上&#xff0c;大多数与会者对会议的目的一无所知&#xff0c;而发言者则使讨论偏离轨道。 接下来就是一场真正的灾难了。 你会发现你的团队因为“上述会议”而浪费了很多时间&#xff0c;却没有达到任何目的。 好消息! 一个…

【Python】序列类型②-元组

文章目录 1.元组简介2.元组的定义2.1定义只有一个元素的元组 3.元组的下标访问4.元组的常用方法5.使用in判断是否存在元素6.多元赋值操作 1.元组简介 元组和列表一样可以存放多个,不同数据类型的元素 与列表最大的不同就是:列表是可变的,而元组不可变 2.元组的定义 元组的定义:…

TCP/UDP协议

一、协议的概念 什么是协议&#xff1f; 从应用的角度出发&#xff0c;协议可理解为“规则”&#xff0c;是数据传输和数据的解释的规则。 假设&#xff0c;A、B双方欲传输文件。规定&#xff1a; 第一次&#xff0c;传输文件名&#xff0c;接收方接收到文件名&#xff0c;…

Springboot +Flowable,ReceiveTask的简单使用方法

一.简介 ReceiveTask&#xff08;接受任务&#xff09;&#xff0c;它的图标如下图所示&#xff1a; ReceiveTask 可以算是 Flowable 中最简单的一种任务&#xff0c;当该任务到达的时候&#xff0c;它不做任何逻辑&#xff0c;而是被动地等待用户确认。 ReceiveTask 往往适…

RepVGG: Making VGG-style ConvNets Great Again

文章地址&#xff1a;《RepVGG: Making VGG-style ConvNets Great Again》 代码地址&#xff1a;https://github.com/megvii-model/RepVGG 文章发表于CVPR2021&#xff0c;文章提出一种将训练态和推断态网络结构解耦的方法。文章认为目前复杂的网络结构能够获取更高的精度&am…