我有一份要求执行的新操作的列表。只有两种类型,订阅和取消订阅,或 + 和 - 操作。每个动作都有一个id附加的。由于某些原因,在此列表中可能有两个动作有效地相互抵消 - 一个 + 和一个 - 动作,两者使用相同的 id,取消 - 由于每个操作都有些昂贵,我不想执行超出必要的操作。所以我想搜索列表并取消对立面。这听起来是一个足够简单的问题,而且确实如此,但是在给定的列表中可能有大量(300 种)动作。不是一个大问题,但我试图找到一种在效率和清洁度之间达到最佳平衡点的算法,而且我不知道这类问题的具体术语,所以我无法通过四处搜索找到任何实质性的东西。
当然,一些基本的代码可以很好地工作。例如在 Python 中(尽管这个问题并不是专门针对 Python):
def perform_actions(actions_list):
new_subscriptions = []
new_unsubscriptions = []
for action in actions_list:
id_ = action.id_
if isSubscribeType(action): # stand-in for some real check
if id_ in new_unsubscriptions:
new_unsubscriptions.remove(id_)
continue
new_unsubscriptions.append(id_)
else:
if id_ in new_subscriptions:
new_subscriptions.remove(id_)
continue
new_unsubscriptions.append(id_)
for action in new_subscriptions:
# do subscription
for action in new_unsubscriptions:
# do unsubscription
这行得通,但逻辑上有相当多的重复,对于这样一个简单的事情来说,感觉机器太多了。更不用说它的效率很低了。
那么,本质上,我怎样才能使这个功能更加清晰和高效,而不需要在最后执行太多昂贵的操作呢?