我有一些对象列表,我希望按照以下函数返回的特定数字按特定顺序迭代它们。以下内容是,根据散列数的模数将每个数字移除到列表大小并生成序列。
def genSeq(hash,n):
l = range(n)
seq = []
while l:
ind = hash % len(l)
seq.append(l[ind])
del l[ind]
return seq
例如:genSeq(53,5)将返回[3, 1, 4, 2, 0]
我在python中展示算法以便于理解。我应该用c ++编写代码。这种形式的复杂性在O(n ^ 2)中对于向量和列表。 (我们要么支付删除费用或要求访问权限)。这可以做得更好吗?
答案 0 :(得分:1)
skip list会为您O(log n)
提供访问和删除权限。因此,您的总遍历时间为O(n log n)
。
我想有一个线性解决方案,但没有任何事情发生在我身上。
答案 1 :(得分:0)
序列 [范围(len(l))中的哈希%(i + 1)] 可以看作factoradic中的数字。 在排列和事实数字之间存在双射。
在the top answer下的“使用索引序列置换列表”部分中描述了从事实数字到排列的映射。不幸的是,提供的算法是二次的。然而,有一个评论者指向一个数据结构,它将使算法O(nlog(n))。
答案 2 :(得分:-1)
您不应该从矢量中删除,而是与结束交换并减少填充指针。想想Fisher-Yates洗牌。