一道有趣的最长子序列问题

news2025/4/14 19:36:28

一道有趣的最长子序列问题 – 潘登同学的金融经济学笔记

文章目录

    • 一道有趣的最长子序列问题 -- 潘登同学的金融经济学笔记
  • 来源
  • 求解
    • 递推公式
    • 算法实现

来源

前几天在刷视频的时候,发现了这样一道题

在这里插入图片描述

所谓子序列就是一个序列 a i 1 , a i 2 , ⋯   , a i n a_{i1},a_{i2},\cdots,a_{in} ai1,ai2,,ain满足 i 1 < i 2 < ⋯ < i n i1< i2 < \cdots < in i1<i2<<in,并不要求 i 1 , i 2 , ⋯   , i n i1,i2,\cdots,in i1,i2,,in是紧邻的,只要求下标单调递增即可;

一个具体例子:

  • 一个序列 1 , 5 , 2 , 4 , 3 1,5,2,4,3 1,5,2,4,3
  • 其中存在单调递增子序列 { 1 , 5 } , { 1 , 2 , 4 } , { 1 , 2 , 3 } , { 2 , 3 } \{1,5\},\{1,2,4\},\{1,2,3\},\{2,3\} {1,5},{1,2,4},{1,2,3},{2,3}
  • 其中存在单调递减子序列 { 5 , 2 } , { 5 , 4 } { 5 , 4 , 3 } \{5,2\},\{5,4\}\{5,4,3\} {5,2},{5,4}{5,4,3}

求解

数学证明的方法,显然我是不太会,还请各位大神赐教; 但是基于置信度的解法,我还是会一点滴;

递推公式

用一个记号 ( x , y ) (x,y) (x,y)表示,从某个数开始,x表示从该数开头的最长递增序列,y表示从该数开始最长的递减序列;

从长度为2的序列说起

  • 显然,要么是递增,要么是递减序列

到长度为3的序列

  • 最后一个数的记号 ( 1 , 1 ) (1,1) (1,1)
  • 倒数第二个数的记号
    • 若:倒数第二个数比最后一个数小, 记为 ( 2 , 1 ) (2,1) (2,1)
    • 若:倒数第二个数比最后一个数大, 记为 ( 1 , 2 ) (1,2) (1,2)
  • 倒数第三个数(第一个数)的记号
    • 在倒数第二个数的记号为 ( 2 , 1 ) (2,1) (2,1)的前提下:
      • 若:倒数第三个数比倒数第二个数小, 记为 ( 3 , 1 ) (3,1) (3,1)
      • 若:倒数第三个数比倒数第二个数大, 记为 ( 2 , 2 ) (2,2) (2,2)
    • 在倒数第二个数的记号为 ( 1 , 2 ) (1,2) (1,2)的前提下:
      • 若:倒数第三个数比倒数第二个数小, 记为 ( 2 , 2 ) (2,2) (2,2)
      • 若:倒数第三个数比倒数第二个数大, 记为 ( 1 , 3 ) (1,3) (1,3)

到长度为4的序列(相当于在长度为3的序列前加一个数)

  • 倒数第三个数记号为 ( 3 , 1 ) (3,1) (3,1)

    • 若倒数第四个数比倒数第三个数小,记为 ( 4 , 1 ) (4,1) (4,1)
    • 若倒数第四个数比倒数第三个数大,记为 ( 3 , 2 ) (3,2) (3,2)
  • 倒数第三个数记号为 ( 2 , 2 ) (2,2) (2,2),因为 ( 2 , 2 ) (2,2) (2,2)有两种情况

    • 第一种情况,在倒数第二个数的记号为 ( 2 , 1 ) (2,1) (2,1)且倒数第三个数比倒数第二个数大
      • 若倒数第四个数比倒数第三个数小且比倒数第二个数小,记为 ( 3 , 2 ) (3,2) (3,2)

      • 若倒数第四个数比倒数第三个数小且比倒数第二个数大,记为 ( 2 , 2 ) (2,2) (2,2)
        在这里插入图片描述

      • 若倒数第四个数比倒数第三个数大,记为 ( 2 , 3 ) (2,3) (2,3)

    • 第二种情况,在倒数第二个数的记号为 ( 1 , 2 ) (1,2) (1,2)且倒数第三个数比倒数第二个数小
      • 若倒数第四个数比倒数第三个数小,记为 ( 3 , 2 ) (3,2) (3,2)
      • 若倒数第四个数比倒数第三个数大且比倒数第二个数小,记为 ( 2 , 2 ) (2,2) (2,2)
      • 若倒数第四个数比倒数第三个数大且比倒数第二个数大,记为 ( 2 , 3 ) (2,3) (2,3)
        在这里插入图片描述
  • 倒数第三个数记号为 ( 1 , 3 ) (1,3) (1,3)

    • 若倒数第四个数比倒数第三个数小,记为 ( 2 , 3 ) (2,3) (2,3)
    • 若倒数第四个数比倒数第三个数大,记为 ( 1 , 4 ) (1,4) (1,4)

当然了,这样的递推能无限进行下去,但是我们还是想从中找到规律,当序列比较短(2,3左右)的时候,我们似乎只需要比较这个数与后一个数的大小关系,一旦序列变长了之后,我们不仅需要比较这个数与下一个数的大小关系,还需要比较这个数与后两个数的大小关系,而且还是有时候需要比较而有时又无需比较,我们需要总结一个递推式;我们将目光放到我们的记号 ( x , y ) (x,y) (x,y)上;

  • 对一个数来说,x表示从该数开头的最长递增序列,y表示从该数开始最长的递减序列;
    • 从这个数往后找,如果这个数小于找到的下一个数,那么自然能将记号x加一,表述为数学语言
      ∀ a i , ∃ a i + k , 若 a i < a i + k x i ≥ x i + k + 1 \forall a_i, \exist a_{i+k},若 a_i < a_{i+k} \\ x_i \geq x_{i+k} + 1 ai,ai+k,ai<ai+kxixi+k+1
    • 所以关键是要找到这个数往后大于该数的数的最大的记号x和这个数往后小于该数的数的最大记号y

那么很自然地,我们就去对这个数与其后的数进行比大小,就能确定该数的记号;那么对每个数都与后面的数比一次,粗略来看算法复杂度就是 O ( n 2 ) O(n^2) O(n2)

算法实现

import random
num = 4
a = [random.randint(0,400) for _ in range(num)]
print('数据len:',len(a))
print(a)

dp_x = [1 for _ in range(num)] # 记号(x,y)
dp_y = [1 for _ in range(num)] # 记号(x,y)
for i in range(num):
    index = num-1 - i # 表示现在这个数的索引
    for j in range(index+1,num):
        # 表示找到了目前为止最大的x
        if a[index] <= a[j] and dp_x[index] <= dp_x[j]:
            dp_x[index] = dp_x[j] + 1
        # 表示找到了目前为止最大的y
        if a[index] >= a[j] and dp_y[index] <= dp_y[j]:
            dp_y[index] = dp_y[j] + 1

print('最长递增子序列的长度为:',max(dp_x))
print('最长递减子序列的长度为:',max(dp_y))

算法非常简单啊, 非常长的序列我们很难验证,但是验证长度为4的序列就足够了,下面是几次运行的结果,能看出与我们的分析是一致的

在这里插入图片描述

接着我们来计算序列为300长度的最长子序列

import random
for _ in range(1000):
    result = []
    num = 300
    a = [random.randint(0,1000) for _ in range(num)]
    # print('数据len:',len(a))
    # print(a)

    dp_x = [1 for _ in range(num)] # 记号(x,y)
    dp_y = [1 for _ in range(num)] # 记号(x,y)
    for i in range(num):
        index = num-1 - i # 表示现在这个数的索引
        for j in range(index+1,num):
            # 表示找到了目前为止最大的x
            if a[index] <= a[j] and dp_x[index] <= dp_x[j]:
                dp_x[index] = dp_x[j] + 1
            # 表示找到了目前为止最大的y
            if a[index] >= a[j] and dp_y[index] <= dp_y[j]:
                dp_y[index] = dp_y[j] + 1

    # print('最长递增子序列的长度为:',max(dp_x))
    # print('最长递减子序列的长度为:',max(dp_y))
    result.append(max(dp_x))
    result.append(max(dp_y))
print('1000次循环中,300长度的序列中最短的最长子序列的长度为:',min(result))

在这里插入图片描述

显然经过1000次的模拟,得到的最短的最长子序列也是27,所以有99.99%的把握认为能找到一个长度为17的单调子序列;

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

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

相关文章

【5w字】SpringBoot源码分析

Spring Boot源码分析 文章目录Spring Boot源码分析启动类分析SpringBootConfigurationEnableAutoConfigurationComponentScanSpringBoot启动流程1. 准备SpringApplication获取当前 web 应用类型设置初始化器设置监听器推导主应用程序类2. Spring Boot的运行创建计时器并启动设置…

开源工具 | ASV-Subtools更新:runtime模块重磅发布

ASV-Subtools更新 - runtime模块重磅发布 - ASV-Subtools是厦门大学智能语音实验室&#xff08;XMUSPEECH&#xff09;于2020年6月推出的一套高效、易于扩展的声纹识别开源工具&#xff0c;该工具是基于Kaldi与Pytorch开发的&#xff0c;充分结合了Kaldi 在语音信号和后端处理…

Fe3+-多巴胺修饰Pluronic的多功能性水凝胶/多巴胺修饰聚丙烯微孔膜表面的研究

下面整理了Fe3-多巴胺修饰Pluronic的多功能性水凝胶/多巴胺修饰聚丙烯微孔膜表面&#xff0c;和小编一起来看&#xff01; Fe3-多巴胺修饰Pluronic多功能性水凝胶 利用对硝基苯基氯酸甲酯作为聚合物Pluronic F127端羟基活化剂,与盐酸多巴胺直接反应制备末端多巴胺修饰的Pluron…

【web课程设计网页规划与设计】基于HTML+CSS+JavaScript火车票网上预订系统网站(4个页面)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

Part4_场景_第52章 场景描述第53章 柏林I:BVG场景第54章 柏林II:CEMDAP-Matsim-Cadyts方案

第52章 场景概述 本书的最后一部分总结了MATSIM场景,如图52.1中的地图所示,并在http://matsim.org/scolutions中列出。 尽管存在基于免费和公共数据的真实场景,如圣地亚哥或科特布斯场景(第84或66章),但由于数据隐私问题,许多场景是不公开的。 然而,了解适用于情景创建…

【STM32备忘录】二、FSMC做LCD控制器,使用stm32cube配置示例

文章目录1. FSMC框图2. 配置示例(1) cube配置(2) 代码参考*疑问1. FSMC框图 如果屏幕接口8位数据宽度访问&#xff0c;地址线FSMC_A[25:0], 一共26位&#xff0c;一个块22667108864Byte64MB&#xff0c;如果屏幕接口16位数据宽度访问&#xff0c;地址线FSMC_A[25:0], 一共26位&…

远程访问数据库,快解析助力疫情防控远程办公

当前&#xff0c;国内疫情形势不容乐观&#xff0c;企业的经营发展再一次面临巨大挑战。虽然“远程办公”早已不是新鲜词&#xff0c;但依然有大量企业没有做好随时切换到远程办公的准备。如遇疫情风险&#xff0c;企业运营很容易陷入瘫痪。 企业一般在内网部署服务器、视频监…

【Java并发入门】01 并发编程Bug的源头

一、根本原因 「CPU、内存、磁盘之间的速度差异」 为了能同时执行多个任务&#xff0c;CPU 发展出时间片轮转、多核等CPU 要从内存中读数据太慢了&#xff0c;所以给自己设置了缓存CPU 读磁盘更慢了&#xff0c;所以可以让该线程阻塞 二、直接原因 缓存导致的可见性问题 C…

函数 function

一、创建函数方法 1.基本语法 函数是引用数据类型 1.1有函数名称的叫具名函数 function 函数名称&#xff08;&#xff09;{ }&#xff1b; 调用函数&#xff1a; 函数名&#xff08;&#xff09;&#xff1b; <script>function fnl( ){var a 2;var b 5…

教你快速搭建微服务环境

目录 一、项目搭建 1.父项目搭建 2.子项目的搭建 二、项目展示 一、项目搭建 1.父项目搭建 步骤&#xff1a; 1 选择maven项目作为父项目&#xff0c;修改为1.8之后直接点击next 2 定义父项目的名称&#xff0c;修改Artifct Coordinates ---> GroupId 然后点击finsh就可…

现代营销杂志现代营销杂志社现代营销编辑部2022年第11期目录

财务金融《现代营销》投稿&#xff1a;cnqikantg126.com 我国中小企业货币资金管理分析 安宁; 1-3 企业财务管理转型路径探讨 秦春; 4-6 互联网背景下电商企业税务风险研究 何秋梅; 7-9 目标成本管理在企业经济管理中的应用分析 艾蕾梅; 10-12 关于我国发展…

CentOS7.9集群部署(配置hosts、集群免密、时间同步)

在上一篇我们介绍了如何在windows下安装虚拟机&#xff0c;在虚拟机上安装CentOS7.9&#xff0c;并且在系统安装完成后配置了固定ip和系统时间。 在食用本篇之前&#xff0c;如果上述操作没有做过&#xff0c;可以先移步 windows安装VMware虚拟机(附带CentOS7部署) 但是在分布式…

文献阅读总结(3)Neural Graph Collaborative Filtering

1、Introduction 左图u1&#xff0c;右图从左图的u1开始展开 图反应的信息&#xff1a; 1、从路径u1->i2->u2,可以反映出u1和u2的相似性&#xff1b; 2、u1和i4之间有两条路径&#xff0c;而u1和i5之间只有一条路径&#xff0c;可以反应u1对i4的兴趣比u1对i5的兴趣更高…

[附源码]Python计算机毕业设计Django-Steam游戏平台系统论文

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

【web网页设计期末课程大作业】基于HTML+CSS+JavaScript仿山东传媒职业学院网站

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

梯度下降原理+梯度消失和爆炸

梯度下降算法&#xff08;Gradient Descent)的原理和实现步骤 - 知乎 (zhihu.com) 梯度&#xff08;gradient&#xff09;到底是个什么东西&#xff1f;物理意义和数学意义分别是什么&#xff1f; - 知乎 (zhihu.com) 目的&#xff1a;最小化损失函数&#xff0c;一个优化的思…

流媒体传输 - RTSP 协议报文分析

在流媒体传输 - RTSP 协议中&#xff0c;我们分析 RTSP 协议交互的整个流程&#xff0c;在本篇文章中&#xff0c;我们对交互中携带的报文进行详细分析。 Request Request Request-Line ; Section 6.1*( general-header ; Section 5…

Qemu-KVM 网络性能优化实践

背景 在做优化之前&#xff0c;腾讯云上使用的母机单队列&#xff0c;性能只有14w pps。 已有的多队列版本&#xff0c;在20w pps左右&#xff0c;不是很理想。 主要问题性能 1 . 单队列成为性能瓶颈 物理主机环境&#xff0c;使用多队列已经有多年。 而在公有云上&#…

深度学习常见损失函数总结+Pytroch实现

文章目录一、引言二、损失函数1.均方差损失&#xff08;Mean Squared Error Loss&#xff09;2.平均绝对误差损失&#xff08;Mean Absolute Error Loss&#xff09;3.交叉熵&#xff08;Cross Entropy Loss&#xff09;&#xff08;1&#xff09;信息论中的熵a.熵b.相对熵&…

苹果系统(MacOS)无法下载Android SDK或下载缓慢解决办法

SDK管理器一般会在安装完Android Studio 的时候就弹出来.如果当时给关闭了或者是后续想找的话,Command, 或者通过菜单打开偏好设置以后 即可找到Android SDK的设置.与Jetbrains家族的产品方式一致.也可以直接在首屏页面上点More Actions 会出来SDK Manager 然后点击EDIT 找到缺…