Arrays 是否有O(n)算法为正整数数组生成无前缀数组?

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)算法来获得无前缀数组吗?我认为这应该可行,但要仔细检查细节。

对于数组[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)算法来获得无前缀数组吗?

我认为这应该可行,但要仔细检查细节。让我们将原始数组中的一个元素称为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]