我正在寻找一种有效的方法来比较数字列表,看他们是否匹配在任何轮换(比较2个圆形列表)。比较旋转的列表,包含重复项
当列表中没有重复项时,选择最小/最大值并在比较工作前旋转两个列表。 但是,当可能有很多重复的大值时,这并不那么简单。
例如,列表[9, 2, 0, 0, 9]
和[0, 0, 9, 9, 2]
是匹配,
其中[9, 0, 2, 0, 9]
不会(因为顺序不同)。
继承人是一个无效函数的例子。
def min_list_rotation(ls):
return min((ls[i:] + ls[:i] for i in range(len(ls))))
# example use
ls_a = [9, 2, 0, 0, 9]
ls_b = [0, 0, 9, 9, 2]
print(min_list_rotation(ls_a) == min_list_rotation(ls_b))
这可以提高对效率...
- 检查排序的列表匹配运行详尽的测试之前。
- 只测试以最小值开始的旋转
(在此之后跳过匹配值)
有效地找到最小值和最后一个最小值(最后的最大值)(在多个匹配次最大值的情况下)。 - 比较转,而无需创建新的列表,每次..
但是它仍然不是一个非常有效的方法,因为它依赖于检查许多可能性。
是否有更有效的方式来执行此比较?
相关问题: Compare rotated lists in python
看看我的回答是:http ://stackoverflow.com/a/26924896/1090562。我相信这是你正在寻找的。 –
问道问题重复的问题(虽然我没有搜索这个主题,只是错过了关键字**循环**)。 – ideasman42