Min Stack(栈高频)

Min Stack

https://leetcode.com/problems/min-stack/description/

题目:设计一个栈,不仅满足栈的基本功能,还能在固定的时间取到栈中的最小元素;

解答:使用两个栈:一个栈stack正常存储元素;

                               另一个栈minStack与stack同步存储、删除元素,但是存储的内容为当前的最小元素;

代码:

class MinStack {
    Stack<Integer> stack;
    Stack<Integer> minStack;
    /** initialize your data structure here. */
    public MinStack() {
        stack = new Stack<Integer>();
        minStack = new Stack<Integer>();
    }
    
    public void push(int x) {
        if (minStack.isEmpty()) {
            minStack.push(x);
        } else {
            minStack.push(Math.min(x, minStack.peek()));
        }
        stack.push(x);
    }
    
    public void pop() {
        stack.pop();
        minStack.pop();
    }
    
    public int top() {
        return stack.peek();
    }
    
    public int getMin() {
        return minStack.peek();
    }
}

``` def project_to_slice_plane(self, points, mode, param): """将三维点投影到切片平面,返回投影后的三维坐标和二维特征坐标""" if mode == 'x': projected = np.copy(points) projected[:, 0] = param # X坐标固定 features = projected[:, [1, 2]] # 取Y,Z作为二维特征 elif mode == 'y': projected = np.copy(points) projected[:, 1] = param # Y坐标固定 features = projected[:, [0, 2]] # 取X,Z作为二维特征 elif mode == 'polar': # 计算极坐标投影参数 ct, st = np.cos(param), np.sin(param) s = points[:, 0] * ct + points[:, 1] * st # 沿极角方向的投影 projected = np.column_stack(( points[:, 0] * ct ** 2 + points[:, 1] * ct * st, points[:, 0] * ct * st + points[:, 1] * st ** 2, points[:, 2] )) features = np.column_stack((s, points[:, 2])) # 取S,Z作为二维特征 return projected, features def fit_curve(self, features, mode): if len(features) < 2: return [] # 改进排序逻辑 sort_idx = np.argsort(features[:, 0]) sorted_features = features[sort_idx] # 改进分割逻辑 if len(sorted_features) < 2: return [] diffs = np.diff(sorted_features[:, 0]) split_index = np.argmax(diffs) + 1 if len(diffs) > 0 else 0 curves = [] for group in [sorted_features[:split_index], sorted_features[split_index:]]: if len(group) < 3: continue # 使用线性插值作为后备方案 try: f = interp1d(group[:, 0], group[:, 1], kind='linear', fill_value='extrapolate') x_new = np.linspace(group[:, 0].min(), group[:, 0].max(), 100) y_new = f(x_new) # 改进滤波参数 window_length = min(21, len(y_new)) if window_length > 3 and window_length % 2 == 1: y_smooth = savgol_filter(y_new, window_length, 2) else: y_smooth = y_new curves.append(np.column_stack((x_new, y_smooth))) except Exception as e: print(f"曲线拟合优化后仍失败: {str(e)}") return curves```Savitzky-Golay滤波
最新发布
03-26
<think>嗯,用户让我介绍一下这段代码中的Savitzky-Golay滤波部分。首先,我需要理解整个代码的结构和功能。看起来这是一个三维点投影到切片平面并进行曲线拟合的方法。特别是`fit_curve`函数里的部分,用户可能想了解Savitzky-Golay滤波在这里的应用。 首先,我需要回忆一下Savitzky-Golay滤波的基本原理。它是一种基于局部多项式最小二乘拟合的平滑方法,能够在保留信号特征的同时减少噪声。常用于数据平滑,尤其是在保持数据趋势和峰值的情况下。 接下来看代码。在`fit_curve`函数中,数据经过排序和分割后,尝试进行插值和滤波。线性插值作为后备方案,之后应用Savitzky-Golay滤波。代码中的相关部分: ```python window_length = min(21, len(y_new)) if window_length > 3 and window_length % 2 == 1: y_smooth = savgol_filter(y_new, window_length, 2) else: y_smooth = y_new ``` 这里,window_length被设置为21和y_new长度中的较小值,且需要是大于3的奇数。多项式阶数是2。用户可能想知道为什么选择这些参数,或者这样的设置有什么作用。 可能的疑问点包括:为什么选择21作为窗口长度的上限?为什么必须是奇数?多项式次数2是否合适?还有,Savitzky-Golay滤波在这里如何帮助改善曲线拟合的结果? 接下来,我需要逐步解释这段代码的处理流程: 1. **数据准备**:对特征点排序和分割,确保数据有序且处理可能的断点。 2. **插值**:使用线性插值生成新的x和y值,得到密集的数据点以便后续平滑。 3. **滤波参数设置**: - `window_length`:限制最大窗口为21,防止数据点过少时窗口太大,同时确保窗口长度为奇数,这样对称窗口更容易处理。 - 多项式阶数2:适合平滑同时保留曲线的曲率特征,过高的阶数可能导致过拟合。 4. **滤波应用**:在满足条件的情况下应用滤波器,否则直接使用原始数据。 需要解释这些参数选择的原因,比如窗口长度为何是奇数,多项式阶数的选择依据,以及这些参数如何影响平滑效果。此外,用户可能想知道这种方法在什么情况下有效,或者可能遇到的问题,比如数据点过少时无法应用滤波。 可能还需要比较Savitzky-Golay与其他滤波方法(如移动平均)的优势,比如保留数据的高频特征,适合需要保持曲线形状的应用场景,比如这里的曲线拟合。 最后,总结这段代码中Savitzky-Golay滤波的作用,即平滑插值后的曲线,减少噪声,同时保持重要的特征,使生成的曲线更符合实际形状,提升可视化或分析的效果。</think>这个代码片段中的Savitzky-Golay滤波应用可以分为以下几个关键步骤: $\boxed{\text{Savitzky-Golay滤波实现步骤}}$ 1. **数据预处理** - 对输入特征点按x轴坐标排序 - 通过线性插值生成密集采样点(100个均匀分布点) - 确保数据满足滤波最小样本要求 2. **动态窗口设置** ```python window_length = min(21, len(y_new)) # 自适应窗口长度 ``` - 窗口长度上限21:平衡平滑效果与计算效率 - 强制为奇数:保证对称窗口结构 - 最小长度限制:`window_length > 3`确保有效滤波 3. **多项式拟合** ```python savgol_filter(y_new, window_length, 2) # 二次多项式拟合 ``` - 选择二次多项式:保留曲线曲率特征 - 局部最小二乘拟合:在每个窗口内进行多项式回归 4. **异常处理机制** - 自动降级策略:当数据不足时直接返回原始数据 - 错误捕获:try-except结构防止程序崩溃 $\boxed{\text{参数选择数学原理}}$ 设窗口包含$2m+1$个点,使用二次多项式拟合: $$ y_i = a_0 + a_1i + a_2i^2 \quad (-m \leq i \leq m) $$ 通过最小二乘法求解系数: $$ \min_{a} \sum_{k=-m}^{m} (y_{j+k} - \sum_{n=0}^2 a_n k^n)^2 $$ $\boxed{\text{在三维可视化中的应用优势}}$ 1. **特征保持性**:比移动平均更好地保留曲率特征 $$ \text{曲率} \kappa = \frac{|y''|}{(1+y'^2)^{3/2}} $$ 2. **噪声抑制**:对投影误差和采样噪声具有鲁棒性 3. **计算效率**:$O(n)$时间复杂度适合实时可视化 $\boxed{\text{改进建议}}$ 1. 窗口长度自适应策略: ```python optimal_length = int(len(y_new)**0.5) | 1 # 平方根取奇 ``` 2. 多项式阶数动态调整: ```python polyorder = min(3, window_length//2 - 1) ``` 3. 边界处理改进: ```python savgol_filter(..., mode='nearest') # 保持边界连续性 ``` 该实现通过数据驱动的参数选择,在保持三维投影特征的同时有效消除噪声,是科学可视化中常用的信号处理方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值