Arrays 是否有O(n)算法为正整数数组生成无前缀数组?
对于数组[4,3,5,1,2], 我们称4的前缀为空,小于4的前缀为0; 3的前缀为[4],小于3的前缀为0,因为前缀中没有一个小于3; 5的前缀是[4,3],小于5的前缀是2,因为4和3都小于5; 1的前缀为[4,3,5],小于1的前缀为0,因为前缀中没有一个小于1; 2的前缀为[4,3,5,1],小于2的前缀为1,因为只有1小于2 对于数组[4,3,5,1,2],我们得到了[0,0,2,0,1]的无前缀数组,Arrays 是否有O(n)算法为正整数数组生成无前缀数组?,arrays,algorithm,integer,prefix,Arrays,Algorithm,Integer,Prefix,对于数组[4,3,5,1,2], 我们称4的前缀为空,小于4的前缀为0; 3的前缀为[4],小于3的前缀为0,因为前缀中没有一个小于3; 5的前缀是[4,3],小于5的前缀是2,因为4和3都小于5; 1的前缀为[4,3,5],小于1的前缀为0,因为前缀中没有一个小于1; 2的前缀为[4,3,5,1],小于2的前缀为1,因为只有1小于2 对于数组[4,3,5,1,2],我们得到了[0,0,2,0,1]的无前缀数组, 我们能得到一个O(n)算法来获得无前缀数组吗?我认为这应该可行,但要仔细检查细节。
我们能得到一个O(n)算法来获得无前缀数组吗?我认为这应该可行,但要仔细检查细节。让我们将原始数组中的一个元素称为a[i],将前缀数组中的一个元素称为p[i],其中i是各个数组的第i个元素 假设我们在a[i],我们已经计算了p[i]的值。有三种可能的情况。如果a[i]==a[i+1],那么p[i]==p[i+1]。如果a[i]=p[i]+1。这就留下了a[i]>a[i+1]的情况。在这种情况下,我们知道p[i+1]>=p[i]
在天真的情况下,我们返回前缀并开始计算小于a[i]的项目。然而,我们可以做得更好。首先,认识到p[i]的最小值是0,最大值是i。接下来看看索引j的情况,其中i>j。如果a[i]>=a[j],那么p[i]>=p[j]。如果a[i]
O(n)
中完成,原因与a需要O(n log n)
比较相同。可能的无前缀数组数为n代码>因此您至少需要log2(n!)
位信息来识别正确的无前缀数组log2(n!)
是O(n logn)
,由。假设输入元素始终是固定宽度的整数,您可以使用基于基数排序的技术来实现线性时间:
- L是输入数组
- X是当前过程焦点中L的索引列表
- n是我们目前正在研究的位
- Count是当前位置左侧第n位的0位数
- Y是用于递归的L的子序列的索引列表
- P是一个零初始化数组,它是输出(无前缀数组)
在伪代码中
Def PrefixLess(L, X, n)
if (n == 0)
return;
// setup prefix less for bit n
Count = 0
For I in 1 to |X|
P(I) += Count
If (L(X(I))[n] == 0)
Count++;
// go through subsequence with bit n-1 with bit(n) = 1
Y = []
For I in 1 to |X|
If (L(X(I))[n] == 1)
Y.append(X(I))
PrefixLess(L, Y, n-1)
// go through subsequence on bit n-1 where bit(n) = 0
Y = []
For I in 1 to |X|
If (L(X(I))[n] == 0)
Y.append(X(I))
PrefixLess(L, Y, n-1)
return P
然后执行:
PrefixLess(L, 1..|L|, 32)
我问这个问题是因为我想获得一个O(n)来计算给定数组的反转,即使这个数组是流式的,可能不是。看起来使用无前缀数组可以使我们在O(n)时间内对原始数组进行排序。@n.m.:如何使用无前缀数组在线性时间内对原始数组进行排序?我看到的使用无前缀数组排序的方法是在位置p[I]插入每个元素,但不清楚如何在线性时间内完成。@Nabb:我不确定它是否可以在O(n)中完成,但肯定可以在根本不比较元素的情况下完成。排序是O(nlog(n))*比较。@n.m.-这个参数很有希望,但很棘手,因为它假设1)元素来自一个无限域,2)我们仅有的基本操作是常量分支(比如将一个元素与另一个元素进行比较,如果我们不允许重复,则为2分支,如果允许重复,则为3分支),一次只提供1位信息)。让我们排除bin sort,然后理想情况下你应该把它写下来作为一个答案。在示例a[1]