Algorithm 计算阵列的经验cdf的数值复杂性是多少?

Algorithm 计算阵列的经验cdf的数值复杂性是多少?,algorithm,language-agnostic,Algorithm,Language Agnostic,都在标题里。假设$X$是一个由n个浮点数组成的数组。这是(t的)函数: Fn(t)=(1/n)和{1{Xi给定的表达式是n0/1项的和,显然是O(n) 更新: 如果对Xi进行了预排序,则函数通常是CDFi=CDF(Xi)=i/N,并且计算方式是O(0) 如果Xi未排序,则需要先在O(N.Log(N))中排序,除非变量的范围允许更快的排序,例如计数排序 如果只需要对少量的席代码进行评估,请让 k ,然后可以考虑使用NA求和,如 k.n>代码>可以跳过代码> n.Logo(n)< /> > 更新:

都在标题里。假设$X$是一个由n个浮点数组成的数组。这是(t的)函数:


Fn(t)=(1/n)和{1{Xi给定的表达式是
n
0/1项的和,显然是
O(n)

更新: 如果对
Xi
进行了预排序,则函数通常是
CDFi=CDF(Xi)=i/N
,并且计算方式是
O(0)

如果
Xi
未排序,则需要先在
O(N.Log(N))
中排序,除非变量的范围允许更快的排序,例如计数排序

如果只需要对少量的<代码>席<代码>代码进行评估,请让<代码> k <代码>,然后可以考虑使用NA求和,如<代码> k.n>代码>可以跳过<>代码> n.Logo(n)< /> >

更新:(OP第二次更改)

否则,如有必要,对
Xi
进行排序,如有必要,对
tj
进行排序。然后一次线性传递就足够了。总复杂度将为以下之一:

O(n.Log(n) + m.Log(m))
O(n.Log(n) + m)
O(n + m.Log(m))
O(n + m).
如果
m
Xi
未排序,则使用天真的公式。复杂性
O(m.n)

m>n
时,可能会有更好的选择

更新:最终规格:
Xi
未排序,
Tj
排序,
m

我选择的解决方案如下:

1) 对
Xi
进行排序

2) “合并”已排序的
Xi
Tj
。这意味着,在
X
T
列表中同时进行,保持两个运行索引;确保始终增加导致最短移动的索引;使用
CDF(Tj)=i/n
。这是一个线性过程。(非常接近mergesort中的合并。)

全局复杂性是
O(n.Log(n))
,合并术语
O(n)
被前者吸收

更新:统一抽样

Tj
值等间距时,让
Tj=T0+D.j
使用直方图方法

分配一个
m+1
计数器数组,最初
0
。对于每个
Xi
,计算一个仓位索引为
Floor((Xi-T0)/D)
。将负值钳制为
0
,将大于
m
的值钳制为
m
。增加该存储单元。最后,每个存储单元将告诉您有多少
X
值在
[Tj,Tj+1[
范围内

计算计数器的前缀和。它们现在将告诉您有多少
X
值小于
Xj+1
,以及
CDF(j)=计数器[j]/n

[注意,这是未经检查的草图,细节可能错误。]

总计算将采用
n
bin增量,然后是
m
元素的前缀和,即
O(n)
操作

# Input data
X= [0.125, 6, 3.25, 9, 1.4375, 6, 3.125, 7]
n= len(X)

# Sampling points (1 to 6)
T0= 1
DT= 1
m= 6

# Initialize the counters: O(m)
C= [0] * m

# Accumulate the histogram: O(n)
for x in X:
    i= max(0, int((x - T0) / DT))
    if i < m:
        C[i]+= 1

# Compute the prefix sum: O(m)
S= 0
for i in range(m - 1):
    C[i + 1]+= C[i]

# Reduce: O(m)
for i in range(m):
    C[i]/= float(n)

# Display
print "T=", C
#输入数据
X=[0.125,6,3.25,9,1.4375,6,3.125,7]
n=len(X)
#采样点(1至6)
T0=1
DT=1
m=6
#初始化计数器:O(m)
C=[0]*m
#累积直方图:O(n)
对于x中的x:
i=最大值(0,int((x-T0)/DT))
如果i
T=[0.25,0.25,0.5,0.5,0.5,0.75]


给定的表达式是
N
0/1项之和,显然是
O(N)

更新: 如果对
Xi
进行了预排序,则函数通常是
CDFi=CDF(Xi)=i/N
,并且计算方式是
O(0)

如果
Xi
未排序,则需要先在
O(N.Log(N))
中排序,除非变量的范围允许更快的排序,例如计数排序

如果只需要对少量的<代码>席<代码>代码进行评估,请让<代码> k <代码>,然后可以考虑使用NA求和,如<代码> k.n>代码>可以跳过<>代码> n.Logo(n)< /> >

更新:(OP第二次更改)

否则,如有必要,对
Xi
进行排序,如有必要,对
tj
进行排序。然后一次线性传递就足够了。总复杂度将为以下之一:

O(n.Log(n) + m.Log(m))
O(n.Log(n) + m)
O(n + m.Log(m))
O(n + m).
如果
m
Xi
未排序,则使用天真的公式。复杂性
O(m.n)

m>n
时,可能会有更好的选择

更新:最终规格:
Xi
未排序,
Tj
排序,
m

我选择的解决方案如下:

1) 对
Xi
进行排序

2) “合并”已排序的
Xi
Tj
。这意味着,在
X
T
列表中同时进行,保持两个运行索引;确保始终增加导致最短移动的索引;使用
CDF(Tj)=i/n
。这是一个线性过程。(非常接近mergesort中的合并。)

全局复杂性是
O(n.Log(n))
,合并术语
O(n)
被前者吸收

更新:统一抽样

Tj
值等间距时,让
Tj=T0+D.j
使用直方图方法

分配一个
m+1
计数器数组,最初
0
。对于每个
Xi
,计算一个仓位索引为
Floor((Xi-T0)/D)
。将负值钳制为
0
,将大于
m
的值钳制为
m
。增加该存储单元。最后,每个存储单元将告诉您有多少
X
值在
[Tj,Tj+1[
范围内

计算计数器的前缀和。它们现在将告诉您有多少
X
值小于
Xj+1
,以及
CDF(j)=计数器[j]/n

[注意,这是未经检查的草图,细节可能错误。]

总计算将采用
n
bin增量,然后是
m
元素的前缀和,即
O(n)
操作

# Input data
X= [0.125, 6, 3.25, 9, 1.4375, 6, 3.125, 7]
n= len(X)

# Sampling points (1 to 6)
T0= 1
DT= 1
m= 6

# Initialize the counters: O(m)
C= [0] * m

# Accumulate the histogram: O(n)
for x in X:
    i= max(0, int((x - T0) / DT))
    if i < m:
        C[i]+= 1

# Compute the prefix sum: O(m)
S= 0
for i in range(m - 1):
    C[i + 1]+= C[i]

# Reduce: O(m)
for i in range(m):
    C[i]/= float(n)

# Display
print "T=", C
#输入数据
X=[