如何用Python查找包含指定比例文件大小的最小区间?
解决思路
要找到包含指定比例文件的最小区间[a,b],核心逻辑是先对文件大小排序,再用滑动窗口(双指针)找满足文件数量要求的最短连续区间——排序后,最短区间必然是连续的一段数据,这样区间长度(b-a)才会最小。
具体步骤
- 提取并排序DataFrame中的
file_size列 - 针对每个目标比例(75%/80%/85%/90%),计算需要包含的最少文件数(总文件数×比例,向上取整确保满足要求)
- 用双指针遍历排序后的数组,维护一个窗口:当窗口内文件数量达标时,尝试缩小左边界以找到更短的区间,最终记录最小窗口对应的[a,b]
代码实现
import pandas as pd import numpy as np # 读取CSV文件(替换成你的文件路径) df = pd.read_csv('your_file.csv') # 提取文件大小并排序 sorted_sizes = df['file_size'].sort_values().reset_index(drop=True) total_files = len(sorted_sizes) # 目标比例列表 target_percentages = [0.75, 0.8, 0.85, 0.9] for pct in target_percentages: # 计算需要包含的文件数量,向上取整保证比例达标 required_files = int(np.ceil(total_files * pct)) min_interval_length = float('inf') best_start = None best_end = None # 双指针滑动窗口 left = 0 for right in range(total_files): # 当窗口内文件数满足要求时,尝试缩小左边界 while (right - left + 1) >= required_files: current_length = sorted_sizes[right] - sorted_sizes[left] # 更新最小区间 if current_length < min_interval_length: min_interval_length = current_length best_start = sorted_sizes[left] best_end = sorted_sizes[right] left += 1 # 输出当前比例的结果 print(f"包含{int(pct*100)}%文件的最小区间:[{best_start}, {best_end}],区间长度:{min_interval_length}")
代码说明
- 排序是核心前提:排序后满足数量要求的最短区间一定是连续段,避免了非连续区间的无效计算
- 双指针优化效率:时间复杂度为O(n),比暴力枚举所有区间的O(n²)高效得多
- 向上取整处理:确保区间内文件数至少达到目标比例,不会出现因取整不足导致比例不达标的情况
内容的提问来源于stack exchange,提问作者user21429106
相关产品推荐
相关产品推荐

