【4】数据结构与算法--- 数据结构 进阶

2023-11-16

第 3 章 数据结构 进阶

3.1 线性表

线性表:按照某种线性关系存储下来的表

分类:

线性表 说明
顺序表 将数据放在一个连续的存储空间
链表 把数据分散存储,按照某种关系连成串
分类:单向链表、双向链表、单向循环链表

3.2 顺序表

3.2.1顺序表形式

​ 对象:顺序表里的数据

​ 分类/表现形式:

​ 基本布局:同类数据

​ 元素外置:异类数据

​ 原因:操作系统 自动分析传入的数据类型,分配存储空间

  • 如果是同类数据,那么放在连续存储空间
  • 如果是异类数据,那么放在合适的存储空间

基本布局:

	同类型数据

	数据的查看方法:				

				物理地址

				逻辑地址	---  使用的	

								起始位置 + 偏移量*(元素个数-1) 	

								十六进制的表示形式	0x	

元素外置:

异类数据 存储再不连续的空间

			中间手段		 ----逻辑地址

		单独找一个连续的存储空间,来存储各个数据的逻辑地址

		通过跳转的方式找到具体的元素								
3.2.2 顺序表结构

​ 顺序表结构:
A 基本属性
B的空间容量大小
B空间存储元素的个数
B 元素存储空间
结构存储样式:

结构存储样式 说明
一体式 基本属性信息和元素存储空间 放在一个连续空间
分离式 基本属性信息和元素存储空间 分别存放
3.2.3 顺序表实践

​ A.内容更改

		数据存储一旦定性,就永远不会再变,一旦变了,就是生成了一个新的对象空间
		一体式 
		分离式	
			灵活	****** 

​ B.容量更改

	容量扩充策略
		线性增加
		倍数增长			***********
3.2.4 顺序表常见操作
增加
			头部		保序增加 		O(n)
			尾部		保序增加		O(1)
			指定位置
				方法1	非保序增加		O(1)
				方法2	保序增加 		O(n)
删除
			头部		保序删除 		O(n)
			尾部		保序删除		O(1)
			指定位置
				方法1	非保序删除		O(1)	
				方法2	保序删除 		O(n)

3.3 单向链表

3.3.1 单向链表简介
单向链表是什么	
			基本单位:结点
				结点属性:元素数据区域item + 下一个元素的地址next
				多个结点连成串 
链表基本术语
			结点 
			头结点
			尾结点
			前驱结点(前结点)
			后继结点(后结点)
单向链表特点
			1 找到头结点,所有信息都找得到
			2 尾结点的next属性指向为None
			3 保存链表,只需要保存头结点的地址就可以了			
为什么用链表
			灵活、空间利用率高
3.3.2 python 链表解析
3.3.3 实践 之 基本属性
结点的内置属性
			class BaseNode(object):
				# 结点的基本属性
				def __init__(self,item):
					self.item = item
					self.next = None	
3.3.4 实践 之 操作分析
单向链表的基本属性
		class SingleLinkList(object):
			# 单向链表的基本属性 -- 规则3(保存链表,只需要保存头结点的地址就可以了	)
			def __init__(self,node=None):
				self.__head = node
信息查看类 类方法
链表是否为空 is_empty()
链表元素数量 length()
链表内容查看 travel()
链表内容搜索 search(item)
内容增加类 类方法
插头增 add(item)
插尾增 append(item)
指定位置增 insert(pos,item)
内容删除类 类方法
内容删除 remove(item)
3.3.5 实践 之 查看
判空 
			思路:规则3 
			# 判断链表是否为空
			def is_empty(self):
				# 思路:规则3,隐含规则1(头结点找不到就是空链表)
				return  self.__head is None
数量
	# 判断链表元素个数
    def length(self):
        # 准备工作:标签、计数器
        # 找到当前链表的头结点
        cur = self.__head
        count = 0
        # 遍历循环:条件来源于规则2
        # 查找尾结点
        while cur is not None:
            # 对计数进行加1
            count += 1
            # 移动当前的结点位置
            cur = cur.next		# 验证的是规则1
            # 输出最终计数
            return count		
关键点:
      写的时候,按非空链表来写,
      分析的时候,要分析特殊情况,空链表
所有内容
	# 输出链表所有内容
	def travel(self):
        # 准备工作:标签
        cur = self.__head
        # 遍历循环:条件来源于规则2
        while cur is not None:
            # 输出每个结点的内容,设置分隔符为空格(print默认会换行)
            print(cur.item,end=" ")
            # 移动到当前的结点位置
            cur = cur.next
            # 还原分割符为换行符
            print("")
关键点:
	循环遍历的退出条件:while cur is not None 
    结点内容输出:print(cur.item, end=" ") 
    结点移动:cur = cur.next
搜寻内容
    # 查询我要的内容
    def search(self, item):
        # 找到当前链表的头信息
        cur = self.__head
        # 查找尾结点
        while cur is not None:
            # 如果当前结点的内容就是我们要查找的,就返回True
            if cur.item == item:
                return True
            # 移动当前结点位置到下一节点
            cur = cur.next
        # 如果整个循环都找不到我们要的内容,就返回 False
        return False
3.3.6 实践 之 增加

增加元素的流程:

​ 新结点 – 找位置 – 改属性

头部
    # 头部增加结点
    def add(self, item):
        # 1.实例化新结点
        # 定义一个存储数据的新结点
        node = BaseNode(item)
        # 2.将新结点加入到链表中
        # 指定新结点的next属性为之前链表的头信息
        node.next = self.__head
        # 3.修改链表的默认属性:规则3(保存链表,只保存头结点地址)
        # 指定当前链表的头结点为新结点
        self.__head = node
尾部
    # 尾部元素增加
    def append(self,item):
        # 1.实例化新结点
        # 定义一个存储数据的新结点
        node = BaseNode(item)
        # 2.找位置,将新结点加入到链表中
        # 2.1 空位置
        # 如果当前链表为空,那么直接指定头信息为新结点即可
        if self.is_empty():
            self.__head = node
        # 2.2 非空位置
        # 如果当前链表不为空
        else:
            # 找到当前链表的头信息,然后找到尾结点
            cur = self.__head
            while cur.next is not None:
                cur = cur.next
            # 退出循环,cur就处于尾结点位置
            # 找到尾结点就退出循环,尾结点的next指向新结点即可
            cur.next = node
关键点:
思路:
    新结点
    找位置 
        空链表:改self.__head属性
        非空链表:找尾结点;
                改为结点的next属性
指定位置
    # 指定位置增加
    def insert(self, pos, item):
        # 流程:新结点---找位置---判断位置---改属性
        # 1.新增加结点
        # 定义一个存储数据的新结点
        node = BaseNode(item)

        # 2.找位置
        # 2.1 头、尾
        # 头部添加内容
        if pos <= 0:
            self.add(item)
        # 在尾部添加元素
        elif pos >= self.length():
            self.append(item)

        # 2.2 中间位置
        # 在中间添加元素
        else:
            # 准备工作:标签、计数器
            # 找到头信息,并且开始设置计数器初始值
          
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【4】数据结构与算法--- 数据结构 进阶 的相关文章

  • 用python编写一个更好看好用的日志库

    相信现在很多做自动化测试 开发 一般用的都是python的logging来记录日志 但是 logging确实不是很好看 只有一个红色的 在控制台中也不好分辨 那能不能自己写一个好看点的呢 我已经写好一个了 需要的可以直接下载安装试试 下面来
  • RabbitMQ图文详解

    重新整理了涉及资料的一些语言描述 排版而使用了自己的描述 对一些地方做了补充说明 比如解释专有名词 类比说明 对比说明 注意事项 提升了总结归纳性 尽可能在每个知识点上都使用一句话 关键词概括 更注重在实际上怎么应用 提出并回答了一些问题
  • C++ 函数重载(overroad) 覆盖(override) 隐藏(hide) 的区别

    C 函数重载 overroad 覆盖 override 隐藏 hide 的区别 原文转自 http blog chinaunix net u 15921 showart 227111 html 成员函数被重载的特征 1 相同的范围 在同一个
  • 2020年数学建模国赛C题题目和解题思路

    2020年数学建模国赛C题题目 在实际中 由于中小微企业规模相对较小 也缺少抵押资产 因此银行通常是依据信贷政策 企业的交易票据信息和上下游企业的影响力 向实力强 供求关系稳定的企业提供贷款 并可以对信誉高 信贷风险小的企业给予利率优惠 银
  • 安全防御——防火墙一

    安全防御 防火墙一 1 什么是防火墙 2 互联网为什么会出现防火墙 3 状态防火墙工作原理 4 防火墙如何处理双通道协议 5 防火墙如何处理nat 6 你知道哪些防火墙 以及防火墙的技术分类 防火墙种类 1 硬件防火墙 2 软件防火墙 个人

随机推荐

  • Qt入门(12)——Qt国际化

    应用的国际化就是使应用成为能被非本国的人使用的过程 有的情况下 国际化很简单 例如 使一个US应用可被Australian或者British用户理解 工作可能少于几个拼写修正 但是使一个US应用可以被Japanese用户使用 或者一个Kor
  • React 在componentDidMount使用 echarts,样式未加载导致Echart自适应div出错

    只需要修改componentDidMount中加入setTimeout gt echarts代码 import React Component from react import Main css 引入 ECharts 主模块 ts ign
  • 创建聚集索引

    一 ibuf init at db start Creates the insert buffer data structure at a database startup and initializes the data structur
  • 深度学习(十九)——FCN, SegNet, DeconvNet, DeepLab, ENet, GCN

    前DL时代的语义分割 续 Grab cut Grab cut是微软剑桥研究院于2004年提出的著名交互式图像语义分割方法 与N cut一样 grab cut同样也是基于图划分 不过grab cut是其改进版本 可以看作迭代式的语义分割算法
  • JDBC操作

    目录 一 实现JDBC步骤 1 注册驱动 1 1导入驱动包 1 1异常处理 2 创建连接 2 1导包 2 2处理异常 3 得到执行sql语句的Statement对象 3 1修改数据操作 3 2删除数据操作 3 3插入数据操作 3 4查询数据
  • vue-quill-editor富文本编辑器的汉化版 及 使用心得

    现在网上上有很多的富文本编辑器 但我个人还是非常喜欢Vue家族的vue quill deitor 虽然说它只支持IE10 好 废话不多说直接上代码 现在是见证奇迹的时刻 在vue中使用quill呢 我们需要npm进行安装 安装命令如下 第一
  • spring security 实现免登陆功能

    spring security 实现免登陆功能大体也是基于COOKIE来实现的 主要配置信息
  • Spring Boot系列之修改内置Tomcat版本

    背景 在 spring boot 出来之前 或者没有使用 spring boot 时 Java EE 开发时如果选择 tomcat servlet 需要自己指定 tomcat 版本 此处没有考虑那种直接把打包的 war 直接扔到本地安装的任
  • oracle云避坑小记

    前言 最近白嫖oracle云 用于评估arm64 架构的服务器 发现 oracle 云系统和国内的主要云服务厂商 如 阿里云或者腾讯云 默认的一些策略有所不同 以下是一些避坑指南 一 避坑小记 基于 oracle linux 8 关闭 fi
  • 《代码大全2》第3章 三思而后行,前期准备

    目录 前言 本章主题 3 1 前期准备的重要性 3 1 1 处于不同阶段强调质量 3 1 2 前期准备对 构建活动 的影响 3 1 3 准备不周全的诱因 3 1 4 我理解的准备周全 纯属个人理解 3 2 辨明你所从事的软件的类型 3 2
  • vue.config.js

    vue config js相关的知识信息 一 vue config js是vue打包管理的配置文件 旨在给开发者们自定义自己的配置 1 该文件的根式统一 为导出配置项选项 例如 在对象里面书写我们自己的配置项目 二 具体的配置内容 项目中常
  • 0x00007FFD33144F99处(位于xx.exe中)引发的异常:Microsoft C++异常 查处方法

    一般这样的异常都是try catch语句有异常抛出 比如新建一个工程 int main try throw 1 catch int excep if excep 1 printf throw 1 n return 0 运行就会在输出的调试信
  • CAD球体密堆积3D插件 随机紧密堆积 球体堆积结构

    插件简介 CAD球体密堆积3D插件可用于生成随机紧密堆积的球体模型 插件可指定投放区域 球体集料的粒径范围 球体数量等信息 插件采用模拟重力作用下球体的碰撞堆积行为 实现球体集料的随机紧密堆积模型 插件通过AutoCAD软件进行绘图 生成的
  • CloudCompare——点云标注

    目录 1 概述 2 软件实现 3 合并点云 1 概述 对给定的点云添加分类标签 2 软件实现 1 裁剪点云 裁剪出需要标注的部分 并选中 2 进行标注 工具栏操作 Edit gt Scalar fields gt Add constant
  • [Python入门系列之十]Python 中的类和对象

    Python 中的类和对象 类和对象是面向对象编程 Object Oriented Programming 的基础 类是一种用户定义的数据类型 它封装了属性和方法 用于描述某一类对象的行为和特征 而对象则是类的实例化 是具体的 实际存在的实
  • Vue+ElementUI电商项目(六)

    订单列表 创建订单列表路由组件并添加路由规则 在view中新建orderManagement文件夹 新建Order vue组件 组件中添加代码如下
  • Pandas基本操作——增加、修改和删除

    数据的增加 按列增加数据 按行增加数据 增加多行数据 修改数据 修改列标题 使用DataFrame对象的columns属性直接赋值 使用DataFrame对象的rename方法修改列标题 修改行标题 使用DataFrame对象的index属
  • vue3:el-table多选框设置默认选中,翻页保留选中状态

    问题 el table多选框设置默认选中 进行翻页 之前选中的数据没有保留选中状态
  • 设计模式-模板方法模式

    一 模板方法模式 定义 定义一个操作中的算法骨架 而将一些步骤延迟到子类 模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤 类型 行为型模式 特点 通过把不变的行为搬移到超类 去除子类中的重复代码来体现它的优势 提供了
  • 【4】数据结构与算法--- 数据结构 进阶

    第 3 章 数据结构 进阶 3 1 线性表 线性表 按照某种线性关系存储下来的表 分类 线性表 说明 顺序表 将数据放在一个连续的存储空间 链表 把数据分散存储 按照某种关系连成串分类 单向链表 双向链表 单向循环链表 3 2 顺序表 3