2.3 移动次数计算和静态链表

news2025/1/18 9:48:09

1. 元素移动次数计算问题

        本问题针对顺序表, 因为链表不需要移动元素, 只需要重新连接指针即可. 

        题型一: 

        计算在某个位置上插入一个新元素会导致多少元素的移动. 

        题型二: 

        计算在每个位置上插入一个元素所导致的平均移动次数. 先计算每个位置上插入的概率, 一般是1/n, 平均移动次数 = \sum_{i}^{n}每个位置上进行插入操作所导致的元素移动次数 * 每个位置上发生插入操作的概率(一般是1/n))

1. 顺序表插入元素, 元素移动次数计算问题

        n个元素的顺序表有n+1个可插入位置. 在任一位置插入元素的概率为 p = 1/(n+1), 用i代表顺序表中所有的位置, i 的取值范围是[0, n], 共n+1个, n即为表中最后一个元素后面的位置. 

        在 i 号位置前进行插入操作, 所导致的元素移动个数是多少呢? 

        方法: 举例归纳. i = 0, 移动n个元素; i = 1, 移动n - 1个元素......

        在 i 位置( i 的取值: 0~n)之前插入元素, 需要移动n - i 个元素. 

        在一个长度为n的线性表中插入一个元素所需要的平均移动次数, 如何计算?

        0位置, 移动n个元素; 1位置, 移动1个元素; ...... n位置, 移动0个元素. 

        总移动次数为: (n+0) * (n+1) / 2; 

        平均移动次数: 1/(n+1) * (n+0) * (n+1) / 2 = n / 2; 

        插入元素平均要移动的元素个数为: n / 2. (理解推导过程, 不要死记, 题目会有小陷阱)

2. 顺序表删除元素, 元素移动次数计算问题

        n个元素的顺序表有n个可删除位置. 

        在任一位置删除元素的概率为: p = 1 / n;

        在 i 位置( i 的取值: 0~n - 1)删除元素, 需要移动n - 1 - i 个元素; 

        0位置, 移动n - 1个元素; 1位置, 移动n - 2个元素; ...... n - 1位置, 移动0个元素. 

        总移动次数为: (n - 1 + 0) * n / 2; 

        平均移动次数: 1/n * (n - 1 + 0) * n / 2 = (n - 1) / 2; (注意一共n项, 而不是n - 1项)

2. 静态链表

        静态分配: 对于某种存储结构, 其存储空间如果是一次性分配, 就叫静态分配

        动态分配: 对于某种存储结构, 其存储空间如果是多次分配的, 就叫动态分配

        因此顺序表的存储空间是静态分配的, 链表的存储空间是动态分配的. 

        静态链表的存储空间是静态分配的, 我们给它分配了一个顺序表, 只不过在这一片顺序存储空间上通过一些方法实现了一种类似于链表的存储结构

#include <iostream>

const int MAX_SIZE = 10;

/// <summary>
/// 静态链表结构体定义
/// </summary>
typedef struct{
    int data;
    int next;   //静态链表的关键, 通过整型下标定位
}SLNode;


int main()
{
    SLNode SLink[MAX_SIZE];
    //定义结点
    SLNode node0;
    node0.data = 0;
    
    SLNode node1;
    node1.data = 1;

    SLNode node2;
    node2.data = 2;

    //结点放入数组
    SLink[0] = node0;
    SLink[2] = node1;
    SLink[4] = node2;

    //连接结点, 连接node0与node2
    SLink[0].next = 4;
    SLink[4].next = -1;

    //插入操作, 在node0与node2之间插入node1
    SLink[2].next = SLink[0].next;
    SLink[0].next = 2;

    int p = 0;
    while (p != -1)
    {
        printf("%d\n", SLink[p]);
        p = SLink[p].next;
    }
}

代码1: 静态链表的基本操作

        next分量存储的是"指针", 它不是严格意义上的指针型变量, 它存储的是指向下一个链表结点的"地址", "地址"也不是严格意义上的地址, 它只是数组下标. 

        在该数组中所存储的静态链表的结点并不是挨着的, 而是散落地分布的, 表结点之间的关系是怎么体现的呢? node0的后继是谁? 是node1, node0的next分量存储的是node1的数组下标, 其他的结点也是同样的情况, 这一点类似于链表, 虽然表的存储单元不挨着, 但我们可以用一个"指针"把它们串起来, 来反映它们之间的逻辑结构. 

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

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

相关文章

vue Router(v3.x) 路由传参的三种方式详解

文章目录 前言一&#xff0c;params 传参&#xff08;显示参数&#xff09;注意&#xff1a; 响应路由参数的变化 二&#xff0c;params 传参&#xff08;不显示参数&#xff09;注意&#xff1a;上述这种利用 params 不显示 url 传参的方式会导致在刷新页面的时候&#xff0c;…

【HCIA】10.VLAN间通信

VLAN间通信的解决方法 使用路由器的物理接口 路由器三层接口作为网关&#xff0c;转发本网段前往其它网段的流量。路由器三层接口无法处理携带VLAN Tag的数据帧&#xff0c;因此交换机上联路由器的接口需配置为Access。路由器的一个物理接口作为一个VLAN的网关&#xff0c;因此…

即视角|出海资本热土——印尼市场洞察(下)

即视角Insight 共享即构新洞察&#xff0c;共建行业新动能——ZEGO即构科技基于音视频技术领域的多年深耕&#xff0c;综合面向各行业的服务经验&#xff0c;在【即视角】栏目发布即构对行业的洞察。 在《即视角&#xff5c;出海资本热土——印尼市场洞察&#xff08;上&…

WIFI鉴权的过程

1.前言 当今手机连接WIFI热点普遍采用WPA2-PSK的方式。本文讨论这个方式的鉴权过程。 2. 鉴权过程 我们称需要连接的一方为station&#xff0c;简称STA。提供WIFI热点的一方为AP。 连接之前, station需要知道AP的名字&#xff08;ssid&#xff09;和密码(PSK)。 定义 &#x…

Openlayers实战:多地图底图切换

在实际的地图项目中,不管是我们看到的百度地图还是高德地图等,都会有地图切换这一项。 在Openlayers实战中,我们用三种地图做demo,分别是谷歌地图。Openstreetmap,stamen地图。 切换的主要原则是设置三个底图层,设定其显示状态,用到了visible这一个属性。 效果图 源代码…

更新补丁导致360随身wifi提示USB设备驱动异常

运行环境&#xff1a;Windows11 更新补丁版本&#xff1a;2023-适用于 Windows 11 的 07 累积更新&#xff0c;适合基于 x64 的系统 (KB5028182) 硬件版本&#xff1a;360随身wifi-3 错误提示&#xff1a;USB设备驱动异常&#xff0c;创建Wifi网络失败 采取措施&#xff1a;更新…

Openlayers实战:加载Bing地图

Bing地图在地图领域有一定的江湖地位,是微软公司的产品。 在Openlayers其内置了Bing地图的方法,可以研究其API。我们的实战中是要其成为一个底图,很简单的就可以加载出来。 效果图 源代码 /* * @Author: 大剑师兰特(xiaozhuanlan),还是大剑师兰特(CSDN) * @此源代码版…

ELK 企业级日志分析系统(四)

ELK 一、部署Kafka集群二、Kafka的命令行操作三、Kafka架构深入四、FilebeatKafkaELK部署 一、部署Kafka集群 1.下载安装包 官方下载地址&#xff1a;http://kafka.apache.org/downloads.html cd /opt wget https://mirrors.tuna.tsinghua.edu.cn/apache/kafka/2.7.1/kafka_2…

Halcon会慢慢被淘汰吗?

作为一个语言模型&#xff0c;我不能提供预测未来的确凿答案。然而&#xff0c;我可以提供一些关于Halcon和机器视觉市场的观察和趋势。 我这里刚好有嵌入式、单片机、plc的资料需要可以私我或在评论区扣个6 Halcon是一款商业机器视觉软件&#xff0c;具有广泛的应用和用户群…

“AI in the Alps“:身体与精神的一场盛宴

作者&#xff1a;Christofer Dutz 得益于 Timecho 的组织和安排&#xff0c;我最近参加了一个精彩绝伦的活动 “AI in the Alps”&#xff0c;并从中收获颇丰。 这次活动是由德国工业界知名博客 “Industrial AI Podcast”&#xff08;http://aipod.de&#xff09;的组织者 Ro…

metersphere数据库SQL断言应用

在使用metersphere的时候&#xff0c;需要查询数据库数据来验证接口是否正常&#xff0c;在查看使用手册时&#xff0c;发现不是很明确&#xff0c;在研究一点时间后&#xff0c;终于明白&#xff0c;在此写下心得。 metersphere使用手册地址&#xff1a;接口测试 - 接口用例操…

【探索AI未来】人工智能技术在软件开发中的应用与革新

自我介绍⛵ &#x1f4e3;我是秋说&#xff0c;研究人工智能、大数据等前沿技术&#xff0c;传递Java、Python等语言知识。 &#x1f649;主页链接&#xff1a;秋说的博客 &#x1f4c6; 学习专栏推荐&#xff1a;人工智能&#xff1a;创新无限、MySQL进阶之路、C刷题集、网络安…

第一个Matplotlib绘图程序

本节学习第一个 Matplotlib 绘图程序&#xff0c;如何使用 Matplotlib 绘制一个简单的折线图。下面绘制一个简单正弦曲线图&#xff0c;它显示了角度与正弦函数值之间的关系。 第一个绘图程序 首先导入 Matplotlib 包中的 Pyplot 模块&#xff0c;并以 as 别名的形式简化引入…

【C#】并行编程实战:同步原语(4)

在第4章中讨论了并行编程的潜在问题&#xff0c;其中之一就是同步开销。当将工作分解为多个工作项并由任务处理时&#xff0c;就需要同步每个线程的结果。线程局部存储和分区局部存储&#xff0c;某种程度上可以解决同步问题。但是&#xff0c;当数据共享时&#xff0c;就需要用…

使用 EMQX 和 eKuiper 进行 MQTT 流处理:快速教程

引言 MQTT 协议是一种专为物联网应用而设计的轻量级消息传输协议。它具有简单、开放、易于实现的特点&#xff0c;是物联网应用的理想选择。MQTT 数据以连续实时的方式进行传输&#xff0c;非常适合由流处理引擎进行处理。 EMQX 是一款大规模分布式物联网 MQTT Broker&#x…

队列--C语言实现数据结构

本期带大家一起用C语言实现队列&#x1f308;&#x1f308;&#x1f308; 文章目录 1、队列的概念2、队列的操作流程3 、队列的结构4、队列的实现4.1 队列的结构设计4.2 队列的初始化4.3 入队4.4 判断队列是否为空4.5 出队4.6 获取队头数据4.7 获取队尾数据4.8 获取队列当中数据…

HTTP1和HTTP2和HTTP3的区别

超文本传输协议是一个简单的请求-响应协议&#xff0c;它通常运行在TCP之上。 目录 HTTP1.1&#xff1a; HTTP2 HTTP3 参考文献 HTTP1.1&#xff1a; 特点&#xff1a; &#xff11;.一条链接只能一次请求一次返回这样子来回。一般的我们浏览器会帮我们一次次请求和收到。…

安卓UI:SearchView

目录 一、SearchView介绍 二、常用方法 &#xff08;一&#xff09;、监听器&#xff1a; (二)、常用方法&#xff1a; (三)、其他常用方法 三、例子&#xff1a; MainActivity2 &#xff1a; ChatListAdapter &#xff1a; item_people_view: activity_main2: 运行结果…

043、TiDB特性_缓存表和分区表

针对于优化器在索引存在时依然使⽤全表扫描的情况下&#xff0c;使⽤缓存表和分区表是提升查询性能的有效⼿段。 缓存表 缓存表是将表的内容完全缓存到 TiDB Server 的内存中表的数据量不⼤,⼏乎不更改读取很频繁缓存控制: ALTER TABLE table_name CACHE|NOCACHE; # 使用tr…

【Ubuntu】安装docker-compose

要在Ubuntu上安装Docker Compose&#xff0c;可以按照以下步骤进行操作&#xff1a; 下载 Docker Compose 二进制文件&#xff1a; sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/loc…