算法-找出N个数组的共同元素

news2024/11/28 4:38:38

一、代码与执行结果

财经新闻是大众了解金融事件的重要渠道,现有N位编辑,分别对K篇新闻进行专业的编辑与排版。需要您找出被这N位编辑共同编辑过的新闻,并根据这些新闻ID升序排列返回一个数组。

在这里插入图片描述

import random

# 查找编辑共同处理的新闻id
def find_common_news(N, K, news_ids):
    # 使用集合的交集操作找出被所有编辑共同编辑过的新闻
    common_news_set = set(news_ids[0]) # 时间 O(k)   # 空间 O(N)
    for i in range(1, N):  # O(N*K)
        common_news_set.intersection_update(news_ids[i]) 
    # 返回升序排列的结果
    return sorted(list(common_news_set)) # O(M * log(M)) 排序算法是 Timsort
    #  O(N * K + M * log(M))

# 生成模拟数据, 作为find_common_news的输入
def generate_random_lists(m=8, N=10, K=60):
    # 第1步:生成这些编辑们处理的新闻中一定重复的新闻id
    lists = random.sample(range(1, K+1), m)
    print('期望输出: ',sorted(lists)) 
    
    # 第2步:生成编辑们分别处理的新闻个数
    lsts2 = [random.randint(1, K) for _ in range(N)]
    # print(lsts2)

    # 第3步:生成这8个编辑各自处理的新闻中可能不重复的新闻id
    result = []
    for num in lsts2:
        rand_nums = [random.randint(1, K) for _ in range(num)]
        result.append(rand_nums)
    # print(result) 

    # 第4步:将可能不重复部分列表与重复列表合并, 得到每个编辑处理的新闻id列表模拟数据
    merged_result = []
    for sublist in result:
        # 注意:可能不重复部分列表 
        merged_list = list(set(sublist + lists))
        random.shuffle(merged_list) # 防止自动排序, 打乱处理
        merged_result.append(merged_list)
    return merged_result # 输出10个编辑分别处理的新闻id


if __name__ == "__main__":
    # 构造数据
    m, N, K = 8, 10, 60 # m为编辑们共同处理的新闻个数
    merged_result = generate_random_lists(m, N, K) # 生成编辑们各自处理的新闻id列表
    print('输入: ', merged_result)
    print("实际输出: ",find_common_news(N, K, merged_result))

输出:

期望输出:  [3, 16, 17, 22, 31, 32, 34, 52]
输入:  [[3, 40, 34, 22, 52, 14, 35, 31, 27, 32, 16, 17], [32, 8, 9, 3, 52, 36, 33, 44, 60, 12, 19, 17, 34, 43, 2, 10, 50, 45, 14, 42, 22, 41, 51, 55, 27, 11, 16, 39, 35, 15, 59, 49, 47, 28, 1, 26, 4, 31], [17, 33, 12, 24, 52, 47, 32, 23, 58, 27, 1, 16, 31, 18, 42, 60, 28, 19, 15, 3, 20, 53, 49, 57, 25, 21, 26, 9, 56, 35, 14, 4, 22, 5, 10, 13, 34, 8, 41], [40, 51, 21, 36, 34, 10, 52, 31, 57, 26, 41, 3, 32, 12, 9, 56, 39, 7, 59, 13, 17, 53, 22, 4, 27, 42, 16, 25], [35, 31, 27, 22, 39, 40, 11, 58, 30, 16, 56, 47, 17, 26, 34, 12, 53, 5, 3, 45, 1, 8, 32, 18, 52, 6], [9, 40, 26, 36, 39, 35, 54, 34, 17, 46, 43, 13, 52, 56, 37, 14, 45, 22, 6, 41, 25, 49, 20, 5, 7, 3, 31, 44, 50, 4, 30, 32, 16, 1], [2, 33, 32, 3, 8, 43, 31, 58, 42, 17, 1, 16, 52, 30, 59, 6, 34, 13, 29, 46, 51, 12, 22], [57, 31, 16, 14, 32, 9, 20, 18, 24, 30, 4, 17, 22, 27, 43, 12, 37, 2, 13, 59, 34, 53, 3, 48, 21, 55, 52, 25], [24, 3, 34, 31, 56, 19, 12, 8, 16, 52, 51, 10, 22, 32, 49, 33, 17, 2, 48, 15, 45, 42, 25, 60, 30, 46, 47, 36, 39, 58, 6, 20, 5, 37, 14], [17, 22, 58, 32, 52, 13, 5, 26, 34, 48, 3, 31, 27, 24, 2, 16]]
实际输出:  [3, 16, 17, 22, 31, 32, 34, 52]

二、函数关键信息

函数名称:find_common_news
参数N: 整数,表示编辑的数量。
参数K: 整数,表示新闻的总数。
news_ids: 一个包含N个列表的列表,每个列表包含一个编辑编辑过的新闻编号。
返回值:一个升序排列的列表,包含所有编辑共同编辑过的新闻编号。

三、程序设计原理

1、初始化一个空集合common_news_set,用于存储所有编辑共同编辑过的新闻编号。
2、将第一个编辑编辑过的新闻编号集合作为初始集合,存储到common_news_set中。
3、遍历第2到第N个编辑的新闻编号集合:
3.1、使用集合的intersection_update方法,将当前编辑的新闻编号集合与common_news_set取交集,并更新common_news_set。
3.2、这样,common_news_set中将保留与当前编辑共同编辑过的新闻编号,即找到所有编辑共同编辑过的新闻编号的交集。
4、将common_news_set转换为列表,并使用Python的sorted函数对列表进行升序排序。
5、返回排序后的列表作为结果。

四、复杂度分析

1、时间复杂度分析
1.1、使用集合的交集操作找出被所有编辑共同编辑过的新闻:遍历每个新闻集合进行交集操作,时间复杂度为O(K),其中K为所有编辑操作的总数。
1.2、排序:对交集结果进行排序,时间复杂度为O(NlogN),其中N为符合条件的新闻数量。
1.3、综合来看,时间复杂度为O(K + NlogN)。
2、空间复杂度分析
common_news_set集合:存储被所有编辑共同编辑过的新闻,最坏情况下需要存储所有新闻,空间复杂度为O(N)。

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

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

相关文章

U盘安装windows11详解教程

准备工作 准备好一个微PE启用U盘,将需要安装的win11镜像拷贝进去。详见教程制作PE启动U盘教程-CSDN博客 详细操作 1。首先我们需要将U盘插入电脑的USB接口。tips:尽量将U盘插到主机后置USB接口,不要将U盘插到前置USB接口或者延长线上&…

微型丝杆与滚珠丝杆性能差异与适用场景!

滚珠丝杆是工具机械和精密机械上最常使用的传动元件,其主要功能是将旋转运动转换成线性运动,或将扭矩转换成轴向反复作用力。同时兼具高精度、可逆性和高效率的特点。而微型丝杆是一种直径为0.5mm以下且线性误差在几微米以内,精度高、传动稳定…

LabVIEW与PLC的区别

LabVIEW和PLC是工业自动化领域中常见的两种控制和测控方案,各自有独特的优点和适用场景。本文将从多角度比较两者,帮助用户在选择控制系统时做出更明智的决策。 技术背景 LabVIEW LabVIEW是由National Instruments公司开发的图形化编程环境&#xff0…

win11家庭版安装docker

在 Windows 11 家庭版上安装 Docker 的详细教程 本文将详细介绍如何在 Windows 11 下安装 Docker。Docker 是一个开源的容器平台,可以轻松创建、部署和管理容器化应用程序。 1. 本电脑系统信息 在安装 Docker 之前,请确保您的 Windows 11 系统满足以下…

UE5中在地形中加入湖、河

系统水资产添加 前提步骤123 完成 前提 使用版本 UE5.0.3,使用插件为UE内置的Water和water Extras. 步骤 1 记得重启 2 增加地形&#xff0c;把<启用编辑图层>勾选 如果地形没有勾选上编辑图层&#xff0c;那么就会导致湖、河等水景象无法融入地形。 如果忘记勾选…

Redis 内存回收

文章目录 1. 过期key处理1.1 惰性删除1.2 周期删除 2. 内存淘汰策略 Redis 中数据过期策略采用定期删除惰性删除策略结合起来&#xff0c;以及采用淘汰策略来兜底。 定期删除策略&#xff1a;Redis 启用一个定时器定时监视所有的 key&#xff0c;判断key是否过期&#xff0c;过…

springcloudalibaba项目注册nacos,在nacos上修改配置项不生效问题

一、背景 之前的项目启动正常,后来发现springcloudalibaba的各版本匹配不正确,于是对项目中的springboot、springcloud、springcloudalibaba版本进行匹配升级,nacos1.4.2匹配的springboot、springcloud、springcloudalibaba版本与我的项目中的版本比较接近,于是我便重新安…

Vue的基础知识:v-model的原理,由:value与@input合写。

原理&#xff1a;v-model本质上是一个语法糖&#xff0c;比如应用在输入框上&#xff0c;就是value属性和input事件的合写。&#xff08;补充说明&#xff1a;语法糖就是语法的简写&#xff09; 作用&#xff1a;提供数据的双向绑定 1.数据变&#xff0c;视图&#xff08;也就…

MySQL 存储过程(一)

本篇主要介绍MySQL存储过程的相关内容 目录 一、什么是存储过程&#xff1f; 二、基本语法 创建存储过程 调用存储过程 查看存储过程 删除存储过程 三、变量 系统变量 用户自定义变量 局部变量 四、存储过程的参数 in out inout 一、什么是存储过程&#xff1f…

【React】classnames 优化类名控制

1. 介绍 classnames是一个简单的JS库&#xff0c;可以非常方便的通过条件动态的控制class类名的显示 ClassNames是一个用于有条件处理classname字符串连接的库 简单来说就是动态地去操作类名&#xff0c;把符合条件的类名粘在一起 现在的问题&#xff1a;字符串的拼接方式不…

uc/OS-III多任务程序

文章目录 一、实验内容二、实验步骤&#xff08;一&#xff09;基于STM32CubeMX建立工程&#xff08;二&#xff09;获取uc/OS-III源码&#xff08;三&#xff09;代码移植 三、修改mai.c文件四、实验现象 一、实验内容 学习嵌入式实时操作系统&#xff08;RTOS&#xff09;,以…

【python】python商业客户流失数据模型训练分析可视化(源码+数据集+课程论文)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

btstack协议栈实战篇--GAP Link Key Management

btstack协议栈---总目录-CSDN博客 目录 1.GAP 链接密钥逻辑 2.蓝牙逻辑 3.主应用程序设置 4.log信息 展示了如何遍历存储在 NVS 中的经典链接密钥&#xff0c;链接密钥是每个设备-设备绑定的。如果蓝牙控制器可以交换&#xff0c;例如在桌面系统上&#xff0c;则每个控制器都需…

Vue2入门(安装Vue、devtools,创建Vue)以及MVVM分层思想

文章目录 1.下载并安装Vue2.使用Vue2.1 创建Vue以及挂载Vue2.2 模板语句的数据来源&#xff1a;data2.3 template配置项详解2.4 Vue实例和容器的关系 3.安装devtools4.MVVM分层思想 1.下载并安装Vue &#xff08;1&#xff09;Vue是一个基于JavaScript&#xff08;JS&#xff…

数仓开发:如何计算投放效果?

背景介绍 业务介绍&#xff1a;用户是通过低价引流进来&#xff0c;然后通过复购购买高价商品&#xff0c;可以多次购买。低价商品和高价商品均可以退款&#xff0c;高价商品由于各种复杂的场景&#xff0c;可能会有多次退款。低价商品如果退款是全退&#xff0c;不存在多次退…

手猫助手Agent技术探索总结

随着LLM的发展&#xff0c;ChatGPT能力不断增强&#xff0c;AI不断有新的概念提出&#xff0c;一种衍生类型的应用AI Agent也借着这股春风开启了一波话题热度&#xff0c;各种初创公司&#xff0c;包括Open AI内部也都在密切关注着AI Agent领域的变化。阿里集团内的AI团队也有很…

容器运行nslookup提示bash: nslookup: command not found【笔记】

在容器中提示bash: nslookup: command not found&#xff0c;表示容器中没有安装nslookup命令。 可以通过以下命令安装nslookup&#xff1a; 对于基于Debian/Ubuntu的容器&#xff0c;使用以下命令&#xff1a; apt-get update apt-get install -y dnsutils对于基于CentOS/R…

【Vue】如何提供访问vuex的数据

文章目录 一、提供数据二、访问Vuex中的数据通过$store访问的语法1&#xff09;模板中使用2&#xff09;组件逻辑中使用3&#xff09;js文件中使用 三、通过辅助函数 - mapState获取 state中的数据 一、提供数据 State提供唯一的公共数据源&#xff0c;所有共享的数据都要统一…

6.7 输入输出流

输入&#xff1a;将数据放到程序&#xff08;内存&#xff09;中 输出&#xff1a;将数据从程序&#xff08;内存&#xff09;放到设备中 C的输入输出分为3种形式&#xff1a; 从键盘屏幕中输入输出&#xff0c;称为标准IO 对于磁盘进行标准输入输出&#xff0c;称为文件IO…

安装ps提示vcruntime140.dll丢失的解决方法,总结5种解决方法

在电脑使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“找不到vcruntime140.dll”。这个问题可能会导致程序无法正常启动或运行&#xff0c;因此了解其原因和解决方法是非常必要的。小编将从多个方面对“找不到vcruntime140.dll”这一问题进行详细…