如何从元组列表中选取符合位置约束的最小化匹配元组
问题描述
给定候选元组列表:
[(1, 49, 47), (11, 44, 6), (24, 16, 31), (11, 29, 47), (41, 14, 24), (40, 29, 1), (32, 49, 44), (41, 14, 14), (24, 21, 49), (19, 24, 6)]
以及参考元组 (7,2,3),需要从列表中选取一个元组,满足该元组对应位置的元素均大于等于参考元组的对应元素(例如 (19, 24, 6) 满足 7 ≤ 19、2 ≤ 24、3 ≤ 6,符合条件)。
要求选取的元组各元素尽可能小,分两种场景讨论:
- 若假设左侧元素权重更高,可按首元素、次元素……的优先级排序选取,该如何操作?
- 如果元素无位置权重,有没有更优的选取方法?
一、左侧元素权重更高的场景
- 先过滤符合条件的元组:遍历候选列表,排除任意位置元素小于参考元组对应位置的元组,得到符合条件的集合:
[(11, 44, 6), (24, 16, 31), (11, 29, 47), (41, 14, 24), (32, 49, 44), (41, 14, 14), (24, 21, 49), (19, 24, 6)] - 按优先级排序选取:按「首元素从小到大,首元素相同则比次元素,次元素相同比末元素」的规则排序,取排序后的第一个元素即可。排序后的结果为:
最终选中的元组是[(11, 29, 47), (11, 44, 6), (19, 24, 6), (24, 16, 31), (24, 21, 49), (32, 49, 44), (41, 14, 14), (41, 14, 24)](11, 29, 47)——它是首元素最小的符合条件元组,且在首元素为11的元组中,次元素是最小的。
二、元素无位置权重的场景
当元素没有位置权重时,「各元素尽可能小」需要用整体量化指标来衡量,常见的两种方法如下:
- 选元素总和最小的元组:计算每个符合条件元组的元素总和,总和越小代表整体元素规模越小。对符合条件的元组计算总和后,
(19,24,6)的总和为49,是所有符合条件元组中最小的。 - 选与参考元组欧几里得距离最近的元组:把元组看作三维空间中的点,计算它与参考元组
(7,2,3)的欧几里得距离(公式:$\sqrt{(x-7)^2 + (y-2)^2 + (z-3)^2}$),距离越近代表元素整体越接近参考元组的“最小要求”。计算后,(19,24,6)的距离约为25.24,是所有符合条件元组中最近的。
这两种方法在本次案例中结果一致,若遇到总和相同但距离不同的情况,可根据实际需求选择:如果在意整体总量,选总和最小;如果在意单个元素不要偏离最小要求过多,选欧几里得距离最近的。
内容的提问来源于stack exchange,提问作者Roshin Raphel
相关产品推荐
相关产品推荐

