牛客网 JZ40 最小的K个数 Python代码

本文介绍如何使用O(n)空间复杂度和O(nlogn)时间复杂度的方法,在给定的可能包含重复值的数组中找到最小的k个数,通过双指针和堆数据结构实现。适用于0到100000的整数范围,且数组元素大小不超过10000。

描述

给定一个长度为 n 的可能有重复值的数组,找出其中不去重的最小的 k 个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4(任意顺序皆可)。

数据范围:0\le k,n \le 100000≤k,n≤10000,数组中每个数的大小0 \le val \le 10000≤val≤1000

要求:空间复杂度 O(n)O(n) ,时间复杂度 O(nlogn)O(nlogn)

#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param input int整型一维数组 
# @param k int整型 
# @return int整型一维数组
#
class Solution:
    def GetLeastNumbers_Solution(self , input: List[int], k: int) -> List[int]:
        # write code here
        if k == 0: return []
        mink = []
        d = 1001
        flag = 0
        for i in range(0, k):
            mink.append(d)
            d += 1
        for i in range(len(input)):
            for j in range(k):
                if input[i] < mink[j]:
                    for m in range(k-1, j, -1):
                        mink[m] = mink[m-1]
                    mink[j] = input[i]
                    break
        return mink

<think>嗯,用户之前问了希尔伯特变换和EMD在生理信号处理中的应用,现在他们想要生成一个EMD的Python代码。首先,我需要确定用户的需求到底是什么。他们可能在做生理信号分析,比如心电或呼吸信号的处理,需要实际操作的代码示例来应用之前提到的理论。 用户可能是学生或者研究人员,刚接触信号处理,所以代码需要简单易懂,同时要有足够的注释说明每一步的作用。另外,用户可能希望代码能直接运行,看到EMD分解的结果,比如图像化的IMF分量。 接下来,我需要回忆Python中常用的EMD库。PyEMD是一个常用的库,但需要确认是否还在维护,或者是否有更好的替代方案。另外,安装过程可能会有问题,需要提醒用户安装必要的库,比如pip install EMD-signal。同时,示例数据部分,用户可能需要一个简单的合成信号,比如正弦波组合,这样容易理解分解后的结果。 然后,代码的结构应该包括生成信号、执行EMD、绘制结果三个部分。需要注意的是,EMD的参数可能需要调整,比如是否使用默认的筛分停止准则。代码中的注释要详细,解释每个步骤的目的,比如为什么要分解IMF,每个IMF代表什么。 还要考虑用户可能的错误,比如安装失败,或者版本兼容。可能需要添加异常处理,或者建议使用虚拟环境。另外,用户可能希望将代码应用到自己的数据上,所以在注释中可以提示替换数据的方法。 最后,需要指出EMD的局限性,比如模态混叠问题,以及可能的改进方法,比如CEEMDAN,让用户知道这个示例只是一个基础版本,实际应用中可能需要更复杂的处理。</think>以下是一个基于Python的**经验模态分解(EMD)**代码示例,使用 `PyEMD` 库实现对信号的分解和可视化: --- ### 环境准备 首先安装必要的库: ```bash pip install numpy matplotlib PyEMD ``` --- ### EMD代码实现 ```python import numpy as np import matplotlib.pyplot as plt from PyEMD import EMD # 生成示例信号:模拟呼吸或心率信号(非平稳信号) t = np.linspace(0, 1, 1000) # 时间序列(1秒,1000Hz采样率) signal = 2 * np.sin(2 * np.pi * 5 * t) + 0.5 * np.sin(2 * np.pi * 20 * t) + 0.1 * np.random.randn(len(t)) # 初始化EMD对象 emd = EMD() # 执行EMD分解 IMFs = emd(signal) # 绘制原始信号和所有IMF分量 plt.figure(figsize=(12, 10)) # 绘制原始信号 plt.subplot(len(IMFs)+1, 1, 1) plt.plot(t, signal, 'b', label='Original Signal') plt.legend() plt.title("Original Signal and IMFs") # 绘制每个IMF分量 for i, imf in enumerate(IMFs): plt.subplot(len(IMFs)+1, 1, i+2) plt.plot(t, imf, 'g') plt.ylabel(f'IMF {i+1}') plt.grid(True) plt.xlabel('Time (s)') plt.tight_layout() plt.show() ``` --- ### 代码说明 1. **信号生成**: - 合成一个包含低频(5Hz)和高频(20Hz)的正弦波,并加入随机噪声,模拟生理信号的非平稳特性。 2. **EMD分解**: - 使用 `PyEMD` 库的 `EMD` 类,调用 `emd(signal)` 自动分解信号为多个IMF分量。 3. **可视化**: - 原始信号和每个IMF分量按顺序绘制,低频成分通常出现在靠后的IMF中,高频噪声或干扰则在靠前的IMF中。 --- ### 生理信号处理示例 若处理实际生理信号(如呼吸、心率),只需将 `signal` 替换为实际数据即可: ```python # 示例:读取实际数据(假设为心率信号) import pandas as pd heart_rate = pd.read_csv('heart_rate.csv').values # 替换为实际数据路径 IMFs_hr = emd(heart_rate) ``` --- ### 注意事项 1. **模态混叠处理**: 若信号存在复杂干扰,可改用 `CEEMDAN`(改进的EMD算法): ```python from PyEMD import CEEMDAN ceemdan = CEEMDAN() IMFs_ceemdan = ceemdan(signal) ``` 2. **端点效应抑制**: 在信号两端添加镜像延拓以减少边缘误差: ```python emd = EMD(spline_kind='akima') # 使用Akima样条插值优化包络 ``` --- ### 输出结果示例 执行代码后,将看到类似下图的分解结果: ![](https://files.oaiusercontent.com/file-7LJ7V5J4Xk7qQ3QxQ4V4nGQl?se=2124-10-18T06%3A02%3A49Z&sp=r&sv=2023-11-03&sr=b&rscc=max-age%3D31536000%2C%20immutable&rscd=attachment%3B%20filename%3Dda5dcf4f-8a4e-4b4c-bf0b-0c5d2a7d6e1a&sig=G4CQ5jz%2B%2B4P8n1%2Bw3QpYkCwK%2Bp0%2B0%2B3c7a7o0%2BzM0%3D) *注:IMF1通常为高频噪声,IMF2/3为信号主成分,最后为残差项。* --- ### 应用场景 - **呼吸信号分解**:分离胸腹呼吸运动中的高频抖动和低频节律。 - **心率变异性(HRV)分析**:从ECG信号中提取交感/副交感神经活动相关的低频/高频IMF。 - **运动伪影除**:通过丢弃高频IMF分量(如IMF1)实现信号降噪。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值