循环调用函数时跳过已处理索引的技术实现问题——基于Switch on Empty(SOE)算法的隐藏二分图匹配场景
解决SOE算法中跳过已处理索引的问题
首先咱们来拆解下你当前代码的核心问题:
- 你的
code函数每次调用都会从头遍历整个C列表,完全没考虑哪些索引已经被之前的迭代处理过 - 外层循环只是重复调用
code,没有传递任何“已处理索引”的状态,所以每次输出结果都一模一样
要实现“后续迭代跳过已检查/已匹配索引”的需求,关键是要在迭代之间传递已使用的索引状态,并让code函数基于这个状态过滤掉已处理的元素。
修改后的代码实现
C = ["s", "s", "c", "d"] B = ["s", "b", "e", "d"] def code(B, C, used_indices): Mat = {} for req in B: D = [] idx = [] for key, candidate in enumerate(C): # 跳过已经处理过的索引 if key in used_indices: continue if req == candidate: D.append(1) idx.append(key) else: D.append(0) idx.append(key) break # 保留你原本的逻辑:不匹配时终止当前岗位的检查 Mat[req] = [D, idx] return Mat F = {} used_indices = set() # 用集合存已处理索引,查询效率比列表高很多 for iteration in range(len(C)): # 传入已使用的索引,得到当前迭代的匹配结果 F[iteration] = code(B, C, used_indices) # 把当前迭代中处理过的索引加入到已使用集合中 for req_data in F[iteration].values(): used_indices.update(req_data[1]) # 提前终止:所有索引都处理完了就不用继续循环了 if len(used_indices) >= len(C): break print(F)
关键修改点说明
- 新增状态传递机制:用
used_indices集合来记录所有已处理的索引,每次调用code时都把这个集合传进去,让函数自动跳过这些索引 - 调整
code函数逻辑:遍历C元素时先判断索引是否已被处理,是则直接跳过,否则执行你原本的匹配判断逻辑 - 迭代后更新状态:每次迭代完成后,把当前迭代中所有被处理过的索引收集起来,更新到
used_indices中,确保下一次迭代不会重复处理 - 新增提前终止逻辑:当所有索引都被处理完时,直接跳出循环,避免做无用的迭代
效果验证
运行修改后的代码,你会看到后续迭代的结果会自动跳过之前处理过的索引,完全符合你期望的“从下一个未处理索引开始”的需求。如果之后需要调整匹配终止的逻辑(比如不匹配时不立刻终止,继续检查后续未处理元素),只需要修改code函数里的break语句即可。
内容的提问来源于stack exchange,提问作者i202076 Sarah Kiyani
相关产品推荐
相关产品推荐

