数据结构与算法C语言版学习笔记(1)-绪论

news2024/10/7 12:19:36

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 一、数据结构的研究内容
  • 二、基本概念与术语
    • 1.数据与数据元素
    • 2.数据结构
      • 逻辑结构的种类
      • 存储结构的种类
  • 三、算法
    • 1.什么是算法?算法的描述
    • 2.一个算法要具备的特性
    • 3.算法设计的要求?
  • 四、衡量算法优劣的两个重要特性:时间复杂度和空间复杂度
    • 1.对于时间复杂度,直接上例子:
      • 例①
      • 例二
      • 例三
      • 例四
    • 2.时间复杂度的其他情况
    • 3.渐进空间复杂度


一、数据结构的研究内容

举个例子:
研究一个班级成绩表,表里有同学的名字、学号、成绩、排名,要进行增删改查操作——线性表
研究一个大文件夹里面的小文件夹,进行增删改查——树状结构
研究地图导航,要求一个地点到另一个地点的最短路径——网状结构

共性:无法用数学方式来描述这类问题,是非数值计算问题。

二、基本概念与术语

1.数据与数据元素

数据:
在这里插入图片描述
数据元素:
在这里插入图片描述
数据项:数据项是构成数据元素的不可分割的最小单位。
在这里插入图片描述
数据对象:性质相同的数据元素的集合。

2.数据结构

在这里插入图片描述
这里引出了一个关键性的知识:逻辑结构和存储结构。
我以C语言为例:
我们定义一个const int a[5],那么这5个元素在逻辑结构上就是线性排列的,而从计算机内部存储结构,他们被依次存入flash内存中,地址是连续的
在这里插入图片描述

逻辑结构的种类

在这里插入图片描述
(1)线性结构:线性结构是指数据元素之间存在一对一的关系,数据元素之间只有一个直接前驱和一个直接后继。

①线性表:线性表是具有相同数据类型的 n 个数据元素的有限序列,其中元素之间的关系是一对一的关系。常见的线性表有数组和链表。
②栈:栈是一种特殊的线性表,只能在一端进行插入和删除操作,即后进先出(LIFO)的原则。
③队列:队列也是一种特殊的线性表,只能在一端进行插入操作,在另一端进行删除操作,即先进先出(FIFO)的原则。
④串:串是一种特殊的线性表,它是由零个或多个字符组成的有限序列,其中字符之间的关系是一对一的关系。

(2)非线性结构:非线性结构是指数据元素之间存在一对多或多对多的关系,数据元素之间可以有多个直接前驱和直接后继

①树:树是由 n(n>=0)个结点组成的有限集合,其中一个结点称为根结点,其余结点可以分为多个互不相交的子集,每个子集本身又是一棵树。树的特点是一个结点可以有多个子节点,但每个结点只能有一个父节点。
②图:图是由顶点的有穷非空集合和顶点之间的边的集合组成。图的特点是顶点之间可以有多个边,边可以有方向。

总的来说,线性结构和非线性结构分为这四类:
在这里插入图片描述
他们本质是这些数据元素之间存在着的不同关系。

存储结构的种类

主要介绍这两种类型:顺序存储结构和链式存储结构。
顺序存储结构和链式存储结构是两种常见的数据结构存储方式。

(1)顺序存储结构:顺序存储结构是将数据元素存储在一块连续的存储空间中。在顺序存储结构中,数据元素的物理存储位置是连续的,可以通过下标或偏移量来直接访问元素。常见的顺序存储结构有数组

优点:
访问速度快:由于元素在内存中连续存储,可以通过下标直接访问,因此访问速度较快。
存储密度高:不需要额外的存储空间来存储指针或链接信息,存储密度高。
缺点:
大小固定:顺序存储结构的大小是固定的,一旦分配了固定大小的空间,无法动态扩展或缩小。
插入和删除操作慢:在顺序存储结构中,插入和删除元素需要移动其他元素,时间复杂度较高。

(2)链式存储结构:链式存储结构是通过节点之间的指针或链接来实现数据元素的存储。在链式存储结构中,每个节点包含数据元素和指向下一个节点的指针。常见的链式存储结构有链表。

优点:
动态存储:链式存储结构可以根据需要动态分配和释放存储空间,可以灵活地增加或删除元素。
插入和删除操作快:在链式存储结构中,插入和删除元素只需要修改指针的指向,时间复杂度较低。
缺点:
访问速度慢:由于节点之间的链接需要通过指针进行跳转,访问元素的速度较慢。
存储密度低:链式存储结构需要额外的指针来存储节点之间的链接信息,存储密度低。

选择顺序存储结构还是链式存储结构取决于具体的应用场景和需求。顺序存储结构适用于对元素的访问频繁,而插入和删除操作较少的情况。链式存储结构适用于需要动态分配和释放存储空间,插入和删除操作较频繁的情况。

这里我用C语言给一个例子:

存储方式:
数组:数组使用一块连续的内存空间来存储元素,元素之间的内存地址是连续的。数组的大小在创建时就确定,且一旦分配了固定大小的空间,大小就无法动态改变。
链表:链表使用节点来存储元素,每个节点包含数据和指向下一个节点的指针。节点在内存中可以是分散的,通过指针将它们链接起来。链表的大小可以动态增加或缩小。

插入和删除操作:
数组:在数组中插入或删除元素时,涉及到元素的移动。插入元素时,需要将插入位置后面的元素向后移动,删除元素时,需要将删除位置后面的元素向前移动。这些操作可能会导致较大的时间复杂度。
链表:在链表中插入或删除元素时,只需要修改节点的指针指向即可,不需要移动其他节点。这些操作时间复杂度较低。

访问元素的效率:
数组:数组通过下标来访问元素,可以直接通过下标计算出元素在内存中的位置。因此,访问数组元素的效率很高。
链表:链表中的节点之间通过指针链接,访问链表元素需要通过指针跳转,因此,相对于数组,访问链表元素的效率较低。

存储密度:
数组:数组在存储元素时不需要额外的指针或链接信息,存储密度高。
链表:链表中每个节点都需要存储指向下一个节点的指针,因此,链表的存储密度较低。

三、算法

1.什么是算法?算法的描述

算法是一组解决问题的明确步骤和指令。它是一种有序的操作序列,用于解决特定问题或完成特定任务。算法可以用来执行各种计算、数据处理和自动化任务。它可以是数学公式、计算机程序、流程图等形式。算法的目标是通过一系列有限的步骤来解决问题,并且在有限的时间内产生正确的结果。算法可以用来解决各种问题,比如排序、搜索、加密、图像处理等。
在这里插入图片描述

2.一个算法要具备的特性

在这里插入图片描述

3.算法设计的要求?

在这里插入图片描述
在这里插入图片描述
高效性和可读性顾名思义,不用再去解释。

四、衡量算法优劣的两个重要特性:时间复杂度和空间复杂度

在这里插入图片描述

1.对于时间复杂度,直接上例子:

在这里插入图片描述
大循环套小循环,每个循环内语句执行次数之和就是时间复杂度。
但是,这样用多项式来表示的话,形式比较复杂,所以不太好。这时候引入无穷小,外面加一个O,作为同阶无穷小。
在这里插入图片描述
也就是说用渐进时间复杂度来度量算法的时间好坏。用其中最多的执行次数的语句的时间作为总体的时间
在这里插入图片描述
那么如何具体的计算一个算法的时间复杂度呢?

例①

在这里插入图片描述
要点:找到算法中执行次数最多的那条语句。
明显,对于其中一个二重循环,最里面的sum【i】+=x[i][j],外循环执行一次,内循环执行n次,外循环执行m次,内循环执行mn次,其他语句最多执行m次,所以时间复杂度为O(mn)。

例二

在这里插入图片描述
最里面循环的执行语句一般次数最多,这里i循环执行一次,j循环执行n次,k循环执行n*n次,则i循环执行n次,k循环执行n^3次,所以时间复杂度为O(n的3次方)。

例三

在这里插入图片描述
采用如图的计算方法,变成一个数学问题来计算:
在这里插入图片描述

例四

在这里插入图片描述
关于伪代码,要找到执行次数x与n的关系。
在这里插入图片描述

2.时间复杂度的其他情况

在这里插入图片描述
对于一个算法,它的执行次数不一定是固定的,那么就会存在最少和最多的执行次数的可能。比如这个例子,要查找数组中的某个元素,那么这个语句的执行次数有可能最好1次就找到了,但是也有可能一直要执行到n次才能找到。
在这里插入图片描述
我们通常只考虑最坏时间复杂度,保证算法的运行时间在一个可控的范围内。
以下是时间复杂度的大小排序:
在这里插入图片描述

3.渐进空间复杂度

在这里插入图片描述
渐进空间复杂度是衡量算法在处理输入规模增大时所需的额外空间的度量。它表示算法所使用的额外空间的增长趋势。

常见的渐进空间复杂度有以下几种:

O(1):常数空间复杂度,表示算法所使用的额外空间是一个常数。不随输入规模的增大而变化。

O(n):线性空间复杂度,表示算法所使用的额外空间随输入规模的增大而线性增长。

O(n^2):平方空间复杂度,表示算法所使用的额外空间随输入规模的增大而平方增长。

O(log n):对数空间复杂度,表示算法所使用的额外空间随输入规模的增大而对数增长。

O(n log n):线性对数空间复杂度,表示算法所使用的额外空间随输入规模的增大而线性对数增长。

需要注意的是,渐进空间复杂度只考虑算法所使用的额外空间,不包括输入数据所占用的空间。在计算渐进空间复杂度时,通常忽略常数因子和低阶项,只关注最高阶项。和时间复杂度类似,渐进空间复杂度也使用大O表示法来表示。

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

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

相关文章

【chatglm3】(2)使用docker运行chatglm3对外的http服务,使用python代码执行函数调用,查询北京天气

函数调用的演示视频: 使用docker运行最新chatglm3-6b,对外的http服务,使用python代码执行函数调用,查询北京天气代码演示和说明 使用docker运行最新chatglm3-6b,对外的http服务,使用python代码执行函数调用…

Java web(三):Http、Tomcat、Servlet

文章目录 一、Java web技术栈二、Http1.1 Http请求数据格式1.2 Http响应数据格式1.3 状态码 二、Tomcat2.1 介绍2.2 web项目结构2.3 IDEA中使用Tomcat 三、Servlet3.1 Servlet使用3.2 Servlet生命周期3.3 Servlet方法和体系结构3.4 urlPattern配置 四、Request4.1 获取请求数据…

数字孪生技术:金融业合规与自动化的未来

在当今数字化时代,金融行业正积极探索数字孪生技术,以实现更高效的运营和更好的客户体验。数字孪生是一种将实体世界的对象、过程和系统数字化为虚拟模型的技术,金融机构正在充分利用它带来的众多优势。 1. 风险管理与模拟 数字孪生模型可用…

数据分析指标体系的构建

指标体系是什么? (S1)为了用量化方式准确描述场景,提出一系列的指标。(S2)将指标有系统地组织起来,形成的逻辑体系 指标体系 指标 体系 单独的几个指标不能称之为指标体系 如何评价指…

树莓派安装Ubuntu22.04LTS桌面版

工具:树莓派4B Raspberry Pi 自己下载的ubuntu22.04LTS img磁盘镜像文件 这里有一个小技巧:这个Raspberry Pi的选择镜像的时候在最后面一行可以选择自定义的镜像,哈哈哈哈,这就使得我们可以自己下载,而且知道那个文…

你能想象吗,传输线能控到多少阻抗还要看隔壁信号线的脸色?

高速先生成员--黄刚 关于传输线的阻抗计算相关的文章,高速先生都写过很多篇了,定性来说的话就是传输线的阻抗和自己的线宽铜厚以及材料的介电常数都成反比,与到参考平面的距离成正比。定量来说的话,就以今天我们要讲的案例来说吧…

毕设源码推荐【源码好优多】

一、微信小程序商城管理系统 基于SpringVueMysqlRedis主流技术开发框架集成开发的微信商场管理系统;其中包含微信小程序、java后端、java PC端、数据接口等技术框架,包含:会员管理、商品管理、推广管理、商场管理、订单管理、系统管理等标准通…

名称空间,作用域,global和nonlocal

一、名称空间 加载顺序: 1、内置命名空间 2、全局命名空间 3、局部命名空间 取值顺序: 1、局部命名空间 2、全局命名空间 3、内置命名空间 二、作用域 三、global python之闭包https://blog.csdn.net/Python_1981/article/details/133636994 四…

苹果cms论坛多播放源自动采集在线影视网站

苹果 cms 论坛一个基于 vue 和 gin 实现的在线观影网站 项目采用 vite vue 作为前端技术栈, 使用 ElementPlus 作为 UI 框架进行开发 后端程序使用 Gin gorm go-redis 等相关框架提供接口服务, 使用 gocolly 和 robfig/cron 进行公共影视资源采集和定时更新功能 目前用户…

vue2+ant-design-vue a-descriptions 详情组件二次封装(vue2项目)

最终效果 一、需求 一般后台管理系统,通常页面都有增删改查;而查不外乎就是渲染新增/修改的数据(由输入框变成输入框禁用),因为输入框禁用后颜色透明度会降低,显的颜色偏暗;为解决这个需求于是封…

【广州华锐互动】军用飞机VR实战训练系统

随着科技的飞速发展,虚拟现实(VR)技术为军事训练带来了前所未有的机遇。军用飞机VR实战训练系统,正是在这一背景下应运而生的一种创新的训练方法。该系统利用先进的虚拟现实技术,为飞行员提供真实且逼真的模拟飞行环境,使之能够在…

OpenFeign的简单介绍和功能实操

前言 本文主要做一下OpenFeign的简单介绍和功能实操,实操主要是OpenFeign的超时和重试,在阅读本文章前,请完成《Nacos 注册中心介绍与实操》内的Nacos多模块生产消费者项目 什么是OpenFeign OpenFeign全名Spring Cloud OpenFeign&#xff…

基础课16——客服中心内部使用的智能客服系统

客服中心内部使用的智能客服系统主要包括以下几类: 智能客服机器人(呼入、呼出):可以自动回答用户的问题,并能根据用户需求进行多轮对话。它采用了先进的自然语言处理技术,能理解并回答用户的问题,并根据需要自主分析…

Redis入门03-多线程和有序集合

目录 Redis的多线程 Redis有序集合的集合操作 Redis的多线程 Redis6.0版本推出了多线程,需要注意的是Redis6.0的多线程是⽤多线程来处理数据的读写和协议解析,但是Redis执⾏命令还是单线程的。官方FAQ表示,因为Redis是基于内存的操作&…

python:pybullet 3D游戏物理引擎 安装过程

先从 Microsoft C Build Tools - Visual Studio 下载 1.73GB 安装 "Microsoft C Build Tools“ 现在,我们将创建一个虚拟环境,并在其中安装 numpy , pybullet cd /python python -m venv myenv cd myenv 使用 Scripts\activate 激活环境&…

【C/C++】积累和派生类的转换

基类与派生类对象之间有赋值兼容关系,由于派生类中包含从基类继承的成员,因此可以将派生类的值赋给基类对象,在用到基类对象的时候可以用其子类对象代替。具体表现在以下几个方面。 一、派生类对象可以向基类对象赋值 可以用子类(即公用派生…

11、电路综合-集总参数电路结构的S参数模型计算与Matlab

11、电路综合-集总参数电路结构的S参数模型 电路综合专栏的大纲如下: 网络综合和简化实频理论学习概述 前面介绍了许多微带线电路综合的实际案例,如: 3、电路综合原理与实践—单双端口理想微带线(伪)手算S参数与时域…

vue-advanced-chat使用指南

demo地址:https://gitee.com/beekim/vue-advanced-chat vue-advanced-chat的git地址:https://github.com/advanced-chat/vue-advanced-chat 1.搭建demo demo地址克隆后在demo目录安装依赖并启动 启动之后的页面如下: 2.前端代码分析 2.1 重点api分析 current-user-id:…

使用PyQuery库构建有趣的爬虫程序

目录 一、爬虫程序概述 二、PyQuery库介绍 三、使用PyQuery编写爬虫程序 四、注意事项和潜在问题 五、总结 本文将介绍如何使用PyQuery库编写一个有趣且实用的爬虫程序。我们将首先简要介绍爬虫程序的概念和应用,然后详细探讨PyQuery库的特点和优势。接着&…