数据结构与算法简介

news2025/7/5 2:59:53

什么是数据结构

数据结构的研究对象

  • 研究一组有特定关系的数据的存储处理
  • 通过抽象的方法

数据结构的研究内容

  • 数据之间的逻辑关系:存储实现(如何存储某种逻辑关系)

    • 集合结构:数据元素放在一起,但是元素间没有关系
    • 线性结构:数据元素的有序序列,每个元素有一个前趋和一个后继
    • 树形结构:层次关系的数据,除了根元素,每个元素有且只有一个前趋,后继数目不限
    • 图形结构:元素之间相互关联,每个元素可以有多个前趋和后继

在这里插入图片描述

  • 关系对应的操作:运算实现(在这种存储模式下,如何实现相关操作)

    • 创建:创建空的数据结构
    • 清除:清空数据结构
    • 插入:在指定位置插入新元素
    • 删除:删除某个元素
    • 搜索:搜索满足特定条件的元素
    • 更新:修改某个元素的值
    • 访问:访问数据结构中的某个元素
    • 遍历:按照某种次序,访问每个元素有且只有一次
  • 存储实现

    • 需要储存的信息
      • 一组数据元素
      • 数据元素之间的关系
    • 物理结构
      • 存储结点
      • 数据元素之间的关系的存储
      • 附加信息
    • 关系的存储
      • 顺序存储
      • 链接存储
      • 哈希存储
      • 索引存储
  • 运算实现

    • 操作怎么实现
      • 每个运算对应一个算法
      • 每个算法用一个函数表示
      • 每个数据结构有一组函数
  • 时间性能

    • 时间性能的衡量
    • 标准操作
    • 时间复杂度
      • 最好情况的时间复杂度
      • 最坏情况的时间复杂度
      • 平均情况的时间复杂度
    • 大O表示法(上界)
    • 两个定理
      • 求和定理
      • 求积定理
  • 空间性能

    • 空间复杂度
      • 算法处理过程中所需的额外工作量
      • 一般按最坏情况处理
      • 用大O表示法
  • 算法优化问题提出

    • 慢慢分析,逐步优化
    • 最大连续子序列和问题
  • O ( N 3 ) O(N^3) O(N3)的算法

    • 枚举法
  • O ( N 2 ) O(N^2) O(N2)的算法

    • 枚举子序列
  • O ( N l o g N ) O(NlogN) O(NlogN)的算法

    • 分治法
      • 情况1:答案位于前半部,可递归计算
      • 情况2:答案位于后半部,可递归计算
      • 情况3:答案从前半部开始但在后半部结束
    • 情况3的解决
      • 从两半部分的边界开始
      • 通过从右到左的扫描来找到左半段的最长序列
      • 从左到右的扫描找到右半段的最长序列
      • 把这两个子序列组合起来,形成跨越分割边界的最大连续子序列
    • 算法总结
      • 递归地计算整个位于前半部的最大连续子序列
      • 递归地计算整个位于后半部的最大连续子序列
      • 通过两个连续循环,计算从前半部开始在后半部结束的最大连续子序列的和
      • 选择三个值中的最大值
  • O(N)的算法

    • 在枚举法的基础上改进
      • 现象:和为负的子序列不可能是最大连续子序列的开始部分
      • 结论:当检测出一个负的子序列时,可以让start直接增加到j+1

数据结构的存储实现

  • 需要储存的

    信息

    • 一组数据元素
    • 数据元素之间的关系
  • 物理结构

    • 存储结点:一个简单变量、结构体变量或者对象
    • 存储数据元素之间的关系:用结点间的关系来表达
    • 存储附加信息:便于运算的“哑结点”
  • 如何存储

    元素及其关系

    • 顺序存储:用存储的位置表示元素之间的关系,主要用数组实现
    • 链接存储:用指针显式指出元素之间的关系,如链表
    • 哈希存储:主要用于表示集合这种元素间没有关系的结构,方便查找
    • 索引存储:分为数据区和索引区,在索引区存放关系

数据结构的运算实现

  • 操作怎么实现
    • 每个运算对应一个算法
    • 每个算法用一个函数表示
    • 每个数据结构有一组函数表示其对应的操作

算法优化

算法优化指的是优化算法的时间性能和空间性能。需要慢慢分析,逐步优化。

以最大连续子序列和问题为例来看算法优化问题。

给定整数序列,寻找最大的子序列和,例如,对于序列{-2, 11, -4, 13, -5, 2},答案是20。

  • O ( N 3 ) O(N^3) O(N3)算法:枚举法

这是最直观的算法。用起点和终点来确认一个子序列,这样我们就可以用两层的嵌套循环,枚举出所有的子序列:

int maxSubsequenceSum(int a[], int size, int &start, int &end) {
    int maxSum = 0;
    // 枚举起点 i
    for (int i = 0; i < size; i++ ) {
        // 枚举终点 j
        for( int j = i; j < size; j++ ) {
            int thisSum = 0; 
            // 计算i到j的子序列和
            for( int k = i; k <= j; k++ )     thisSum += a[ k ];
            // 如果是最大的,存下这个子序列的起点和终点以及最大的和
            if( thisSum > maxSum ) {
                maxSum = thisSum;
                start = i;   end = j;
            }
        }
    }
    return maxSum;
}
  • O ( N 2 ) O(N^2) O(N2) 算法:枚举子序列

在枚举的时候,i到 j+1 这个子序列的和,没必要再用一个for循环,可以直接在 i到 j 这个子序列的和上再加1个数,省略到最里层的循环。

int maxSubsequenceSum(int a[], int size,  int &start, int &end) {
    int maxSum = 0;
    for (int i = 0; i < size; i++ ) {
        int thisSum = 0; 
        for( int j = i;  j < size; j++ ) {
            // 直接在之前的计算结果上加上一个数,就能得到i到j的子序列和
            thisSum += a[ j ];
            if( thisSum > maxSum )   {
                maxSum = thisSum;
                start = i;   end = j
            }
        }
    }
    return maxSum;
}
  • O ( N l o g N ) O(NlogN) O(NlogN) 算法:分治法

分成不同的情况来解决:

  • 情况1:最大和子序列位于前半部,可递归计算
  • 情况2:最大和子序列位于后半部,可递归计算
  • 情况3:最大和子序列从前半部开始但在后半部结束
    • 从两半部分的边界开始
    • 通过从右到左的扫描来找到左半段的最长序列
    • 从左到右的扫描找到右半段的最长序列
    • 把这两个子序列组合起来,形成跨越分割边界的最大连续子序列
int maxSum(int a[ ],  int left,  int right , int &start, int &end) {
    int maxLeft, maxRight, center;
    int leftSum = 0, rightSum = 0;           
    int maxLeftTmp = 0,  maxRightTmp = 0;     
    int startL , startR,  endL,  endR;             
    
    // 递归的终止条件
    if (left == right) {                    
        start = end = left;
        return a[left] > 0 ? a[left] : 0;
    }
    
    center = (left + right) / 2;  
    // 递归地计算整个位于前半部的最大连续子序列
    maxLeft = maxSum(a,  left,  center,  startL,  endL); 
    // 递归地计算整个位于后半部的最大连续子序列
    maxRight = maxSum(a, center + 1,  right,  startR,  endR); 
    
    // 计算从前半部开始在后半部结束的最大连续子序列的和
    // 选择三个值中的最大值
    if (maxLeft > maxRight ) 
        if (maxLeft > maxLeftTmp + maxRightTmp)  {
            start = startL;
            end = endL;
            return  maxLeft;
        }
        else return maxLeftTmp + maxRightTmp;
    else
        if (maxRight > maxLeftTmp + maxRightTmp)  {
            start = startR;
            end = endR;
            return maxRight;
        }
        else return maxLeftTmp + maxRightTmp;
}
  • O(N) 算法:在枚举法的基础上改进
  • 现象:和为负的子序列不可能是最大连续子序列的开始部分
  • 结论:当检测出一个负的子序列时,可以让start直接增加到j+1
int maxSubsequenceSum(int a[], int size, int &start, int &end) {  
    // starttmp用于保存前面的最优方案
    int maxSum, starttmp, thisSum; 
    start = end = maxSum = starttmp = thisSum = 0; 
    for( int j = 0; j < size ; ++j ) {
        thisSum += a[j];
        if ( thisSum <= 0 ) {              
            thisSum = 0; 
            starttmp = j+1;
        } else if (thisSum > maxSum )  {   
            maxSum = thisSum; 
            start = starttmp;
            end = j;   
        }
    } 
    return maxSum;
}

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

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

相关文章

Python-Flask 蓝图以及钩子函数(5)

Flask 蓝图一、初识蓝图的页面结构二、创建蓝图的步骤三、钩子函数官方解释&#xff1a;Blueprint 是一种组织一组相关视图及其他代码的方式。与把视图及其他 代码直接注册到应用的方式不同&#xff0c;蓝图方式是把它们注册到蓝图&#xff0c;然后在工厂函数中 把蓝图注册到应…

Git 用法指导

1. 安装 Git 1. linux 安装 Git # 试着输入git&#xff0c;看看系统有没有安装Git&#xff1a; $ git The program git is currently not installed. You can install it by typing: sudo apt-get install git# 安装命令 sudo apt-get install git 如果是其他Linux版本&#…

Vue | Vue.js 高级语法系列

&#x1f5a5;️ Vue.js专栏&#xff1a;Vue.js 高级语法系列 &#x1f9d1;‍&#x1f4bc; 个人简介&#xff1a;一个不甘平庸的平凡人&#x1f36c; ✨ 个人主页&#xff1a;CoderHing的个人主页 &#x1f340; 格言: ☀️ 路漫漫其修远兮,吾将上下而求索☀️ &#x1f449;…

都说测试行业饱和了,为什么我们公司给初级测试开到了12K?

故事起因&#xff1a; 最近我有个刚毕业的学生问我说&#xff1a;我感觉现在测试行业已经饱和了&#xff0c;也不是说饱和了&#xff0c;是初级的测试根本就没有公司要&#xff0c;哪怕你不要工资也没公司要你&#xff0c;测试刚学出来&#xff0c;没有任何的项目经验和工作经验…

字符串c++练习(KMP等)

反转字符串 文章目录反转字符串反转字符串||替换空格翻转字符串里的单词左旋转字符串找出字符串中第一个匹配项的下标【模板】KMP字符串匹配题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1提示样例 1 解释数据规模与约定重复的字符串[BOI2009]Radio Transmission 无线…

【Linux】Linux中的环境变量及其意义

目录 一、环境变量的概念 1、让自己写的可执行程序无需路径即可执行的方法 1.1将可执行程序拷贝至/usr/bin/目录下 1.2将test的绝对路径添加至PATH中 二、环境变量相关的命令 三、getenv()&#xff08;获取环境变量&#xff09; 四、main函数命令行参数的解析及意义 1、…

如何基于TS在React中使用Redux Toolkit

什么是Redux Redux 是 JavaScript 应用程序的状态容器&#xff0c;提供可预测的状态管理.可以帮助你开发出行为稳定可预测的、运行于不同的环境&#xff08;客户端、服务器、原生应用&#xff09;、易于测试的应用程序。不仅于此&#xff0c;它还提供超爽的开发体验&#xff0…

【Pytorch with fastai】第 3 章 :数据伦理

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

CentOS7安装MySQL(亲测版)

1 Yum Repository下载安装包文件 [rootlocalhost home]# wget https://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm2 使用yum安装mysql yum install mysql-server执行后报错&#xff0c;官方5.7版本默认没有GPG key, 需要在上述命令上 添加 --nogpgcheck …

图解计算机内部的高速公路 —— 总线系统

本文已收录到 GitHub AndroidFamily&#xff0c;有 Android 进阶知识体系&#xff0c;欢迎 Star。技术和职场问题&#xff0c;请关注公众号 [彭旭锐] 进 Android 面试交流群。 前言 大家好&#xff0c;我是小彭。 在之前的文章中&#xff0c;我们聊到了计算机的冯诺依曼计算…

2022-09-17青少年软件编程(C语言)等级考试试卷(五级)解析

​​​​​​T1. 城堡问题 【题目描述】 图1是一个城堡的地形图。请你编写一个程序,计算城堡一共有多少房间,最大的房间有多大。城堡被分割成mn(m≤50,n≤50)个方块,每个方块可以有0~4面墙。 【输入】 程序从标准输入设备读入数据。第1、2行每行1个整数,分别是南北向、东西…

MySQL数据库基础

文章目录一. 数据库的操作二. 数据库中常用的数据类型三.表的操作四. 总结一. 数据库的操作 1. 创建数据库 创建语法1 crate database [这里填入表名称]; 说明&#xff1a;当我们创建数据库没有指定字符集和校验规则时&#xff0c;系统使用默认字符集&#xff1a;utf8&#xf…

(十二)Jmeter测试dubbo接口

一、概览 先去https://github.com/thubbo/jmeter-plugins-for-apache-dubbo下载扩展jar包将下载的jar包复制到 jmeter/lib/ext/下重启Jmeter创建Dubbo取样器 二、实操 添加dubbo取样器 输入请求详情 参数类型可以在 https://github.com/thubbo/jmeter-plugins-for-apache-…

如何在Retail Link网站上与Walmart进行EDI连接测试?

本文主要介绍通过沃尔玛Walmart供应商平台Retail Link与沃尔玛Walmart建立EDI连接的流程。沃尔玛Walmart作为零售行业中最先使用AS2协议传输EDI数据的企业之一&#xff0c;其AS2经过多年的使用检验&#xff0c;具有安全连接、灵活数据传输等优点&#xff0c;使其经久不衰&#…

Qt Xml文件的创建和解析[xml和dom方式]

Qt Xml文件的创建和解析[xml和dom方式] 【1】Qt XML使用说明【2】Qt XML未来可期【3】Qt XML文件格式【4】Qt 读取XML文档的方法【5】Qt XML解析方式比较【6】QXmlStreamReader类说明【7】QXmlStreamWriter类说明【8】DOM说明【9】XML常用函数【10】DOM常用函数【11】XML和DOM源…

摊牌了,请各位做好一年内随时失业的准备

前两天跟一个HR朋友聊天&#xff0c;她表示刚在boss上发布了一个普通测试岗位&#xff0c;不到一小时竟然收到了几百份简历。而且简历质量极高&#xff0c;这是往年不敢想象的。岗位少&#xff0c;竞争激烈&#xff0c;这是今年软件测试就业的真实写照&#xff0c;也是所有岗位…

Python开发环境及常用Web框架

Python Python是一门易于学习、功能强大的编程语言。它提供了高效的高级数据结构&#xff0c;还能简单有效地面向对象编程。Python 优雅的语法和动态类型以及解释型语言的本质&#xff0c;使它成为多数平台上写脚本和快速开发应用的理想语言。 吉多范罗苏姆&#xff08;Guido…

基于Postmate实现的跨域通信

1、Postmate 介绍 是一款基于 postMessage 来处理父子页面通信的库&#xff0c;轻量且好用。一个强大的、简单的、基于 promise 的 postMessage iFrame 通信库。 postmate 官方地址 https://github.com/dollarshaveclub/postmate 2、Postmate 特性 基于 promise 的 API&…

如何将数字改为千分符且保留两位小数显示?toLocaleString()和toFixed(2)踩坑

前言 基于现代Web前端框架的应用&#xff0c;其原理是通过浏览器向服务器发送网络请求&#xff0c;获取必要的index.html和打包好的JS、CSS等资源&#xff0c;在浏览器内执行JS&#xff0c;动态获取数据并渲染页面&#xff0c;从而将结果呈现给用户。在这个过程中&#xff0c;…

【java学习】 static

文章目录成员变量static 工具类static 代码块设计模式继承重写成员变量 1&#xff0e;成员变量的分类和访问分别是什么样的? 静态成员变量&#xff08;有static修饰&#xff0c;属于类、加载一次&#xff0c;可以被共享访问)&#xff0c;访问格式 类名.静态成员变量(推荐) 对…