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

【数据结构】绪论

文章目录

1. 绪论

1.1 概述

1.2 数据与数据结构

1.2.1 术语

1.2.2 逻辑结构

1.2.3 存储结构:

1.2.4 数据操作:

1.3 算法

1.3.1 算法特性

1.3.2 算法目标

1.3.3 算法分析:概述

1.3.4 算法分析:时间复杂度(大O)

1.3.5 算法分析:最好、最坏、平均

1.4 回顾:西格玛Σ 求和

1. 绪论

1.1 概述

  • 算法 + 数据结构 = 程序

    • 程序:计算机指令的组合

    • 算法:程序的逻辑抽象

    • 数据结构:数据及其关系的反映,从逻辑结构和存储(物理)结构。

  • 数据结构解决具体问题:

    1. 数据的逻辑结构(数学模型)

    2. 数据的存储结构

    3. 数据操作与运算

1.2 数据与数据结构

1.2.1 术语

  • 数据(Data):数据是信息的载体,是对客观事物的符号表示。

  • 数据元素(Data Element):是数据的基本单位,是一个个体。相当于表的一行。

  • 数据项(Data Item):是数据元素的组成部分。相当于表的列。

  • 数据对象(Data Object):性质相同的数据元素的集合。相当于表。

  • 数据结构(Data Structure):特定关系的数据元素的集合。

1.2.2 逻辑结构

  • 逻辑结构:数据元素之间的逻辑关系,与数据存储无关,独立与计算机之外。

  • 数据元素按照特性:

    1. 集合:元素之间没有关系,比较松散

    2. 线性结构:元素之间存在==一对一==关系。除了开始和终端结点,其他结点由有一个前驱和一个后继。

    3. 树形结构:元素之间存在==一对多==关系。

    4. 图形结构:元素之间存在==多对多==关系。

  • 数据的逻辑结构需要2部分:数据元素(data)、数据元素的关系(relationship)

     

1.2.3 存储结构:

  • 存储结构:数据的存储结构,也称为物理结构,是数据的逻辑结构在计算机的实现。

    • 数据元素的值存储表示和逻辑关系。

  • 存储结构的4种方式:

    1. 顺序存储:在一片连续的存储空间中进行存储,元素的逻辑位置和物理位置保持一致。例如:数组

       

    2. 链式存储:可以存储在任意的物理物质上,需要额外的部分存放逻辑关系的指针。例如:链表

       

    3. 索引存储:存储数据的同时,额外的存储一个索引表。在查询时可以提高效率。

    4. 散列存储:一般情况物理上可以是连续的存储空间,需要通过散列函数hash来确定存储位置。在查询时可以提高效率。

       

1.2.4 数据操作:

  • 初始化:创建、销毁:

  • 数据操作:插入/添加、删除、修改

  • 数据使用:查找、遍历

1.3 算法

  • 算法:对特定问题求解步骤的一种描述。是指令的有限序列。

1.3.1 算法特性

  1. 有穷性:有限

  2. 确定性:需求确定、指令确定

  3. 有效性:指令都是由意义

  4. 输入:

  5. 输出:

 

1.3.2 算法目标

  1. 正确性:基本要求,需求和实现对应。

  2. 可读性:使程序员能够读懂,编写代码时可以辅助注释。

  3. 健壮性:临界值的处理、无效数据的校验等。

  4. 高效性:使用较少的资源(资源分2种:时间资源、空间资源)。一个好的算法要做到执行时所需时间尽量短,所需的最大存储空间尽量少。

1.3.3 算法分析:概述

  • 算法的复杂度是衡量算法优劣的重要依据。

  • 算法的复杂度分类:时间复杂度、空间复杂度。

    • 时间复杂度:执行时间的长短。

    • 空间复杂度:执行时空间需求量,也就是计算机资源的使用量。

1.3.4 算法分析:时间复杂度(大O)

  • 主要考虑因素:

    1. 算法本身

    2. 问题规模

    3. 程序语言选择

    4. 编译程序(JDK优劣)

    5. 硬件速度

    6. 运行软件

  • 时间复杂度通过大O表示法进行表示的

    • 大O表示法,用于估算一个算法的执行时间。

    • 算法执行时间:Σ(指令的执行次数 * 指令的执行时间)。

    • 指令的执行时间是固定的,可以不考虑。只需要考虑指令的执行次数即可。

    • 大O表达法,通过统计指令的执行次数,就可以估算出一个算法的优劣。

    • 指令的执行次数:每行代码执行的次数,将所有的次数累加在一起即可。

    • 例如1.7:2n^3 + 3n^2+2n+1 总次数表达式 --> 只考虑最高次幂 --> O(n^3)

    • 大O表达式只需要考虑最高次幂的项。

  • 大O表达式常见的形式

    • 常量阶:O(1) ,执行的次数与输入无关。

    • 线性阶:O(n) ,执行的次数与输入成正比关系。例如:一层循环。

    • 平方阶:O(n^2) , 执行的次数与输入成平方关系。例如:二层循环

    • 立方阶:O(n^3) ,执行的次数与输入成立方关系。例如:三层循环

    • 对数阶:O(log2n) , 执行的次数与输入成开方关系。例如:求对数 log28 = 3

    • 线性对数阶:O(nlog2n)

 

  • O(log2n) 指数计算:R表示次数

     

  • O (n) :一层循环

  • O(n^2):二层循环(99乘法表)

    int n = 9;
    for(int i = 0 ; i < n ; i ++) {
        for(int j = 0 ; j < n : j ++) {
            // 次数 n*n
        }
    }
  • O(n^3):三层循环

    int n = 9;
    for(int i = 0 ; i < n ; i ++) {             //时针
        for(int j = 0 ; j < n : j ++) {         //分针
            for(int m = 0 ; m < n ; m++) {      //秒针
                // 次数 n * n * n
            }
        }
    }

1.3.5 算法分析:最好、最坏、平均

  • 实例:从数组中获得内容 a[1...n]

  • 最好时间复杂度:获得最好的情况,例如:数组中的第一个数据。O(1)表示此情况。

  • 最坏时间复杂度:获得最坏的情况,例如:数据中最后一位。O(n)表示此情况。

  • 平均时间复杂度:

    • 1+...+n和 : (n+1) * n/2

    • 平均,和/n :(n+1) * n/2 / n ---> (n + 1) / 2 --> O(n)表示

  • 结论:在一般情况下,取最坏时间复杂度等概率下的平均时间复杂度作为算法的时间复杂度。

1.4 回顾:西格玛Σ 求和

 

  • 需求:1+2+3+4+....+n

     

    $$
    \sum_{i=1}^{n}\dfrac{(n+1)*n}{2} \tag{西格玛Σ求和}
    $$

相关文章:

  • C++的4种管理数据内存的方式
  • 中秋节的月亮怎么拍?不用手机和相机,程序员照样能拍出大片的感觉
  • Windows性能监控工具ypeperf
  • Python基础语法(二)—— 条件语句(if)+循环语句(for+while)
  • webpack基础使用
  • 基于蜜蜂算法求解电力系统经济调度(Matlab代码实现)
  • 我的vue的学习之旅
  • 【新学期、新Flag】快来参与活动、获取丰厚的奖励吧
  • Selenium操作已经打开的Chrome(只怪自己尝试的太迟)
  • 都这麽大了还不了解防火墙?
  • Vue的入门学习
  • AI作画飞入平民百姓家——stable diffusion初体验
  • [基于瑞芯微RV1126调试RTL8818FU WIFI模组支持STA和AP模式]
  • 算法面试 | 40天刷完LeetCode 精选 TOP 面试题(2/40)
  • MySQL GROUP BY和HAVING的使用 2022/09/09
  • 【技术性】Search知识
  • FineReport中如何实现自动滚屏效果
  • gcc介绍及安装
  • JavaScript 奇技淫巧
  • js写一个简单的选项卡
  • mysql中InnoDB引擎中页的概念
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • webpack+react项目初体验——记录我的webpack环境配置
  • 对象管理器(defineProperty)学习笔记
  • 分布式熔断降级平台aegis
  • 服务器之间,相同帐号,实现免密钥登录
  • 基于 Babel 的 npm 包最小化设置
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 前端面试之闭包
  • 新版博客前端前瞻
  • 一个JAVA程序员成长之路分享
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • k8s使用glusterfs实现动态持久化存储
  • raise 与 raise ... from 的区别
  • 回归生活:清理微信公众号
  • ​HTTP与HTTPS:网络通信的安全卫士
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • #14vue3生成表单并跳转到外部地址的方式
  • #考研#计算机文化知识1(局域网及网络互联)
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (1)STL算法之遍历容器
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (function(){})()的分步解析
  • (Git) gitignore基础使用
  • (定时器/计数器)中断系统(详解与使用)
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (蓝桥杯每日一题)love
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (四)汇编语言——简单程序
  • (算法)N皇后问题
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (五)网络优化与超参数选择--九五小庞
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。