这个算法可以优化吗?

时间:2011-12-29 15:57:21

标签: algorithm

我有一些对象列表,我希望按照以下函数返回的特定数字按特定顺序迭代它们。以下内容是,根据散列数的模数将每个数字移除到列表大小并生成序列。

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)中对于向量和列表。 (我们要么支付删除费用或要求访问权限)。这可以做得更好吗?

3 个答案:

答案 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洗牌。

相关问题