问题:
我有一个练习题,输入是5个整数的元组列表,输出是类似元组的数量。例如,在[(1,2,3,4,5),(2,3,4,5,1),(1,3,2,4,5)]中,输出为2。
你不应该使用字典,但它来自CLRS,所以你的意思是使用哈希表的概念。
到目前为止我尝试了什么:
我在下面写的一些伪代码:
它遍历列表的每个索引,将其与其他索引进行比较并旋转它。
我意识到这是错误的,它会在O(5n ^ 2)中运行,这对于一本关于算法的书来说太高效了。关于我可以做什么来做这个而不使用字典的任何建议?
def leftShift(tup, n):
if not tup or not n:
return tup
n %= len(tup)
return tup[n:] + tup[:n]
i = 0
t = 0
rotateTuple(L):
while i < len(L):
if L[i][i] in L[i+1]:
while t < 4:
.... //This is when I noticed it would fail
输出取决于列表中唯一元组的数量。元组是重复的,如果,当旋转$ n $时,它与列表中的另一个元组相同。
答案 0 :(得分:1)
字典是一个哈希表,所以在不使用字典的情况下使用哈希表的唯一方法就是实现自己的哈希表,我不推荐这样做。
您不必将每个元组与其他元组进行比较。相反,你可以&#34;规范化&#34;通过旋转元组使得最小元素在前面,例如3,2,6,9,4
将轮流至2,6,9,4,3
。如果列表包含多个最小元素,则必须找到最小元素的所有位置,并获得最小的&#34;最小的&#34;按列表的自然顺序,例如1,2,3,4,1
已标准化为1,1,2,3,4
和1,3,1,2
至1,2,1,3
。
def normalize(lst):
min_ = min(lst)
return min(lst[i:] + lst[:i] for i, e in enumerate(lst) if e == min_)
然后,您可以将规范化的元组放入一组&#34;唯一的&#34; O(n)中的元组。
lsts = [(1, 2, 3, 4, 5), (2, 3, 4, 5, 1), (1, 3, 2, 4, 5)]
unique = set(map(normalize, lsts)) # has length 2
但可以说,set
只是一个没有值的dict
。在这种情况下,您可以对规范化元组列表进行排序,并检查O(nlogn + n)中的重复项。
srtd = sorted(map(normalize, lsts))
n = len(lsts) - sum(srtd[i-1] == srtd[i] for i in range(1, len(srtd))) # 2