热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

求两个有序数组的中位数,要求时间复杂度log(m+n)

求两个有序数组的中位数第一种方法思路:中位数的求法,将两个列表排成一个有序的数组,当排到两个列表长度和的一半的时候即可终止循环找出中位数时间复杂度:O(log(m+n))defmi

求两个有序数组的中位数


第一种方法

思路:中位数的求法,将两个列表排成一个有序的数组,当排到两个列表长度和的一半的时候即可终止循环找出中位数
时间复杂度:O(log(m+n))
def midd_num(l1,l2):
index = 0
l1_index = 0
l2_index = 0
lst_tmp = []
l1_len = len(l1)
l2_len = len(l2)
length = (l1_len+l2_len)//2
if l1_len == l2_len == 0: #当两个列表为空的时候
raise ValueError
if length == 0: #当有一个列表为空的时候
return (l1+l2)[0]
while index <= length:
if l1_index >= l1_len: #即l1列表里面的元素全部加到lst_tmp
lst_tmp = lst_tmp+l2[l2_index:]
break
elif l2_index >= l2_len: #即l2列表里面的元素全部加到lst_tmp
lst_tmp = lst_tmp+l1[l1_index:]
break
elif l1[l1_index] > l2[l2_index]: #l1元素大于l2元素时
lst_tmp.append(l2[l2_index])
l2_index += 1
index += 1
elif l1[l1_index] lst_tmp.append(l1[l1_index])
l1_index+= 1
index += 1
elif l1[l1_index] == l2[l2_index]: #l1元素与l2元素相等时
lst_tmp.append(l1[l1_index])
lst_tmp.append(l2[l2_index])
l1_index+= 1
l2_index+= 1
index += 2
if (l1_len+l2_len) % 2 == 0: #元素个数为偶数
return (lst_tmp[length] +lst_tmp[length-1])/2
else:
return lst_tmp[length]
lst1=[12,25,232,54]
lst2= [1,10]
print(midd_num(lst1, lst2))

第二种方法

思路:通过函数堆模块里面的merge方法返回一个有序的迭代器,循环取值加入到新的列表之中,再判断列表元素奇偶的个数,求出中位数
时间复杂度:O(log(m+n))
import heapq
def mid_num(lst_1, lst_2):
length = (len(lst_1) + len(lst_2))//2
index = 0
lst_tmp = []
for i in heapq.merge(lst_1,lst_2):
if index <= length:
lst_tmp.append(i)
if (index == length):
if (len(lst_1) + len(lst_2))%2:
return lst_tmp[length]
else:
return (lst_tmp[length-1] +lst_tmp[length])/2
index += 1
lst_tmp = lst1 + lst2
return lst_tmp[0]
lst1=[2,3,5]
lst2= []
print(mid_num(lst1, lst2))


推荐阅读
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Go语言实现堆排序的详细教程
    本文主要介绍了Go语言实现堆排序的详细教程,包括大根堆的定义和完全二叉树的概念。通过图解和算法描述,详细介绍了堆排序的实现过程。堆排序是一种效率很高的排序算法,时间复杂度为O(nlgn)。阅读本文大约需要15分钟。 ... [详细]
  • 本文介绍了在Python张量流中使用make_merged_spec()方法合并设备规格对象的方法和语法,以及参数和返回值的说明,并提供了一个示例代码。 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • Parity game(poj1733)题解及思路分析
    本文是对题目"Parity game(poj1733)"的解题思路进行分析。题目要求判断每次给出的区间内1的个数是否和之前的询问相冲突,如果冲突则结束。本文首先介绍了离线算法的思路,然后详细解释了带权并查集的基本操作。同时,本文还对异或运算进行了学习,并给出了具体的操作步骤。最后,本文给出了完整的代码实现,并进行了测试。 ... [详细]
  • JVM:33 如何查看JVM的Full GC日志
    1.示例代码packagecom.webcode;publicclassDemo4{publicstaticvoidmain(String[]args){byte[]arr ... [详细]
  • 【每天三题】day 6.8
    题解参考:环形链表是否有环,求入环节点长度,求形成环的长度合并两个链表合并K个链表publicListNodemergeKLists ... [详细]
  • 初识java关于JDK、JRE、JVM 了解一下 ... [详细]
  • Python中程序员的面试题有哪些
    小编给大家分享一下Python中程序员的面试题有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有 ... [详细]
  • Problemexplanation: ... [详细]
author-avatar
chingueen_306
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有