数据结构----依据出栈顺序判断所需的最少栈空间

2023-05-16

1 问题描述

问题: 若元素 a,b,c,d,e,f,g 顺序进栈,且出栈顺序是 b,d,c,f,e,a,g 则栈的容量至少是_____

答案:3

2 解法描述与分析

2.1 解法描述

1,2,3,4,5,6… 分别对应 a,b,c,d,e,f…, 记序列长度为 L L L, M M M 为当前最大元素,记 S k S_k Sk 为第 k k k 步时栈内元素个数, 栈大小的下限为 S a S_a Sa,记 V k V_k Vk 为第 k k k 个元素的值。求解算法如下

Algorithm 2 依据出栈列表计算所需最少栈空间的算法
step 1: 对出栈序列获得其对应的数列,初始化 M = 0 M=0 M=0 S 0 = 0 S_0 = 0 S0=0, S a = 1 S_a = 1 Sa=1, k = 1 k= 1 k=1.
step 2: 读取第 k k k 个出栈元素的值 V k V_k Vk .
step 3: 如果第 V k V_k Vk 大于 M M M,令 S k = S k − 1 + ( V k − M − 1 ) S_k= S_{k-1} + (V_k - M - 1) Sk=Sk1+(VkM1) , 然后令 M = V k M = V_k M=Vk ; 否则 S k = S k − 1 − 1 S_k = S_{k-1} - 1 Sk=Sk11, M M M 值不变 .
step 4: 比较 S a S_a Sa S k S_k Sk 的大小,如果 S a S_a Sa 小于 S k S_k Sk, 则 S a = S k S_a = S_k Sa=Sk .
step 5: 如果 k k k 小于序列长度 L L L, 则 k = k + 1 k=k+1 k=k+1, 并回到 step 2;否则返回 S a S_a Sa .

对问题有如下的执行过程
step 1: b,d,c,f,e,a,g → \rightarrow 2,4,3,6,5,1,7
执行完 step 1 之后有如下表的执行步,表中已经把 step 2–step 4 合并

k k k V k V_k Vk M M M的关系 M M M S k S_k Sk S a S_a Sa
初始0 S 0 S_0 S0 = 01
12 > M M M2 S 1 S_1 S1 = S 0 S_0 S0 + (2 - 0 - 1 ) = 12
24 > M M M4 S 2 S_2 S2 = S 1 S_1 S1 + (4 - 2 - 1) = 2 + 0 = 23
33 < M M M4 S 3 S_3 S3 = S 2 S_2 S2 - 1 = 13
46 > M M M6 S 4 S_4 S4 = S 3 S_3 S3 + (6 - 4 - 1) = 23
55 < M M M6 S 5 S_5 S5 = S 4 S_4 S4 - 1 = 13
61 < M M M6 S 6 S_6 S6 = S 5 S_5 S5 - 1 = 03
77 > M M M7 S 7 S_7 S7 = S 6 S_6 S6 + (7 - 6 - 1) = 13

最后得栈大小下限为 S a = 3 S_a = 3 Sa=3

2.2 算法分析
2.2.1 算法推导

首先栈的大小的下限 S a ≥ 1 S_a \geq 1 Sa1,栈的大小可以通过确定栈中元素最多时来确定,而栈中元素的个数是动态变化的,这有点像湖,水流流入湖中类似于入栈,水从湖中流出,类似于出栈,而确定湖水最高的水平面则类似于确定栈最多元素时的大小。通过确定入栈元素个数和出栈元素个数,便可以确定栈中元素最多时的个数。当元素进入之后立即弹出,一个栈空间就够了,当不立即弹出时,则需要更多的栈空间。如果第k步时栈的中元素的个数为 S k S_k Sk , 出栈的最大元素为 M M M, 则由 V k + 1 V_{k+1} Vk+1 M M M 的大小关系便可以确定入栈元素的个数:若 V k + 1 > M V_{k+1}>M Vk+1>M 则处于 V k + 1 V_{k+1} Vk+1 M M M 之间的元素一定被会压入栈中, V k + 1 V_{k+1} Vk+1 本身入栈后立即弹出,则此时栈的大小 S k + ( V k + 1 − M − 1 ) S_k + (V_{k+1} - M - 1) Sk+(Vk+1M1),若 V k + 1 < M V_{k+1} < M Vk+1<M 则说明 V k + 1 V_{k+1} Vk+1 是从栈中弹出的且没有入栈操作,此时 S k − 1 S_k - 1 Sk1. 由此可得到如下递推关系

S k + 1 = { S k + ( V k + 1 − M − 1 ) V k + 1 > M S k − 1 V k + 1 < M S_{k+1}=\left\{ \begin{aligned} &S_k + ( V_{k+1} - M - 1) &V_{k+1} > M \\ &S_k - 1 & V_{k+1} < M \end{aligned} \right. Sk+1={Sk+(Vk+1M1)Sk1Vk+1>MVk+1<M

最后可得 S a = M a x ( S 1 , . . . , S L ) + 1 S_a = Max(S_1,..., S_L) + 1 Sa=Max(S1,...,SL)+1, 其中 L L L 为数列的大小,之所以要加1,是立即入栈出栈的元素也需要一个空间。

2.2.2 算法复杂性分析

时间复杂性 O(n), 空间复杂性 O(1).

3 算法的程序实现

3.1 python 实现
def find_stack_needed_size(in_stack_list, out_stack_list):
    item_dict = {v:i+1 for i,v in enumerate(in_stack_list)}
    S_k,S_a = 0,1
    M = 0
    k = 1
    for item in out_stack_list:
        if item_dict[item] > M:
            S_k = S_k + (item_dict[item] - M - 1)
            M = item_dict[item]
            if S_k + 1 > S_a: S_a = S_k + 1
        else:
            S_k = S_k - 1
        print('k={0}  M={1} S_{0}={2} S_a={3}'.format(k, M, S_k, S_a))
        k += 1
    return S_a

测试:

In : find_stack_needed_size(['a','b','c','d','e','f','g'],['b','d','c','f','e','a','g'])
k=1  M=2 S_1=1 S_a=2
k=2  M=4 S_2=2 S_a=3
k=3  M=4 S_3=1 S_a=3
k=4  M=6 S_4=2 S_a=3
k=5  M=6 S_5=1 S_a=3
k=6  M=6 S_6=0 S_a=3
k=7  M=7 S_7=0 S_a=3
Out: 3
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构----依据出栈顺序判断所需的最少栈空间 的相关文章

  • 发生If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config错误的解决方式

    在某个树莓派安装opencv后的使用中 xff0c 我执行程序遇到了这样的错误 The function is not implemented Rebuild the library with Windows GTK 43 2 x or C
  • 树莓派4b 接7寸小显示器无法显示

    之前为树莓派3b 43 购置了一个外接的小显示器 xff0c 使用正常 可是换到最近用的4b上 xff0c 就无法显示了 经过自己尝试 发现是分辨率的设置问题 我看了一下自己买的显示器是 1024 X 768的 于是在 树莓派上进行了分辨率
  • 微软笔试题 回忆(回文方面)

    这道题当年我没有做出来 xff0c 今天微软笔试又碰到了类似的题目 狠心要将这一块吃透 主要还是对动态规划掌握的不够熟练 去年的题目 xff1a 最少射击几次 N个瓶子都有编号 xff0c 每次能射击1个或多个瓶子 xff0c 如果是回文的
  • CLICK模块路由器:代码中加入多线程函数 (报错解决:undefined reference “pthread_mutex_lock”)

    最近想在CLICK中编写读写锁的相关应用 xff0c 所以用到了 lt pthread h gt 下的函数 pthread mutex lock 等 但是当我 make Install 编译时 发生了报错 undefined referen
  • Leetcode 212. Word Search II (tries树 + DFS)

    题目 xff1a Given a 2D board and a list of words from the dictionary find all words in the board Each word must be construc
  • LINUX 安装 AODV协议

    介绍 xff1a AODV协议是无线自组网中主动路由协议的一种 xff0c 也是非常经典的一个协议 xff0c 但是 xff0c 在linux实际环境中却很难找到协议的实现 xff08 十几年前有一个 aodv uu 现在的内核已经不能用了
  • Leetcode 210. Course Schedule II (利用拓扑排序)

    一 题目 There are a total of n courses you have to take labeled from 0 to n 1 Some courses may have prerequisites for examp
  • 2018年,Java程序员转型大数据开发,是不是一个好选择?

    近日网上有一篇关于Java程序员职场生存现状的文章 2017年 Java 程序员 xff0c 风光背后的危机 xff0c 在Java程序员圈子里引起了广泛关注和热议 2017年 xff0c Java 程序员面临更加激烈的竞争 不得不承认 x
  • Leetcode 105 106 重构二叉树

    Leetcode上105 xff0c 106题很相似 xff0c 都是重构二叉树的题 题目 xff1a 105 Given preorder and inorder traversal of a tree construct the bin
  • LeetCode 查并集系列 朋友圈 冗余链接等

    网上有作者已经总结的很好 xff0c 这里转载一下 xff1a https www jianshu com p b81f6db6beaf 什么是并查集 一种数据结构 xff0c 用来描述集合 查 xff08 find xff09 xff1a
  • 记 7.24 阿里巴巴机试题

    题一 题目 xff1a 吃烧饼大赛 有n个盘子 xff0c 每个盘子内有s i 个烧饼 每次选取一个 x xff08 1 x n xff09 xff0c 可以吃到1 xff5e x 号盘子里的一个烧饼 若这1 xff5e x个盘子中有空盘时
  • C++ 智能指针学习

    网上找了一篇很棒的文章 转载自 xff1a https www jianshu com p bf8de014e5c2 C Java python和go等语言中都有垃圾自动回收机制 xff0c 在对象失去引用的时候自动回收 xff0c 而且基
  • 记面试遇到的一个智力题:追击问题

    一个带环的单链表 xff0c 一个快指针 xff08 每次走三步 xff09 xff0c 一个慢指针 xff08 每次走一步 xff09 xff0c 请问这两个指针可能无法相遇吗 xff1f 解 xff1a 假设慢指针入环时 xff0c 快
  • 面试经典题 手撸LRU

    1 C与C 43 43 混搭写法 struct LRUCacheNode int key int value LRUCacheNode prev LRUCacheNode next LRUCacheNode key 0 value 0 pr
  • 腾讯8.23号笔试 刷木板题 DP

    作者 xff1a 夜 xffe3 太美 链接 xff1a https www nowcoder com discuss 486642 type 61 2 来源 xff1a 牛客网 题意 有n xff08 n在5000内 xff09 块木板
  • 京东2018笔试题 神奇数

    题目 东东在一本古籍上看到有一种神奇数 如果能够将一个数的数字分成两组 其中一组数字的和等于另一组数字的和 我们就将这个数称为神奇数 例如242就是一个神奇数 我们能够将这个数的数字分成两组 分别是 2 2 以及 4 而且这两组数的和都是4
  • 绑定mac地址与网卡驱动wlan

    按照之前博客https blog csdn net Lin QC article details 90717218的配置 xff0c 我们可以在树莓派上实现双网卡 xff0c 但是再多次试验中发现 xff0c 每次重启后 xff0c 网卡的
  • 在树莓派上ROS MAVROS的安装使用

    首先 xff0c 我购买的是树莓派3B 43 xff0c 比较新款 xff0c 所以装不了太老的树莓派系统 xff0c 安装的是树莓派官方提供的Raspbian Stretch系统 树莓派系统安装过程较为简单 xff0c 且官网教程详细 x
  • APP引导页UI设计素材模板|轻松留下完美的第一印象

    App首次引导页是当你第一次打开一款应用的时候你看到的引导页 xff0c 它们在你未使用产品之前提前告知产品的主要功能与特点 先来看看 像素精简版引导UI工具包 好的实际案例 xff0c 让初学者更友好 xff01 美丽的用户界面 xff0
  • px4 offboard外部控制仿真

    官网中http dev px4 io en ros mavros offboard html xff0c 只给示例代码 xff0c 却不告诉怎么用 xff0c 实在有点坑 xff0c 还好参照网上的一些博客 xff0c 找到了使用方法 首先

随机推荐

  • POST和GET方法的区别与联系

    错误的一个理论就是 xff0c get是从服务器拿数据 xff0c 而post是给服务器传数据 两者其实都是从服务器端拿数据 xff0c 只是一些细节不同罢了 历史 get和post是HTTP与服务器交互的方式 xff0c 说到方式 xff
  • Dronekit 搭配使用Ardupilot 和 PX4

    Dronekit是一个与无人机飞控搭配使用 xff0c 方便开发者使用代码控制无人机 个人认为它会比搭建ros来控制无人机更容易上手一些 对于Dronekit xff0c PX4被支持的较少 xff0c 不可以进行模式切换 xff0c 而对
  • 堆栈存放什么

    此乃转载别人发表 xff0c 作为知识点保存积累 一 xff1a 概念 1 栈 xff1a 当程序进入一个方法时 xff0c 会为这个方法单独分配一块私属存储空间 xff0c 用于存储这个方法内部的局部变量 xff0c 当这个方法结束时 x
  • 嵌入式实时操作系统ucosii原理及应用(任哲)-- --阅读笔记2

    本文是 嵌入式实时操作系统ucosii原理及应用 xff08 任哲 xff09 一书第三章的阅读笔记 xff0c 知识点多为摘录 xff0c 若希望深入了解 xff0c 请购买该书认真研读 由于一些知识比较零散 xff0c 记起来不大方便
  • 如何做项目总结与汇报

    在我们测试工作过程中 xff0c 由于公司业务发展 xff0c 快速迭代等原因 xff0c 我们遇到的项目以小项目居多 更新界面元素 xff0c 上个活动页 xff0c 优化一下原有的功能等等 xff0c 加上事情繁琐 xff0c 任务多
  • 手机安装linux deploy 安装和配置

    最近在淘了一款二手三星的sw 2014 正好最近正在研究智能家居 就想用它来搭建domoticz来管理 xff0c 虽然手头也有一块吃灰的树莓派3b 但是觉得用树莓派搭建有点浪费 xff0c 索性就用这款手机 为什么不用temux xff1
  • 国家分级保护规范要求解读

    仅就项目建设流程而言 xff0c 涉密信息系统建设使用单位应依据 涉及国家秘密的信息系统分级保护管理办法 国保发 2005 16号 确定系统等级 xff0c 结合本单位业务需求和涉密信息制定安全保密需求 xff0c 依据国家保密标准 BMB
  • PX4 编译分析之Airframe文档生成

    PX4 编译分析之Airframe文档生成 本文假设已经阅读了 PX4 的 1 Makefile分析 2 CMakeLists txt分析 这里要分析的是 make airframe metadata 的指令 在 Makefile 文件中找
  • PX4编译文件 Makefile 剖析

    PX4编译文件 Makefile 剖析 当我们执行 cd Firmware进入PX4源码目录 然后make 的时候 我们会看到一串输出基本如下 第一次编译会有更多的输出 2 Built target df driver framework
  • 如何使用vscode运行和调试c/c++程序

    众所周知 vscode是个万金油 xff0c 而且体型轻巧 xff0c 拓展插件多 xff0c 非常适合初学者编程 那么如何使用vscode进行c c 43 43 程序的运行 xff1f 首先必须确保mingw64正确安装 通过以下链接下载
  • PX4 CMakeLists.txt 文件剖析

    PX4 CMakeLists txt 文件剖析 前面对于 PX4 的 Makefile 已经做了比较详细的分析 见这里 这里进一步对 PX4 的 CMakeLists txt 文件结构进行进一步的分析 1 CMake 简述 CMake 是一
  • pymavlink 源码剖析(一)之XML文件的数据解析

    文章目录 1 引言2 pymavlink 的代码自动生成方法3 XML 文件的数据解析3 1 XML 文件预处理3 2 解析 XML 的数据3 2 1 依据协议版本初始化一些版本特征变量3 2 2 解析 XML 文件3 2 3 对解析后结果
  • MAVLink 协议解析之XML定义篇

    文章目录 1 MAVLink XML 文件的基本结构2 message3 enum 1 MAVLink XML 文件的基本结构 下面的代码块是 mavlink 消息定义的 xml 数据文档 代码块 1 span class token pr
  • pymavlink 源码剖析(二)之生成代码

    文章目录 1 引言2 C 代码生成3 generate one 函数分析4 MAVTemplate5 头文件生成 相关 xff1a pymavlink 源码剖析 一 xff09 之XML文件的数据解析MAVLink 协议解析之原理篇 MAV
  • Windows 10 下基于WSL的开源飞控开发环境配置(Ardupilot/PX4)

    目录 0 环境1 环境概述2 配置 WSL2 1 安装 WSL22 2 安装工具链 3 配置VS Code 0 环境 Windows 10 build version gt 61 18917 1 启动 cmd 后输出的第一行文字便是 Win
  • caffe,caffe2 and pytorch

    1 Difference caffe and caffe2 Caffe2 improves Caffe 1 0 in a series of directions 支持大规模分布式训练移动平台的部署在CPU 和 CUDA 之外的新的硬件类型
  • Windows 平台下基于MinGW和Qt 的OpenCV 之CMake 项目配置

    1 MinGW 编译OpenCV 参考其他教程 2 添加系统环境变量 OpenCV DIR 如果有执行 mingw32 make install xff0c 则为 build 目录下install 文件的完整路径 xff0c 如 D ope
  • ubuntu 上NVIDIA驱动和CUDA9.0 的坑之一二

    1 参考链接 1 NVIDIA 官方CUDA安装文档 http docs nvidia com cuda cuda installation guide linux index html 2 NVIDIA 对XFree86 下安装驱动的说明
  • 欧拉角奇异性产生的原因

    1 欧拉角奇异性的原因 1 1 奇异性的定义 奇异性 xff0c 英文Singularity wiki中的解释为 In mathematics a singularity is in general a point at which a g
  • 数据结构----依据出栈顺序判断所需的最少栈空间

    1 问题描述 问题 若元素 a b c d e f g 顺序进栈 xff0c 且出栈顺序是 b d c f e a g 则栈的容量至少是 答案 xff1a 3 2 解法描述与分析 2 1 解法描述 记 1 2 3 4 5 6 分别对应 a