最长非递减子序列,Python实现

from time import time
from bisect import bisect
from random import choices, seed
from itertools import combinationsdef func1(seq):# 暴力穷举,从最长的子序列开始查找,大约耗时5小时for n in range(len(seq)-1, 0, -1): # 依次查找长度为len(seq-1),len(sqe-1)-1,....3,2,1for sub in combinations(seq,n): # 枚举出seq中所有的长度为n的序列,元素原来的先后顺序不变if list(sub) == sorted(sub):return sub              # 因为是从最长向最短判断的,产生返回的肯定是长度最长的def func2(seq):# 获取可能的最大长度,缩小后面循环的范围,大约耗时1小时# 比fun1的优点是先判断出最大可能长度m = 0for i in range(len(seq)-1):if seq[i+1]>seq[i]:m = m+1if seq[-1] > seq[-2]:m = m+1for n in range(m+1, 0, -1):for sub in combinations(seq, n):         if list(sub) == sorted(sub):return subdef func3(seq):# 查找最长非递减子序列的长度,直接确定后面组合时的长度,4秒# 动态规划法,查表length = [1]*len(seq)for index1, value1 in enumerate(seq):   # 如果前面有更小的元素,就更新当前元素为终点的子序列长度for index2 in range(index1):if seq[index2] <= value1:   # 存在前面数小于本轮待比较数length[index1] = max(length[index1], length[index2]+1) # 迭代是从0开始的,length最小的序号会最先确定长度m = max(length)for sub in combinations(seq, m):if list(sub) == sorted(sub):return subdef func4(seq):# 查找最长非递减子序列的长度,直接确定后面组合时的长度,3.66秒# 比func3的优点时,先排除掉无效子序列,减少第2步比较数量length = [1]*len(seq)for index1, value1 in enumerate(seq):for index2 in range(index1):if seq[index2] <= value1:length[index1] = max(length[index1], length[index2]+1)m = max(length)for sub in combinations(seq, m):# 测试每个子序列中是否有违反顺序的相邻元素,避免对整个子序列排序for i,v in enumerate(sub[:-1]):if sub[i] > sub[i+1]:breakelse:return subdef func5(seq):# 查找最长非递减子序列的长度,直接确定后面组合时的长度,3.7秒# [7,1,2,5,3,4,0,6,2]# sub = [1,2,3,4,6]# sub = [7]# sub = [1]# sub = [1,2,5]# sub = [1,2,3]# sub = [1,2,3,4]# sub = [0,2,3,4]# sub = [0,2,3,4,6]# sub = [0,2,3,4,6]sub = []m = 0# 循环结束后,m为最大非递减序列的长度,但sub并不是要求的子序列for value in seq:index = bisect(sub, value) # 使用bisect,要求sub必须为有序排列if index == m:sub.append(value)m = m + 1else:sub[index] = valuefor sub in combinations(seq, m):# 测试每个子序列中是否有违反顺序的相邻元素,避免对整个子序列排序for i,v in enumerate(sub[:-1]):if sub[i] > sub[i+1]:breakelse:return subdef func6(seq):# 空间换时间,用来存放当前元素为终点的非递减子序列(暂未理解)sub = [[num] for num in seq]for index1, value1 in enumerate(seq[1:], start=1):for index2 in range(index1):if seq[index2] <= value1:for each in sub[index2]:if isinstance(each, int):each = [each]sub[index1].append(each + [value1])# 只保留以当前元素为终点的最长非递减子序列sub[index1][1:] = [max(sub[index1][1:], default=[], key=len)]sub = list(map(lambda items: max(items[1:],default=[],key=len),sub))return max(sub, key=len)def main():seed(20231106)  # 填充种子,随机生成数据相同data = choices(range(1000), k = 35) # 从0-9999数据中随机取35个数据for func in (func3,func4,func5,func6):start = time()  # 取LNDS前时刻for _ in range(1):r = func(data)  # 类似与函数指针print(time()-start) # 打印取数耗时,单位msprint(r)            # 打印LNDSif __name__ == '__main__':main()

引用位置(不带注释):周末花了10小时把最长非递减子序列算法速度提高了几十亿倍

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

四阶龙格库塔与元胞自动机

龙格库塔法参考&#xff1a; 【精选】四阶龙格库塔算法及matlab代码_四阶龙格库塔法matlab_漫道长歌行的博客-CSDN博客 龙格库塔算法 Runge Kutta Method及其Matlab代码_龙格库塔法matlab_Lzh_023016的博客-CSDN博客 元胞自动机参考&#xff1a; 元胞自动机&#xff1a;森林…

密度聚类与层次聚类

大家好&#xff0c;我是带我去滑雪&#xff01; 密度聚类&#xff08;Density-based Clustering&#xff09;和层次聚类&#xff08;Hierarchical Clustering&#xff09;是两种不同的聚类方法&#xff0c;用于将数据集中的数据点分组成簇。 目录 一、密度聚类 &#xff08;…

面试题:线上MySQL的自增id用尽怎么办?

文章目录 前言表定义自增值idInnoDB系统自增row_idXidInnodb trx_id InnoDB数据可见性的核心思想为什么要加248&#xff1f;为何只读事务不分配trx_id&#xff1f;thread_id 总结 前言 MySQL的自增id都定义了初始值&#xff0c;然后不断加步长。虽然自然数没有上限&#xff0c…

【广州华锐互动】气象卫星监测AR互动教学软件为气象学习带来更多乐趣

由VR制作公司广州华锐互动开发的气象卫星监测AR互动教学软件是一款结合了增强现实(AR)技术与气象监测技术的教育软件。它通过直观、互动的方式&#xff0c;帮助学生更好地理解和掌握气象监测的基本知识和技能。本文将从气象卫星监测AR互动教学软件的应用场景、优势分析、实际意…

怎样选择文件外发控制系统,让数据实现高效安全交换?

制造型企业都非常重视其知识产权&#xff08;IP&#xff09;的安全性&#xff0c;尤其是其最有价值的产品设计数据的安全问题。基于复杂的供应链生态&#xff0c;每天可能要与几十家甚至上百家供应商及合作伙伴进行数据交换。不管是一级还是二级供应商&#xff0c;合作伙伴还是…

pycharm pro v2023.2.4(Python开发)

PyCharm是一种Python集成开发环境&#xff08;IDE&#xff09;&#xff0c;PyCharm提供了强大的功能&#xff0c;包括语法突出显示、智能代码完成、代码检查、自动重构和调试等特性&#xff0c;这些都可以帮助Python开发人员更加高效地编写代码。 PyCharm Pro是PyCharm的高级版…

Ripro-V5 6.4最新版 不限域名无限搭建(授权激活文件)

RiPro主题全新V5版本&#xff0c;是一个优秀且功能强大、易于管理、现代化的WordPress虚拟资源商城主题。支持首页模块化布局和WP原生小工具模块化首页可拖拽设置&#xff0c;让您的网站设计体验更加舒适。同时支持了高级筛选、自带会员生态系统、超全支付接口等众多功能&#…

百度上线“文心一言”付费版本,AI聊天机器人市场竞争加剧

原创 | 文 BFT机器人 百度不愧是我国AI技术领域的先行者&#xff0c;每年致力于人工智能领域取得技术产品的突破和创新。据爆料称&#xff0c;百度的文心一言有突破了新境界&#xff0c;开创了文心大模型4.0会员版本。从线上的to C产品到试水商业化&#xff0c;百度都是争先走…

接口测试工具

接口测试的重要性 接口测试&#xff1a; 直接对后端服务的测试&#xff0c;是服务端性能测试的基础&#xff0c;是测试工程师的必备技能。 接口测试的概念 接口&#xff1a;系统之间数据交互的通道 接口测试&#xff1a;校验接口响应数据与预期数据是否一致 接口信息解析 …

elform-item动态prop

先来看看我这个变态而又复杂的需求&#xff01; 目前自定义表单的前端开发越来越热&#xff0c;开发人员封装好成熟的组件&#xff0c;用户直接拖动生成自己的页面&#xff01;这样的特点就是&#xff1a; 页面中显示的东西&#xff0c;完全是自定义组合的而不是固定的&#…

多门店自助点餐+外卖二合一小程序源码系统 带完整搭建教程

随着餐饮业的快速发展和互联网技术的不断进步&#xff0c;越来越多的餐厅开始采用自助点餐和外卖服务。市场上许多的外卖小程序APP应运而生。下面罗峰来给大家介绍一款多门店自助点餐外卖二合一小程序源码系统。该系统结合了自助点餐和外卖服务的优势&#xff0c;为餐厅提供了一…

如何在在线Excel文档中对数据进行统计

本次我们将用zOffice表格的公式与数据透视表分析样例&#xff08;三个班级的学生成绩&#xff09;。zOffice表格内置了大量和Excel相同的统计公式&#xff0c;可以进行各种常见的统计分析&#xff0c;如平均值、标准差、相关性等。同时&#xff0c;zOffice也有数据透视表功能&a…